티스토리 뷰
생성자란?
생성자는 인스턴스가 생성될 때 호출되는 인스턴스 초기화 메소드이다.
생성자는 다음과 같은 특징을 지닌다
- 생성자의 이름은 클래스의 이름과 같아야 한다.
- 생성자는 리턴 값이 없다.
생성자는 다음과 같이 정의한다
class Card{
Card() { // 매개변수가 없는 생성자
//..
}
Card(String k, int num) { // 매개변수가 있는 생성자
//...
}
연산자 new가 인스턴스를 생성하는 것이지 생성자가 인스턴스를 생성하는 것은 아니다.
생성자는 단순히 인스턴스 변수들의 초기화에 사용되는 조금 특별한 메소드일 뿐이다.
인스턴스가 생성되는 과정은 다음과 같다
Card c = new Card();
1. 연산자 new에 의해서 메모리(heap)에 Card 클래스의 인스턴스가 생성된다 (c라는 이름의)
2. 생성자 Card()가 호출되어 수행된다.
3. 연산자 new의 결과로 생성된 Card 인스턴스의 주소가 반환되어 참조변수 c에 저장된다.
생성자에서 다른 생성자 호출하기 - this()
같은 클래스의 멤버들 간에 서로 호출할 수 있는 것처럼 생성자 간에도 서로 호출이 가능하다.
다음 두가지 조건을 필요로한다
- 생성자의 이름으로 클래스이름 대신 this를 사용한다.
- 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.
class Car {
String color;
String gearType;
int door;
Car() {
this("white", "auto", 4); // Car(String color, String gearType, int door)를 호출
}
Car(String color) {
this(color, "auto", 4);
}
Car(String color, String gearType, int door) {
this.color = color;
this.gearType = gearType;
this.door = door;
}
}
생성자 Car()에서 또 다른 생성자 Car(String color, String gearType, int door)를 호출하였다. 이처럼 생성자간의 호출에는 생성자의 이름 대신 this를 사용해야만 하므로 'Car' 대신 'this'를 사용했다.
이러한 코딩 스타일은 코드를 간결하고 유지보수하기 쉽게 해준다. 다음 예시를 살펴보면 그 말이 더 와닿을 것이다.
Car() {
color = "white";
gearType = "auto";
door = 4;
}
// 다음과 같이 변경
Car() {
this("white", "auto", 4);
}
이것은 마치 실생활에서 자동차 생산에 있어서 아무런 옵션을 주지 않았을 때 기본적으로 흰색에, 자동변속기어, 그리고 문의 개수가 4개인 자동차가 생산되도록 하는 것에 비유될 수 있다.
또한 옵션 하나가 추가되었을 경우를 가정해보아도, this를 사용하지 않았을 경우 모든 생성자 메소드의 라인을 변경해주어야 하지만, this를 사용할 경우 매개변수 값에 데이터를 하나 추가해주면 그만이다.
참고
this와 위의 설명한 this()는 구분해야 한다
- this는 인스턴스 자신을 가르키는 참조변수, 인스턴스의 주소가 저장되어 있다. 모든 인스턴스 메소드에 지역변수로 숨겨진 채로 존재한다(클래스 메소드에서는 없다!)
- this(), this(매개변수)는 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용된다
생성자를 이용한 인스턴스의 복사
어떤 인스턴스의 상태를 자세히 몰라도 똑같은 인스턴스를 추가로 생성할 수 있다. Java의 API의 많은 클래스들이 인스턴스 복사를 위한 생성자를 정해놓고 있다.
간단히 이를 구현하면 다음과 같다.
class Car{
String color;
String gearType;
int door;
Car() {
this("white", "auto", 4);
}
Car(Car c) { // 인스턴스 복사를 위한 생성자!
color = c.color;
gearType = c.gearType;
door = c.door;
}
Car(String color, String gearType, int door) {
this.color = color;
this.gearType = gearType;
this.door = door;
}
}
class Test {
public static void main(String[] args){
Car c1 = new Car();
Car c2 = new Car(c1); // c1의 복사본 c2
}
}
인스턴스 c2는 c1을 복사하여 생성된 것이므로 서로 같은 상태를 갖지만 서로 독립적으로 메모리 공간에 존재하는 별도의 인스턴스이다.
참고 : Java의 정석(남궁 성 지음)
'JAVA' 카테고리의 다른 글
[JAVA] 변수의 초기화 (0) | 2019.05.22 |
---|---|
[JAVA] 변수와 메소드 (0) | 2019.05.22 |
[JAVA]JVM구조 이해하기 (0) | 2019.01.15 |