1. 람다식 (Java Lambda Expression)

함수를 변수처럼 사용하는 것.

파라미터로 함수를 다른 메소드의 인자로 전달할 수 있고, 리턴 값으로 함수를 받을 수도 있다.

객체지향 언어인 자바에 함수형 프로그래밍의 개념을 대입하기 위한 인터페이스.

 

자바 람다식은 함수형에 대해 새로 정의한게 아닌, 기존에 존재하는 인터페이스의 형태를 받아 람다식을 표현하기 때문에 함수형 프로그래밍의 장점을 완전히 가지지는 못하고 있다.

 

순번 

장점 

단점 

 1

 코드가 간결해짐

 람다식 호출을 위해 직접 메소드를 불러야 함

 - 타 함수의 파라미터로 전달할 때에는 문제가 없으나, 람다식을 실행할 때에는 인터페이스에 선언된 메소드를 호출해야 함

 2

 병렬 프로그래밍이 가능해짐

 - 반복 대상을 사용자 코드에서 직접 지정하기 않기 때문에 Collection API가 크게 효과적으로 개선됨

 재귀 람다식의 호출이 까다로움

 - 람다식 안에서는 람다식을 가리키는 변수를 참조할 수 없기 때문에 람다식 안에서 자신을 다시 호출하기가 까다로움.

 (배열 등의 트릭을 사용하여 가능하게 할 수는 있음)

 3

 메소드로 행동 방식을 전달 가능

 - 행동 방식 그 자체를 람다식으로 구현하여 전달함

 클로저가 지원되지 않음

 - 자바에서는 외부 변수에 대해 사실상 final 형태로서만 참조가 가능

 (일반적 함수형 프로그램에서는 클로져 형태로 외부 변수의 라이프 사이클 연장 가능)

 4

 의도의 명확성

 - 코드에서 드러내고자 하는 개발자의 의도를 함축적이면서도 추상화시켜 나타낼 수 있음

 함수 외부의 값을 변경함

 - 자바는 기본적으로 객체 모델로서, 함수 안의 값이 타 객체의 영향을 받는 경우 같은 입력 값에 대해 다른 출력 값을 출력할 수 있어 병렬형 프로그래밍에 불리한 방식을 보임

 

<예제1>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class RamdaMain {
    public static void main(String[] args) {
        
//      기존 익명 클래스 방식
        new Thread(new Runnable() {
            public void run() {
                System.out.println("Annoymous Thread");
            }
        }).start();
        
//      람다 표현식 방식
//      () : 파라미터. run()이라는 익명 클래스의 메소드가 아무런 파라미터도 취하지 않는다는 의미
//      -> : 람다식 시작 전에 나타나는 람다식 시작 토큰
//           뒤에는 한 줄짜리 람다식, 혹은 { } 안에 포함된 여러 람다식이 올 수 있음
//      System.~ : 람다식의 내용 부분. 안에는 () 안의 파라미터 값이 사용될 수 있음
        new Thread(()->System.out.println("Lambda Thread")).start();
    }
}
cs

 

<예제2>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//@FunctionalInterface : 인터페이스 형태를 이용하여 람다 클래스임을 선언할 수 있기 때문에
//                         해당 주석을 달아 람다 인터페이스임을 선언함.
// 람다식은 그 자체를 입력 값으로 사용할 수 있지만,
// 받아서 실제로 런타임 시 사용할 때에는 반드시 인터페이스의 형태를 거쳐야 함
@FunctionalInterface
public interface Test {
    public abstract void run();
}
 
public class TestMain {
    public static Test lambdaTest(Test test) {
        test.run();
        return () -> System.out.println("return lambda");
    }
    
    public static void main(String[] args) {
        lambdaTest(() -> System.out.println("input lambda")).run();
    }
}
cs

 

 

2. 함수형 프로그래밍 (<=> 명령형 프로그래밍)

자바는 객체 지향적인 언어이기 때문에(객체지향 : 각각 독립적일 수 있는 것) 그간 익명 함수(일회성 함수)를 사용하지 못했었는데,

Java8 이상부터 람다 표현식이 사용 가능해짐에 따라 함수를 변수처럼 사용할 수 있는 함수형 프로그래밍을 자바에서도 사용 가능할 수 있게 되었다.

 

보통 함수형 프로그래밍의 대표적인 언어라고 하면 자바스크립트를 들 수 있다.

 

함수형 프로그래밍이 도입된 이후로 자바에서도 절차 지향적인 부분을 조금이라도 구현 가능할 수 있게 되었다.

(일회성으로 순서대로 사용하고 말아버리고, 독립된 객체가 아니기 때문에 절차 지향이라고 표현하였음)

 

람다 표현식은 익명 함수를 만들 때 사용하지만, 자바 언어에서는 함수라는 개념이 존재하지 않기 때문에

추상 메소드만 있는 형태의 인터페이스를 만들어 이 인터페이스의 익명 클래스를 만들면서 메소드 오버라이딩에 람다식을 이용하는 인터페이스를 제공한다.

=> 함수형 인터페이스 ( <예제2> 참고)

'BackEnd > Java' 카테고리의 다른 글

초기화 블록 (Initialization block)  (0) 2017.02.13
AWT vs 스윙 (Swing)  (0) 2017.02.10
자바 기본 정리  (0) 2017.02.09
Java :: startsWith() vs indexOf() vs charAt()  (0) 2016.12.26
Java :: Reflection 리플렉션  (0) 2016.12.18

+ Recent posts