자바에서 생성자는 인스턴스 생성 시 호출되는 인스턴스 초기화 메서드이다.
생성자의 조건
1. 생성자의 이름은 클래스의 이름과 같아야 한다.
2. 생성자는 리턴값이 없다.
생성자도 오버로딩이 가능하기 때문에, 하나의 클래스에 여러 개의 생성자가 존재할 수 있다.
기본 생성자 (default constructor)
클래스 내에 생성자가 하나도 정의되지 않은 경우, 컴파일러는 자동적으로 기본 생성자를 추가해 컴파일한다.
Class() { }
매개변수도 없고 내용도 없다.
매개변수가 있는 생성자
매개변수를 선언하여 호출 시 값을 넘겨받아서 인스턴스의 초기화 작업에 사용할 수 있다.
class Car {
String color;
String gear;
int door;
Car() { } //기본 생성자
Car(String color, String gear, int door) {
this.color = color;
this.gear = gear;
this.door = door;
}
}
this는 생성자에서 클래스 본인을 뜻한다. this.color는 class에서 선언된 인스턴스 변수 color를 뜻하고, color는 매개변수로 받아온 color를 뜻한다.
생성자에서 다른 생성자를 호출할 때, this를 통해 다른 생성자를 호출할 수 있다. 단, 생성자의 가장 첫 줄에서 사용해야 한다.
class Car {
String color;
String gear;
int door;
// 1번 생성자
Car() {
this("white", "auto", 4);
}
// 2번 다른 생성자를 사용하는 생성자
Car(String color) {
this(color, "auto", 4);
}
// 3번 매개변수 사용하는 생성자
Car(String color, String gear, int door) {
this.color = color;
this.gear = gear;
this.door = door;
}
}
위와 같이 3개의 생성자가 있을 때, 매개변수가 없이 인스턴스를 생성하면 1번 생성자를 사용해 3번 생성자를 사용한다. 그리고 매개변수가 1개가 들어오면 2번 생성자를 사용해서 3번의 생성자를 사용하게 된다. 매개변수가 3개로 들어오면 3번 생성자를 사용한다.
변수의 초기화
클래스에서 변수를 사용할 때, 지역변수는 사용하기 전에 반드시 초기화 해야하지만, 멤버변수는 초기화하지 않아도 자동적으로 변수의 자료형에 맞는 기본 값으로 초기화가 이루어진다.
멤버변수를 초기화 하는 방법은 3가지가 있다.
1. 명시적 초기화
2. 생성자
3. 초기화 블럭 : 인스턴스 초기화 블럭, 클래스 초기화 블럭
명시적 초기화
변수를 선언함과 동시에 초기화 하는 것이다.
가장 간단하고 기본적이기 때문에 가장 우선적으로 고려되어야 한다.
하지만 복잡한 초기화 작업이 필요한 경우 초기화 블럭 또는 생성자를 사용해야 한다.
초기화 블럭
초기화 블럭에는 클래스 초기화 블럭과 인스턴스 초기화 블럭이 있다.
초기화 블럭 내에는 메서드 내에서와 같이 조건문, 반복문, 예외처리구문 등을 자유롭게 사용할 수 있어 초기화 작업이 복잡하여 명시적 초기화로만 부족할 경우 초기화 블럭을 사용한다.
인스턴스가 생성될 때, 인스턴스 초기화 블럭이 생성자보다 먼저 수행된다.
class Car {
String color;
String gear;
int count;
int serialNo;
//인스턴스 초기화 블럭
{
count++;
serialNo = count;
}
Car() {
color = "white";
gear = "Auto";
}
Car(String color, String gear) {
this.color = color;
this.gear = gear;
}
}
위와 같은 인스턴스 초기화블럭을 통해, 생성자 호출 이전에 인스턴스 변수에 대해 초기화할 수 있다.
...
static {
// 클래스 변수 초기화 블럭
}
...
클래스 변수들도 초기화 블럭을 통해 초기화할 수 있다. 인스턴스와 다르게 static을 붙여줘야 함.
멤버변수의 초기화 시기와 순서
클래스 변수는 클래스가 처음 로딩될 때 선언되고 초기화된다. 인스턴스 변수는 인스턴스가 생성될 때 선언되고 초기화된다. 아래와 같은 클래스 선언 코드가 있을 때, 호출되면
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 | cv = 2 | cv = 2 | cv = 2 |
iv = 0 | iv = 1 | iv = 2 | iv = 3 |
'Java' 카테고리의 다른 글
[Java] 날짜와 시간 (Calendar, Date) (0) | 2021.05.18 |
---|---|
[Java] String 클래스 (0) | 2021.05.10 |
[Java Spring] TestRestTemplate (0) | 2021.04.19 |
[Java Spring] 빈 생명주기 (Bean Life cycle) (0) | 2021.04.16 |
[Java Spring] 트랜잭션 (Transaction) (0) | 2021.04.14 |