초기화는 생성자에서 합시다.!!

2007. 7. 25. 12:49Java


오늘은 생성자 호출의 순서에 대한 내용 입니다.
초보일때 이런실수를 했었죠.~

여기 하나의 소스가 있습니다.

init() 추상메소드를 정의하고, 생성자에서 이를 호출하는 추상클래스.
( 하위클래스에서 new를 하면 오버라이딩된 init()메소드가 알아서 호출되도록 한거 겠죠 ? )

abstract class Super {
 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());

 }
}
 


자아 이제 실행해 봅니다. Hashtable 은 어떻게 될까요.

결과는 NULL 입니다.
왜냐구요? 바로 생성의 순서 때문에 그렇습니다.
Test s = new Test(); 를 하게 되면. 호출 순서는 아래와 같습니다.

1. Super 의 생성자 호출
2. Test의 init() 호출
3. private Hashtable ht = null; 구문 수행
4. Test 의 생성자 호출.

자아 이제 이해 되셨나요.
init에서 이미 Hashtable을 할당해 놓았다 할지라도, Test 를 구동하면서 ht=null; 을 할당해 버리는거죠.

가끔하는 실수입니다. 조심해야죵. 상위 생성자에서 추상메소드를 호출하는 부분에 문제가 있는 겁니다.
여기서 얻는 교훈은 이겁니다.

"가능하면 초기화는 생성자에서 하자."