무릇 언어에 무슨 기능이 있다면 그 기능이 등장한 배경이 존재하기 마련임.
다 필요했으니까 등장한 개념이라는 거.
자. 가장 간단한 다음의 예를 보자.
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 이라는 점에서 당연한 거임을 알 수 있음.
인스턴스 초기화 블록과 생성자, 이 둘의 개념은 전혀 다른 목적에서 나온 다른 개념임.
근데 결국 인스턴스 초기화 블록에서 수행하는 모든 초기화 작업은 생성자에서 할 수 있는 것들이므로
요새는 인스턴스 초기화 블록은 잘 안 쓰는 추세임. 괜시리 코드만 더러워지니깐.
오늘 처음 봄
http://autogram.tk/이
중고차 어플리케이션 어떤가요?