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의 장점
    • 멀티스레드 환경에서 동시성 문제를 피할 수 있다. 
    • 함수형 프로그래밍은 변수를 한 번 초기화하면 변경하지 않는 방식이기 때문에 이 개념은 함수형 프로그래밍을 장려한다.