오픈소스 버전업 작업을 하다가,
클래스의 특정 멤버변수가 초기화되는 방식이 수정되어 기존 TC가 깨지는 문제가 있었다.
문제를 일으킨 수정 커밋은 이 것 이다.
수정사항과 별개로 initialization Block 이 생소했어서,
알아보았다.
public class Burrito {
static Long menuId; // 클래스 변수
int price; // 인스턴스 변수
static {
System.out.println("i am static block");
staticMethod();
}
{
System.out.println("i am instance block");
instanceMethod();
}
public Burrito() {
System.out.println("i am constructor");
instanceMethod();
}
public static void staticMethod() {
System.out.println("i am static Method");
}
public void instanceMethod() {
System.out.println("i am instance Method");
}
public static void main(String[] args) {
System.out.println("부리또 만들기 전입니닷..!");
new Burrito();
System.out.println("부리또 만들었습니닷..!");
}
}
initialization Block 은 말그대로 초기화 블럭이다.
초기화 블럭은 클래스 변수, 인스턴스 변수를 초기화 하는 목적으로 쓰인다.
static 키워드가 붙은 클래스 변수 초기화를 담당한다.
장점: 클래스가 로딩 될 때, 복잡한 초기화 과정을 수행해야 한다면, 유용하게 사용할 수 있다.
인스턴스 변수 초기화를 담당한다.
장점: 모든 생성자가 공통적인 내용을 수행해야할 때 작성하여 중복을 최소화할 수 있다.
instance block 은 클래스가 인스턴스가 될 때, 생성자가 호출되기 전에 호출된다.
둘 다 인스턴스 변수를 초기화하는 역할을 한다면..
완전히 생성자를 대체할 수 있을까?
아니다.
instance block은 기본값으로 초기화시켜주는 역할까진 가능하지만, 동적으로 인자를 전달받아 인스턴스 변수를 초기화 할 순 없다. setter()를 이용한다거나.. 구현을 달리하는 방법을 제외하고, 순수하게 생성자를 대체할 순 없다.
역할은 같지만, 보완적이라고 이해하는 게 정확하다.
instance block 의 장점에서 서술했듯이, 생성자가 여러개에 중복 코드가 있을 경우, 그 부분을 instance block으로 뺄 수 있다.
따라서, 생성자는 instance block없어도 상관없다.
위에서 봤던 내용을 코드로 확인해보자.

// 출력결과
i am static block
i am static Method // 인스턴스를 생성하지 않아도, 클래스가 로드 될 때 static block이 호출된다
부리또 만들기 전입니닷..!
i am instance block // 인스턴스를 생성하면, instance block -> constructor 순서로 호출된다
i am instance Method
i am constructor
i am instance Method
부리또 만들었습니닷..!