람다 표현식이란? (lambda)
(인자 리스트) -> { 함수 몸체 }
인자 리스트
일반적인 함수 표현과 비슷하게 () 안에 인수 목록을 작성한다.
- 인자 없을 때 : ()
- 인자 한 개 일 때 : (a) 또는 a --> 특수하게 인자가 한 개 일 때에는 괄호 생략이 가능하다.
- 인자 여러개일 때 : (a, b)
컴파일러가 추론하기 때문에 인자의 타입은 생략 가능하나, 원하면 명시할 수 있다. (Integer a, String b)
바디
화살표 오른 쪽에 함수 본문을 정의하고, { } 를 사용해서 묶는다. 한 줄인 경우에는 { } 를 생략할 수 있다.
return도 생략 가능하다.
변수 캡처 (Variable Capture)
int baseNum = 10;
//로컬 클래스
class LocalClass {
void printBaseNum() {
int baseNum = 11;
System.out.println(baseNum); //쉐도잉이 발생하여 11이 출력된다.
}
}
//익명 클래스
Consumer<Integer> intConsumer = new Consumer<Integer>() {
@Override
public void accept(Integer int) {
int baseNum = 12;
System.out.println(baseNum); //쉐도잉이 발생하여 12가 출력된다.
}
}
//람다
IntConsumer printInt = (i) -> {
//int baseNum = 13; //정의가 불가능하다.
//람다는 새로운 scope가 아니기 때문에 동일한 이름의 변수는 선언할 수 없다.
System.out.println(i + baseNum); //lambda scope에서 local variable 참조
}
printInt.accept(10);
- effective final
- 자바 8부터 지원하는 기능으로 "사실상" final인 변수
- final이라는 키워드는 없지만 소스에 값을 바꾸는 코드가 없는 사실상 final인 경우를 effective final이라 한다.
- final 키워드 사용하지 않은 변수를 로컬 클래스, 익명 클래스 구현체, 람다에서 모두 참조할 수 있다.
- 로컬 변수 캡쳐
- final이거나 effective final인 경우에만 참조할 수 있다.
- 그렇지 않을 경우, concurrency 문제가 생길 수 있어 컴파일러가 방지한다.
- 로컬 클래스나 익명 클래스 구현체와 달리 람다는 '쉐도잉' 하지 않는다.
- 익명 클래스는 새로 scope를 만들지만, 람다는 람다를 감싸고 있는 scope와 같다.
이 포스팅은 더 자바, Java 8 강의를 수강하며 작성되었습니다.
더 자바, Java 8 강의 | 백기선 - 인프런
백기선 | 자바 8에 추가된 기능들은 자바가 제공하는 API는 물론이고 스프링 같은 제 3의 라이브러리 및 프레임워크에서도 널리 사용되고 있습니다. 이 시대의 자바 개발자라면 반드시 알아야 합
www.inflearn.com
'Java' 카테고리의 다른 글
[Java8] 인터페이스 메소드 (2) | 2024.07.22 |
---|---|
[Java8] 메소드 참조 (Method Reference) (0) | 2024.07.19 |
[Java8] 자바에서 제공하는 함수형 인터페이스 (1) | 2024.07.14 |
[Java8] 함수형 인터페이스 (0) | 2024.07.13 |
[Java8] Java8 소개 (0) | 2024.07.13 |