본문 바로가기
자바

[자바8] Effectively final

by jeonghaemin 2021. 7. 7.
728x90

Effectively final

자바 8에서 도입된 Effectively final이란 final 키워드가 붙지 않은 변수가 사실상 final인 경우를 말한다. 즉, final 변수가 아님에도 불구하고 값이 변경되지 않는다면 그 변수는 Effective final이라고 할 수 있다.

자바8 이전에는 내부 클래스, 익명 클래스에서 외부 변수를 참조할 시 그 변수가 반드시 final 변수여야 했다.

자바8의 Effectively final 도입으로 final 키워드가 붙지 않은 변수라도 값이 어디에서도 변경되지 않는다면 final 변수처럼 내부 클래스, 익명 클래스, 람다 표현식에서 참조할 수 있게 되었다.

public class Main {

    public void method() {
        //final 키워드가 없음에도 불구하고 아래의 내부 클래스, 익명 클래스, 람다 표현식에서 참조 가능 -> Effectively final
        int num = 10;

        //내부 클래스
        class InnerClass {
            void innerMethod() {
                System.out.println(num);
            }
        }

        //익명 클래스
        Consumer<Integer> consumer = new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) {
                System.out.println(num);
            }
        };

        //람다 표현식
        IntFunction<Integer> plus = (i) -> num + i;
        plus.apply(10);
    }
}

참고

백기선님의 더 자바, Java 8

댓글