Java에서 클래스의 멤버 변수(initial instance variables)는 다음과 같은 순서로 초기화 된다:
-
기본 초기화(Default Initialization): 모든 멤버 변수는 해당 자료형의 기본 값으로 자동 초기화 된다. 예를 들어,
int타입의 변수는 0으로,boolean타입의 변수는 **false**로 초기화된다. -
명시적 초기화(Explicit Initialization): 멤버 변수를 선언할 때 직접 값을 할당하는 방식으로 초기화 할 수 있다. 이 경우 명시적으로 지정한 값으로 변수가 초기화 된다.
-
인스턴스 초기화 블록(Instance Initialization Block): 클래스의 인스턴스가 생성될 때 실행되는 블록으로, **
{}(중괄호)**로 묶인 코드 블록이다. 해당 블록은 인스턴스 변수를 초기화하기 위해 사용된다. 인스턴스 초기화 블록은 생성자보다 먼저 실행되며, 생성자마다 중복 코드를 작성하지 않고 인스턴스 변수를 초기화하는 데 사용될 수 있다. -
생성자(Constructor) 초기화: 생성자는 인스턴스가 생성될 때 호출되는 특별한 메서드이다. 생성자를 사용하여 멤버 변수를 초기화할 수 있다. 생성자 초기화는 명시적 초기화와 인스턴스 초기화 블록 다음에 실행된다.
따라서, 멤버 변수의 초기화는 위의 순서대로 진행된다. 명시적 초기화는 변수 선언 시 값을 할당하는 방식으로 초기화하며, 인스턴스 초기화 블록은 인스턴스 생성 시점에 실행되는 블록입니다. 생성자는 클래스의 인스턴스가 생성될 때 실행되며, 생성자를 통해 멤버 변수를 초기화할 수 있습니다. 이러한 초기화 순서는 클래스의 인스턴스화 및 멤버 변수의 일관된 초기 상태를 보장하기 위해 필요합니다.
public class MyClass {
private static int staticVariable = initializeStaticVariable();
private int instanceVariable = initializeInstanceVariable();
static {
System.out.println("Static initialization block");
}
{
System.out.println("Instance initialization block");
}
public MyClass() {
System.out.println("Constructor");
}
private static int initializeStaticVariable() {
System.out.println("Initializing static variable");
return 10;
}
private int initializeInstanceVariable() {
System.out.println("Initializing instance variable");
return 20;
}
public static void main(String[] args) {
MyClass myObj = new MyClass();
}
} (클래스 초기화 from 클래스 로더)
Initializing static variable
Static initialization block
(인스턴스 생성)
Initializing instance variable (heap 영역)
Instance initialization block
Constructor