초기화는 생성자에서 합시다.!!
2007. 7. 25. 12:49ㆍJava
오늘은 생성자 호출의 순서에 대한 내용 입니다.
초보일때 이런실수를 했었죠.~
여기 하나의 소스가 있습니다.
init() 추상메소드를 정의하고, 생성자에서 이를 호출하는 추상클래스.
( 하위클래스에서 new를 하면 오버라이딩된 init()메소드가 알아서 호출되도록 한거 겠죠 ? )
abstract class Super {
public Super() {
init();
}
public abstract void init();
}
public Super() {
init();
}
public abstract void init();
}
이젠 위의 추상클래스를 상속받아 구현하였습니다.
init 메소드에 Hashtable를 초기화하여 집어넣었네요.~
public class Test extends Super{
private Hashtable ht = null;
@Override
public void init() {
ht = new Hashtable();
}
public Hashtable get() { return ht; }
public static void main(String[] args) {
Test s = new Test();
System.out.println(s.get());
}
}
결과는 NULL 입니다.
왜냐구요? 바로 생성의 순서 때문에 그렇습니다.
Test s = new Test(); 를 하게 되면. 호출 순서는 아래와 같습니다.
1. Super 의 생성자 호출
2. Test의 init() 호출
3. private Hashtable ht = null; 구문 수행
4. Test 의 생성자 호출.
자아 이제 이해 되셨나요.
init에서 이미 Hashtable을 할당해 놓았다 할지라도, Test 를 구동하면서 ht=null; 을 할당해 버리는거죠.
가끔하는 실수입니다. 조심해야죵. 상위 생성자에서 추상메소드를 호출하는 부분에 문제가 있는 겁니다.
여기서 얻는 교훈은 이겁니다.
"가능하면 초기화는 생성자에서 하자."