본문 바로가기

4. 테크니컬&팁/4.1.Java

java final 에 대한 상세한 이해.

생각지도 못한 결과가 나와 황당해 했는데.. 이건 final을 이전까지 내가 잘못알고 있었기 때문이었다.

아래 소스를 좀 보자.


Test1.java

public class Test1 {

     public static final String STR="1";

}



Test2.java

public class Test2 {

     public static void main(String[] arg) {

System.out.println(Test1.STR);

     }

}


위와 같은 간단한 코드가 있다고 치자.

컴파일을 아래와 같이 하자.

javac Test2.java

위와 같이 컴파일 하면 Test2.java가 사용하고 있는Test1도 같이 컴파일되어 class파일이 두개 다 생성된다.


그리고 실행을 해보자.

결과는 1


Test1.java를 수정한다.


public class Test1 {

     public static final String STR="2";

}


컴파일을 아래와 같이하자.

javac Test1.java


java Test2 로 실행하면 어떤결과가 나올까?

결과는 2가 아니라 1이 나온다.. 잉???

실재로 Test1.java를 컴파일하면 Test1만 class 파일이 새로 생성된다.


생각같아서는 Test2가 Test1의 객체를 호출해서 결과를 받아올거 같으나..

final이라는 문장으로 인해 Test1을 참조하지 않는 결과가 나오는것이다...

즉, 컴파일시 Test2 객체는 Test1의 STR이라는 값이 static final이라는 단어의 덕분으로.. 이 값은 변경되지 않는다고 판단하여 어플리케이션의 속도??를 높이고자 Test2객체가 해당 값을 가지고 들어가 버린것이란 판단이다.


Test1에서 사용한 STR이 만약 자주 변경되어야 하는 값이라면...

final을 붙였다가는 잘못된 값이 출력되는 객체들이 생길수도 있다는 것이다..


이클립스와 같은 개발툴을 사용한다면 알아서 Test2를 컴파일해줄지도 모르지만,

위와 같이 직접 컴파일을 하거나 모든 java파일을 컴파일하지 않는 (이전 객체를 유지하고자 하는경우도) 경우도..

황당한 결과가 나올수 있을거 같다..


주의 하자..