Java의 초기화 블럭에 대해 알아보자. 나는 왜 그동안 그렇게 Java를 써오면서 이 문법을 몰랐지? 라는 생각이 들었다. 심지어 중간에 추가된 문법도 아니고 Java 1.0 부터 존재한 문법이다. 이래서 기초가 중요하다...
클래스 필드의 초기화를 담당하는 블럭이다. 초기화 블럭은 생성자보다 먼저 호출되고, static 유무에 따라 2가지로 나뉘어진다.
생성자 초기화전에 호출되기 때문에, 생성자에 상관없이 어떻게 객체를 초기화 하든 공통적으로 처리할 로직이 있을 경우 초기화 블럭에서 처리하면 편하다!!
class Test {
int a = 1;
static int b = 2;
{
System.out.println("인스턴스 초기화 블럭!!");
System.out.println("인스턴스 초기화 블럭에서 a값 할당 전 a값: " + a);
a = 3;
System.out.println("인스턴스 초기화 블럭에서 a값 할당 후 a값: " + a);
}
static {
System.out.println("클래스 초기화 블럭!!");
System.out.println("클래스 초기화 블럭에서 a값 할당 전 b값: " + b);
b = 4;
System.out.println("클래스 초기화 블럭에서 a값 할당 후 b값: " + b);
}
Test() {
System.out.println("생성자!!");
a = 5;
b = 5;
}
}
class Scratch {
public static void main(String[] args) {
System.out.println("=== 객체 생성 전 ===");
System.out.println("b: " + Test.b);
Test test = new Test();
System.out.println("=== 객체 생성 후 ===");
System.out.println("a: " + test.a);
System.out.println("b: " + Test.b);
}
}
=== 객체 생성 전 ===
클래스 초기화 블럭!!
클래스 초기화 블럭에서 a값 할당 전 b값: 2
클래스 초기화 블럭에서 a값 할당 후 b값: 4
b: 4
인스턴스 초기화 블럭!!
인스턴스 초기화 블럭에서 a값 할당 전 a값: 1
인스턴스 초기화 블럭에서 a값 할당 후 a값: 3
생성자!!
=== 객체 생성 후 ===
a: 5
b: 5
객체 생성 전, 그러니까 생성자가 호출되기 전에 먼저 초기화 블럭이 호출 되는 것을 확인할 수 있다.