람다 표현식(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() 메서드를 구현하였다. 구현된 람다 표현식은 함수형 인터페이스를 구현하는 객체로 사용된다.
'Java' 카테고리의 다른 글
[자바] Optional이란? (0) | 2023.06.29 |
---|---|
[자바] 스트림(stream)이란? (0) | 2023.03.25 |
[자바] 기본 메소드(Default Method)와 스태틱 메소드(Static Method) (0) | 2023.03.25 |
[자바] 메소드 레퍼런스 (0) | 2023.03.25 |
[자바] 함수형 인터페이스 (0) | 2023.03.21 |