다음과 같은 단계로 인스턴스가 만들어진다고 생각해 볼 수 있습니다.
new 연산자가 클래스 정의를 보고메모리에 공간을 할당하고, 그참조값을생성자에게인자로 넘겨줍니다.생성자는 new 연산자가 넘겨준 인스턴스의참조값을 통해 인스턴스 변수같은 메모리 공간에접근하여 필요한초기화작업을 합니다.- 마지막으로 생성자는 인스턴스의
참조값(this)을 반환합니다.
public class ConstructInitialize {
public static main(String[] args) {
MyClass myClass = new MyClass();
/*...*/
}
}
class MyClass {
// 일반적인 메서드처럼 비유하자면 생성자는 이런식으로 동작할 것입니다.
// MyClass MyClass(MyClass this /* <- new 연산자가 넘겨줍니다 */) {
// /*...필요한 초기화 작업...*/
// return this;
// }
}
멤버 변수의 모든 초기화 방법을 예시와 함께 설명합니다.
class initTest {
static int cv = 1;
int iv = 1;
static { cv = 2; }
{ iv = 2; }
InitTest() {
iv = 3;
}
}
| 클래스 초기화 | 클래스 초기화 | 클래스 초기화 | 인스턴스 초기화 | 인스턴스 초기화 | 인스턴스 초기화 | 인스턴스 초기화 |
|---|---|---|---|---|---|---|
| 기본 값 | 명시적 초기화 | 클래스 초기화 블록 | 기본 값 | 명시적 초기화 | 인스턴스 초기화 블록 | 생성자 |
| cv = 0 | cv = 1 | cv = 2 | cv = 2 iv = 0 |
cv = 2 iv = 1 |
cv = 2 iv = 2 |
cv = 2 iv = 3 |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
- 인스턴스 초기화 블럭은 생성자와 기능이 겹치기 때문에 잘 사용하지 않습니다. 알아야 할 것은 인스턴스 초기화 블럭이 생성자보다 먼저 실행된다는 것입니다.