반응형

람다 표현식(Lambda Expressions)

- 함수형 인터페이스의 인스턴스를 만드는 방법으로 쓰일 수 있다.

- 코드를 줄일 수 있다.

- 매소드 매개변수, 리턴 타입, 변수로 만들어 사용할 수도 있다.

 

인자 리스트

- parameter(인자)가 없을 때: ()

- parameter(인자)가 한개일 때: (one) 또는 one

- parameter(인자)가 여러개 일 때: (one, two)

- parameter(인자)의 타입은 생략 가능, 컴파일러가 추론(infer)하지만 명시할 수도 있다. (Integer one, Integer two)

 

바디

- 화상표 오른쪽에 함수 본문을 정의한다.

- 여러 줄인 경우에 { }를 사용해서 묶는다.

- 한 줄인 경우에 생략 가능, return도 생략 가능.

 

변수 캡처 (Variable Capture)

- 로컬 변수 캡처

   final이거나 effective final 인 경우에만 참조할 수 있다.

   그렇지 않을 경우 concurrency 문제가 생길 수 있어서 컴파일가 방지한다.

- effective final

   이것도 역시 자바 8부터 지원하는 기능으로 “사실상" final인 변수.

    final 키워드 사용하지 않은 변수를 익명 클래스 구현체 또는 람다에서 참조할 수 있다.

- 익명 클래스 구현체와 달리 ‘쉐도윙’하지 않는다. 

   익명 클래스는 새로 스콥을 만들지만, 람다는 람다를 감싸고 있는 스콥과 같다.

 

○ 쉐도윙 현상

하나의 변수가 다른 변수에 의해 가려져서가리게 되는 변수에 접근할 수 없게 되는 현상

 

(parameter) -> { expression }

위 형식에서 parameter(인자)는 람다 표현식이 사용할 매개변수를 나타내며, expression은 람다 표현식의 몸체(body)에 해당하는 식(expression)이다.

 

예를 들어, 다음과 같은 람다 표현식은 매개변수를 두 개 받아서 합을 구하는 기능을 수행한다.

 

(int x, int y) -> x + y

위 람다 표현식은 매개변수로 int 타입의 x와 y를 받아서 두 수의 합을 구하는 expression으로 이루어져 있다.

 

 

앞서 설명한 Function<T, R> 인터페이스를 구현하는 람다 표현식은 다음과 같이 작성할 수 있다.

 

Function<Integer, String> func = (Integer i) -> "숫자 " + i.toString();

위 코드에서는 Function<Integer, String> 인터페이스를 구현하는 func 변수를 선언하고, 람다 표현식을 사용하여 apply() 메서드를 구현하였다. 구현된 람다 표현식은 함수형 인터페이스를 구현하는 객체로 사용된다.

반응형

+ Recent posts