JAVA/JAVA8
람다 제약사항
최-코드
2024. 8. 14. 10:49
- 람다식의 매개변수 또는 본문에서 같은 이름의 로컬 변수를 사용할 수 없다.
public class LambdaVariableExample1 {
public static void main(String[] args) {
int i = 0; // 로컬 변수 선언
// Consumer 인터페이스 사용 예제
Consumer<Integer> c1 = i1 -> System.out.println(i1);
// Consumer<Integer> c2 = i -> System.out.println(i); // 오류 발생
c1.accept(5); // 정상 실행
}
}
- 람다식에서 로컬 변수의 값을 변경할 수 없다.
public class LambdaVariableExample2 {
public static void main(String[] args) {
int value = 4; // 로컬 변수 선언
Consumer<Integer> c1 = i -> {
// System.out.println(value++); // 오류 발생: 값을 변경할 수 없음
System.out.println(value + i);
};
// value = 6;
c1.accept(4); // 정상 실행, 출력 결과는 8
}
}
- 예외적으로 스태틱 변수에 대해서는 제약사항이 없다.
public class LambdaVariableExample3 {
private static int value = 4; // 인스턴스 변수
public static void main(String[] args) {
Consumer<Integer> c1 = i -> {
value++; // 값 변경 가능
System.out.println(value + i);
};
c1.accept(5); // 출력 결과는 10
}
}
- 로컬 변수에 대해서 익명 클래스를 선언할 때는 final로 취급해야 한다. 자바8 이후 effectively final이 도입되어 final 키워드 없이 final 효과를 낼 수 있다.
- effectively final의 장점
- 멀티스레드 환경에서 동시성 문제를 피할 수 있다.
- 함수형 프로그래밍은 변수를 한 번 초기화하면 변경하지 않는 방식이기 때문에 이 개념은 함수형 프로그래밍을 장려한다.