일모도원(日暮途遠) 개발자

[자바] 클래스의 초기화 블럭 (이름없는 메소드) 본문

프로그래밍 언어/자바

[자바] 클래스의 초기화 블럭 (이름없는 메소드)

달님개발자 2022. 9. 9. 16:32

자바 클래스에는 클래스 이름과 같은 이름을 가지는 생성자(生成者, Constructor)가 있고, 아무런 메소드 명이 없은 초기화 블럭(Initialize block)이 있다.

 

잘 쓰이지 않는 문법이지만 면접용으로 알아는 두자.

 

아래 초기화블럭은 인스턴스 초기화 블럭이다.  생성자와 다르게 아무런 이름이 없다.

class Car {
    int speed;
    
    // 생성자
    Car() {
        System.out.println("Speed of Car: " + speed);
    }
    // 초기화 블럭 (아무런 이름이 없다)
    {
        speed = 60;
    }
    public static void main(String[] args) {
        Car obj = new Car();
    }
}

다른 초기화 블럭으로는 스태틱 초기화 블럭이 있다.

차이는 스태틱 초기화 블럭은 이름없이 static만 붙어있고, static인지라 최초 클래스가 로딩될때 딱 한번만 호출된다.

인스턴스 초기화 블럭은 이름도 없고 static도 없다. 그리고 객체가 생성될때마다 (생성자보다 먼저) 호출된다.

// 스태틱 초기화 블럭 (역시 아무런 이름이 없다)
static {

}
// 인스턴스 초기화 블럭 (아무런 이름이 없다)
{

}

호출되는 순서

초기화 블럭은 여러개를 가질수 있고, 위에서부터 순서대로 초기화 블럭을 호출하고 그다음에 생성자를 호출한다.

(하지만 이러면 알아보기 힘들기 때문에 가능한 초기화 블럭은 하나만 쓰자. 헷갈린다.)

// 부모 클래스
class MyParent {
    MyParent() { System.out.println("MyParent 생성자"); }
 
    {
        System.out.println("MyParent 초기화 블럭");
    }
}
 
// 자식 클래스
class MyChild extends MyParent {
    MyChild()
    {
        super();
        System.out.println("MyChild 생성자");
    }
    {
        System.out.println("MyChild 초기화 블럭");
    }
 
    public static void main(String[] args)
    {
        MyChild myChild = new MyChild();
    }
}​

호출결과 

MyParent 초기화 블럭

MyParent 생성자

MyChild 초기화 블럭

MyChild 생성자


초기화 블럭을 쓰는 이유

  • 객체를 생성할때 생성자가 여러개 있을때 빼먹기 쉬운 부분은 초기화 블럭으로 둔다.
  • 여러 생성자에서 공통되는 부분은 초기화 블럭으로 뺀다.

비슷한 말이긴 한데, 생성자를 많이 만들다보면... 공통되는 부분도 있도, 또 반드시 객체생성시 해야하는 코드가 있는데, 깜빡할수도 있다는 생각이 든다.

 

참고로 나는 초기화 블럭을 쓴적은 없는데, 코딩하다보니 이렇게 생성자가 많이 생기는 경우는 생기더라.(잘못짠건가?)

나중에 초기화 블럭을 사용할수 있으면 해봐야겠다.