연산자 new가 인스턴스를 생성하는 것이지 생성자가 인스턴스를 생성하는 것이 아니다.
생성자는 단순히 인스턴스변수들의 초기화에 사용되는 조금 특별한 메서드일 뿐이다.
예시 1)
Card c = new Card();
public class test(){
Card() {
}
}
컴파일러가 자동으로 생성해주는 생성자는 내용이 하나도 없다.
기본 생성자가 컴파일러에 의해서 추가되는 경우는 클래스에 정의된 생성자가 하나도 없을 때 뿐이다.
예시 1)
public class Car {
String color; // 색상
String gearType; // 변속기 종류 - auto(자동), manual(수동)
int door; // 문의 개수
Car() {}
Car(String c, String g, int d){
color = c;
gearType = g;
door = d;
}
}
public class CarTest {
public static void main(String args[]) {
Car c1 = new Car();
c1.color = "white";
c1.gearType = "auto";
c1.door = 4;
Car c2 = new Car("white", "auto", 4);
}
}
기본 생성자 Car() {}를 사용하면 인스턴스를 생성 후 인스턴스의 변수들을 초기화 시켜야 하지만 매개변수가 있는 생성자를 사용하면 인스턴스 생성하는 동시에 원하는 값으로 초기화를 할 수 있다. 그러면 코드도 더 간결해진다.
생성자에서 다른 생성자 호출하기
같은 클래스의 멤버간에도 호출하듯이 생성자 간에도 서로 호출이 가능하다. 대신 아래와 같이 조건이 만족되어어 한다.
Car(String color){
door = 5; // 첫 번째 줄
Car(color, "auto", 4); // 에러1. 생성자의 두 번째 줄에서 다른 생성자 호출
// 에러2. this(color, "auto", 4);로 해야함
}
생성자가 초기값을 제공 받을 경우 매개 변수 명과 생성자 안에서 있는 인스턴스 변수 명이 같은 경우 일 때가 많다. 같은 이름을 쓰면 어떤 것이 매개 변수이고 인스턴스 변수인지 구별하기 어렵다. 그럴 경우 인스턴스 변수 명 앞에 this를 붙여주면 구별하기가 쉬워진다.
Car(String c, String g, int d){
color = c;
gearType = g;
door = d;
}
Car(String color, String gearType, int door){
this.color = color;
this.gearType = gearType;
this.door = door;
}
this는 참조변수로 인스턴스 자신을 가리킨다. 참조변수를 통해 인스턴스의 멤버에 접근할 수 있는 것처럼 this로 인스턴스변수에 접근할 수 있는 것이다. 하지만 this를 사용할 수 있는 것은 static메서드에서는 인스턴스 멤버들을 사용할 수 없는 것 처럼 this 역시 사용할 수 없다. 왜냐하면 static메서드는 인스턴스를 생성하지 않고도 호출될 수 있으므로 static메서드가 호출된 시점에 인스턴스가 존재하지 않을 수도 있기 때문이다.
※ 참고 문헌
남궁성, 『Java의 정석 3nd Edition』, 도우출판(2016) 책으로 공부하고 정리한 내용 입니다.