무릇 언어에 무슨 기능이 있다면 그 기능이 등장한 배경이 존재하기 마련임.

 다 필요했으니까 등장한 개념이라는 거.


 자. 가장 간단한 다음의 예를 보자.


 class ClassA {

     public int i;

 }


 인스턴스 멤버 변수가 i 뿐인 ClassA를 선언한 아주 기초적인 클래스 선언임.

 그런데 이 i 값의 기본 값을 3으로 주고 싶다면 어떻게 할까?

 그럼 이런 식으로 써주면 되겠지.


 class ClassA {

     public int i = 3;

 }


 근데 만약에 i가 int 형 같은 단순한 게 아니라 또 다른 클래스이고

 그 클래스의 멤버 변수를 내가 원하는 초기값으로 설정하고 싶은 경우라면?


 class ClassA {

     public ClassB i; // ClassB 인스턴스를 만들고 i.var를 3으로 초기화하고 싶다.

 }


 이런 문제 상황이 있어서 인스턴스 멤버 변수 초기화 과정에서 = 상수값; 형태로 값을 대입하는 거 이외에

 코드도 사용할 수 있게 만들어 놓았음. 그게 인스턴스 초기화 블록(instance initializer)이라는 거임.


 class ClassA {

     public ClassB i;

     { i = new ClassB(); i.var = 3; }

 }


 생성자는 왜 나왔을까?
 인스턴스의 멤버 변수를 초기화할 때 항상 같은 값으로 초기화하는 게 아니라

 인스턴스를 생성할 때 외부에서 어떤 값을 주면 그 값에 반응해 유동적으로 초기화할 수 있게 하고 싶었는데

 그래서 생성자라는 개념이 나온 거임.


 class ClassA {

     public int i;

     public ClassA(int val) { i = val; }

 }

 // ClassA x = new ClassA(20); 식으로 i 값의 초기값을 외부에서 control할 수 있음.


 즉, 인스턴스 초기화 블록이 생성자보다 먼저 실행되는 건,

 public int i = 3; 값이 선언했을 때 생성자 코드가 실행될 때는 이미 i == 3 이라는 점에서 당연한 거임을 알 수 있음.

 인스턴스 초기화 블록과 생성자, 이 둘의 개념은 전혀 다른 목적에서 나온 다른 개념임.


 근데 결국 인스턴스 초기화 블록에서 수행하는 모든 초기화 작업은 생성자에서 할 수 있는 것들이므로

 요새는 인스턴스 초기화 블록은 잘 안 쓰는 추세임. 괜시리 코드만 더러워지니깐.