생성자를 실행시키지 않고는 클래스로부터 객체를 만들 수 없다. new 연산자에 의해 생성자가
성공적으로 실행되면, 힙 영역에 객체가 생성되고, 객체의 주소가 반환된다.
인스턴스가 생성될 때 호출되는 ‘인스턴스 초기화 메서드’ 이다.
리턴값이 없다는 점이 다르다. 그렇다고 해서 생성자 앞에 리턴값이 없음을 뜻하는
키워드 void를 사용하지 않고, 단지 아무 것도 적지 않는다.
생성자도 메서드이기 때문에 리턴값이 없다는 의미의 void를 붙여야 하지만,
모든 생성자가 리턴값이 없으므로 void를 생략할 수 있게 한 것이다.
생성자는 단순히 인스턴스 변수들의 초기화에 사용되는 조금 특별한 메서드일 뿐이다.
Card c = new Card();
1. 연산자 new에 의해서 메모리에 Card클래스의 인스턴스가 생성된다.
2. 생성자 Card()가 호출되어 수행된다.
3. 연산자 new의 결과로, 생성된 Card인스턴스의 주소가 반환되어 참조변수 c에 저장한다.
밑에 있는 코드는 에러가 발생하는 코드 이다.
Data2에서 Data2( ) 라는 생성자를 찾을 수 없다는 내용의 에러 메세지이다.
Data2에 생성자 Data2( )가 정의되어 있지 않기 때문에 에러가 발생한 것이다.
그 이유는, Data1 에는 정의되어 있는 생성자가 하나도 없으므로 컴파일러가
기본 생성자를 추가해주었지만, Data2에는 이미 생성자 Data2( int x ) 가 정의되어 있으므로
기본 생성자가 추가되지 않았기 때문이다.
class Data1 {
int value;
}
class Data2 {
int value;
Data2(int x) { // 매개변수가 있는 생성자
value = x;
}
}
class aaa {
public static void main(String[] args) {
Data1 d1 = new Data1();
Data2 d2 = new Data2(); // 에러 발생.
// Data2 d2 = new Data2(10); 이렇게 수정 해야 한다.
}
}
인스턴스를 생성한 다음에 인스턴스변수들을 따로 초기화해주어야 하지만,
매개변수가 있는 생성자 Car(String color, String gearType, int door) 를 사용한다면
인스턴스를 생성하는 동시에 원하는 값으로 초기화를 할 수 있다.
간결하지 않은 코드.
Car c = new Car();
c.color = "white";
c.gearType = "auto";
c.door = 4;
간결하고 직관적인 코드.
생성자를 제공함으로써 인스턴스 생성 후에 별도로 초기화를 하지 않아도 되도록 하는 것이 바람직하다.
Car c = new Car("white", "auto", 4);
Reference
남궁 성 지음, 『자바의 정석』, 도우출판.