주니어 개발자 성장기

Effective final 본문

Java/기초

Effective final

Junpyo Lee 2023. 8. 21. 15:11

개요

Effective final 이란 사실상 final을 의미한다. 자바 8부터 추가된 기능이다. 우리가 어떤 변수(레퍼런스 타입이든 원시 타입이든)의 선언이나 매개변수 앞에 final 키워드를 사용하면 변경이 불가능하다. 사실상 final은 변수가 선언된 뒤에 변경되지 않는다면 final 변수로 취급하는 것이다.

 

그렇다면 과연 이 Effective final이라는 기능이 왜 필요할까?

 

 

로컬 클래스, 익명 클래스, 람다

로컬 클래스, 익명 클래스와 람다는 외부에서 변수를 참조하기 위해서는 반드시 final 변수여야 컴파일 에러가 발생하지 않는다.

public void method() {
	final int number = 10;

	// 로컬 클래스
	class Local {
		public void something() {
			System.out.println(number);
		}
	}

	// 익명 클래스
	IntConsumer anonymous = new IntConsumer() {
		@Override
		public void accept(int i) {
			System.out.println(number);
		}
	};

	// 람다
	IntConsumer lambda = (a) -> System.out.println(a + number);

}

 

하지만 자바 8부터는 위 코드에서 final int number에서 final 키워드를 제거하더라도 이후에 number 변수가 변경되지 않기 때문에 effective final로 취급되어 아래와 같이 정상적으로 컴파일된다.

 

 

 

반면, 아래와 같이 final 키워드를 사용하지 않고 number를 변경해 주게 되면 effective final로 취급되지 않기 때문에 컴파일 에러가 발생하게 된다.

선언이후 수정이 없는 변수는 자바 컴파일러가 사실상 final로 취급한다. 정상 컴파일되는 모습

 

로컬 클래스, 익명 클래스, 람다에서 final 변수를 요구하는 이유는 간단하다. 외부 스코프에서 참조하는 변수가 변경이 가능할 경우 멀티 쓰레드 환경에서 코드의 결과를 예측하기가 어려워지기 때문이다.

변수가 수정된다면 effective final로 취급되지 않는다.

 

 

 

정리

결국 final 키워드를 사용하지 않아도, 변수가 선언된 후 변경이 없다면 effective final이란 기능으로 인해서 컴파일러가 final 변수로 여기게 되며 로컬 클래스, 익명 클래스, 람다에서 참조가 가능해진다. 덕분에 프로그래머가 람다 등을 사용할 때, 번거롭게 매번 final을 쳐야 하는 수고로움을 덜 수 있다.

'Java > 기초' 카테고리의 다른 글

[짤막 자바 상식] Stack vs Deque - 코테에서 뭘 쓰지?  (0) 2024.05.05
중첩 클래스 참고자료  (0) 2023.11.11
Arrays.stream  (0) 2023.08.10