This article is more than ten years old and potentially contains out-dated information.
작성한지 10년 이상 지난 게시물입니다. 최신의 정보와 맞지 않는 내용을 포함할 수도 있습니다.

서론

Java 에서는 final 키워드가 붙은 변수가 어떻게 처리될까요. 이것에 관련된 간단한 실험을 한가지 해보겠습니다.

Justin 의 identification

Justin 의 나이, 신원, 지역을 저장해놓은 클래스입니다.

import java.util.Locale;

public class Justin {
	public final static int age = 18;
	public final static String identification = "I'm Justin";
	public final static Locale locale = new Locale("en-US");
}

Justin 클래스의 각 상수들을 출력하는 클래스입니다.

public class Test {
	public static void main(String[] args) {
		System.out.println(Justin.age);
		System.out.println(Justin.identification);
		System.out.println(Justin.locale);
	}
}

실행 결과는 당연히

18
I'm Justin
en-us

입니다. 자, 그럼 이제 Justin 클래스를 약간 수정해보겠습니다.

public class Justin {
	public final static int age = 21;
	public final static String identification = "I'm not Justin";
	public final static Locale locale = new Locale("ko-KR");
}

Justin 클래스는 컴파일 하고, Test 클래스는 다시 컴파일하지 않고 그대로 실행합니다. 실행 결과는

18
I'm Justin
ko-kr

입니다. locale 의 값은 의도한대로 바뀌었지만, 나머지 값들은 그대로입니다. 어찌된 일일까요.

결론

위 실험 결과를 토대로 다음과 같은 결론을 도출해낼 수 있습니다. “final 키워드가 붙은 primitive 와 String 형식의 변수는 컴파일타임에 해당 클래스에서 상수로 치환된다” 다른 말로 해서,

public class Test {
	public static void main(String[] args) {
		System.out.println(Justin.age);
		System.out.println(Justin.identification);
		System.out.println(Justin.locale);
	}
}

이 코드는

public class Test {
	public static void main(String[] args) {
		System.out.println(18);
		System.out.println("I'm Justin");
		System.out.println(Justin.locale);
	}
}

와 똑같은 효과를 가집니다. Justin 클래스의 변경사항을 Test 클래스에 반영시키려면 Test 클래스를 다시 컴파일해야 합니다.