글
final 키워드의 중요성
자바 프로그래밍을 할 때 사람들을 괴롭히는 한 가지 주제는 '메모리'이다.
관련된 주제는 가비지 컬렉션, Single 패턴 등이 있을 테지만 흔히 간과하는 것 중 하나가 final 키워드의 사용이다.
1. final 키워드는 변수, 메소드의 선언에 쓰인다.
2. final 키워드를 사용한 변수는 상속이 안된다.
3. final 키워드로 할당한 변수를 변경할 수 없다.
4. final 키워드를 사용한 변수는 객체의 생성 당시에 메모리에 값이 할당되어야 한다.
변수가 한번만 선언된다는 것이 왜 중요한 것인지 이해하려면 자바에서 다루는 메모리 시스템에 대한 이해가 선행되어야 한다.
우선 변수를 하나 만들어 보자. String _a = "Hi";
변수 _a는 "Hi" 라는 값을 가리키고 있다. 값을 저장하는 것이 아니라 '가리키는(reference)' 것이다.
이 행동은 쉽게 다른것들에 의해 복제 될 수 있다.
String _b = "Hi"; 이제 _b도 "Hi"를 가리키고 있다. 또 다른 경우를 생각해보라.
SomeObject obj = new SomeObject(); obj 객체를 생성했다.
좌측은 obj 객체의 주소를 저장할 공간을 생성한 것이고, 오른편은 구체적인 값을 저장한 공간을 지정해 둔 것이다.
이들을 등호로 할당하여 값과 주소를 연결했다.
한편 시스템이 아주 복잡하게 움직인다고 하자(예를 들어 쓰레드가 1000개쯤) 우연치 않게 컴퓨터는 이런 말도 안되는 생각을 할 수 있다. '아... 값을 저장할 곳이 없네.'
우리도 도서관에서 누군가 책만 샇아두고 쓰지 않으면 그책을 치워버리고 그 자리에 앉고 싶어진다.
자바가상머신(컴퓨터)도 그러지 말라는 법이 없다.
SomeObject obj의 주소 값은 그대로 살아있겠지만, obj가 가리키는 저장소가 사용되지 않는 다고 판단된다면 이 저장소를 초기화시켜 버린다. 그러면 더 이상 obj는 값을 가리키지 못하는 상태(한편, null을 가리킨다고 봐도됨)가 된다.
그러면 이와같은 웃긴 일도 벌어질 수 있다. 자바프로그램의 쓰레드들이 축구를 하다가 갑자기 공이 사라지는 것이다. 왜냐하면 선수들이 전반전을 끝내고 휴식하는 사이, 축구공을 쓰지 않는다고 판단한 누군가가 공을 가져가 버렸기 때문이다.
어떻게 막을까?
final 키워드를 붙여서 가리키는 주소와 값을 본드로 딱 붙여버리면 끝이다.
final SomeObject obj = new SomeObject();
어떤 일이 벌어지는고 하니 메모리를 생성한 후, 이 메모리를 가리키는 주소 값은 유일하게 obj가 관리한다.
다른 주소값을 가진 객체가 값을 저장하는 저장소에 접근하려고 하면 이미 obj가 버티고 있어서 막을 것이다.
결정적으로 이 obj 변수를 가지고 있는 객체가 가비지컬렉터에 의해 사라지기 전까지 obj가 가리키고 있는 저장소는 누구도 쓸 수 없다.
즉, obj가 사망해야 저장소도 풀려난다. 앞서 비유를 생각하면 축구가 끝나야 공이 다른 곳에 쓰일 수 있다.
'J > Java' 카테고리의 다른 글
Static 키워드 (0) | 2014.03.18 |
---|---|
자바 제너릭 (1) | 2014.03.16 |
Java 7의 새로운 특징 : Java7에서의 중요한 변화들과 업데이트된 항목에 대한 조사. (0) | 2012.01.24 |
ThreadLocal 클래스 (0) | 2012.01.06 |
UIManager.setLookAndFeel ( 자바 스윙 룩앤필 설정 ) (0) | 2011.11.17 |