: 생성자는 인스턴스변수들의 초기화에 사용되는 특별한 메서드이다.
: java 컴파일러는 소스파일의 클래스에 생성자가 하나도 정의되지 않은 경우, 컴파일러는 자동적으로 default 생성자를 추가하여 컴파일 한다.
Default constructor가 컴파일러에 의해서 추가되는 경우는 클래스에 정의된 생성자가 하나도 없을 때 자동적으로 추가되며, 하나 이상의 constructor가 있는 경우에는 생성이 되지 않는다.
: 생성자도 메서드처럼 매개 변수를 선언하여 호출 시, 매개변수를 넘겨받아 인스턴스의 초기화 작업에 사용할 수 있다.
EX code
class Car {
String color;
String gearType;
ind door;
Car() {}
Car(String c, String g, int d){
color = c;
gearType = g;
door = d;
}
}
다음과 같이 매개변수가 있는 생성자를 사용하면, 인스턴스를 생성하는 동시에 원하는 값으로 초기화가 가능하다.
// 매개변수 없는 생성자 사용
Car c = new Car();
c.color = "white";
c.gearType = "auto";
c.door = 4;
// 매개변수 있는 생성자 사용
Car c = new Car("white", "auto", 4);
class Car {
String color;
String gearType;
ind door;
Car() {
this("white", "auto", 4);
}
Car(String color) {
this(color, "auto", 4);
}
Car(String color, String gearType, int door){
this.color = color; // 여기서 사용된 this는 이 클래스 내부의 인스턴스 변수를 뜻한다.
this.gearType = gearType;
this.door = door;
}
}
: 변수를 선언하고 처음으로 값을 저장하는 것을 변수의 초기화라고 한다.
멤버 변수(인스턴스 변수와 클래스 변수)와 배열의 초기화는 선택적이다. 하지만 지역변수의 초기화는 필수이다.
class InitTest {
int x; // 인스턴스 변수
int y = x; // 인스턴스 변수
void method1() {
int i; // 지역변수
int j = i; //컴파일 에러, 지역변수를 초기화 하지 않고 사용함.
}
}
member variable의 초기화 방법에는 3가지의 방법이 있다.
1. 명시적 초기화 (explicit initialization)
2. 생성자 (constructor)
3. 초기화 블럭 (initialization block)
: 변수를 선언과 동시에 초기화하는 것을 명시적 초기화라고 한다.
EX code
class Car {
String color = "white";
String gearType = "auto";
ind door = 4;
// ...
}
: 초기화 블럭에는 "클래스 초기화 블럭"과 "인스턴스 초기화 블럭" 두 가지 종류가 존재한다.
클래스 초기화 블럭 : 클래스 변수의 초기화에 사용됨
인스턴스 초기화 블럭 : 인스턴스 변수의 초기화에 사용됨
초기화 블럭 내에서는 메서드 내에서와 같이 조건문, 반복문, 예외처리구문 등을 자유롭게 사용가능하다.
따라서 명시적 초기화만으로는 하지 못하는 복잡한 초기화 작업을 할 때, 주로 사용한다.
클래스 초기화 블럭은 클래스가 메모리에 처음 로딩될 때 한번만 수행된다.
인스턴스 초기화 블럭은 생성자와 같이 인스턴스를 생성할 때 마다 수행된다.
그리고 생성자 보다, 인스턴스 초기화 블럭이 먼저 수행된다.
EX CODE
class Car {
static {
// class initialization block
}
{
// instance initialization block
}
}
인스턴스 초기화 블럭은 모든 생성자애서 공통적으로 수행돼야 하는 코드를 넣는데 사용된다.
클래스 변수의 초기화 시점 : 클래스가 처음 로딩될 때 단 한번 초기화 된다.
인스턴스 변수의 초기화 시점 : 인스턴스가 생성될 때마다 각 인스턴스별로 초기화가 이루어진다.
클래스 변수의 초기화 순서 : 기본값 -> 명시적초기화 -> 클래스 초기화 블럭
인스턴스변수의 초기화 순서 : 기본값 -> 명시적초기화 -> 인스턴스 초기화 블럭 -> 생성자