Exccesive Constants
서론
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 클래스를 다시 컴파일해야 합니다.