[Java 8] 9. 람다와 지역 변수 & Effectively Final

seony·2023년 4월 24일

java8

목록 보기
9/16

람다가 지역변수를 사용할 때의 제한

람다는 지역 변수를 사용함에 있어 몇 가지 제한이 있다.
1. 지역 변수와 같은 이름의 람다 인자를 사용하거나 람다 바디에서 사용하면 안된다.
2. 지역 변수를 재할당 해서는 안된다.

1-1. 같은 scope에서 지역 변수와 람다의 인자 이름이 같으면 안된다.

  • i로 이름이 같다.
        int i = 0;

        Consumer<Integer> c1 = (i) -> {
            System.out.println("Value is : " + i);
        };

1-2. 같은 이름의 변수를 람다 바디 안에서 선언하면 안된다.

        int i = 0;

        Consumer<Integer> c1 = (i1) -> {
            int i = 2;
            System.out.println("Value is : " + i1);
        };

2. 로컬 변수일 경우 값을 재할당하면 안된다.

        int value = 4; // local variable

        Consumer<Integer> c1 = (i) -> {
            value += i;
            System.out.println(value);
        };

        c1.accept(4);

⭐️ 인스턴스 변수일 경우 할당 가능!

public class LambdaVariable2 {

    static int value = 4;
    
    public static void main(String[] args) {
//        int value = 4; // local variable

        Consumer<Integer> c1 = (i) -> {
            value += i;
            System.out.println(value);
        };

        c1.accept(4);
    }
}

Effectively Final이란?

  • 마치 final로 선언되지 않았지만 final인 것처럼 사용하는 것이다.
    • 즉, 변수가 한 번만 할당되어 그 이후에 수정되지 않는 것을 의미한다.
  • Java8 이전 버전에서는 반드시 익명 클래스 안에서 사용되는 변수는 반드시 final로 선언되었어야 한다.
int x = 10;
x = 20; // x가 수정되었습니다.
Runnable r = () -> System.out.println(x); // 컴파일 오류
  • 이 경우, x가 두 번 할당되었기 때문에 effectively final이 아니다. 따라서 람다 내부에서 참조할 수 없으며 컴파일 오류가 발생한다.

  • effectively final은 람다 표현식을 이용한 프로그래밍에서, 변수의 변경을 방지하고 코드를 더 안정적이고 예측 가능하게 만들기 위한 제약 조건이다.

Effectivley Final의 장점

  • 동시성에 대해 고려하기 쉬워진다.

0개의 댓글