자바의 정석 - 생성자 마무리

jadive study·2022년 11월 29일
0

5.4 생성자에서 다른 생성자 호출하기 - this(), this

  • 생성자의 이름으로 클래스이름 대신 this를 사용한다.
  • 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.
Car(String color) {
door = 5;                 //첫 번째 줄
Car (color, "auto", 4);   // 에러. 생성자의 두 번째 줄에서 다른 생성자 호출 
}                         //에러2 this(color,"auto",4);로해야함

다른 생성자를 호출할 때는 클래스이름인 ‘ Car’ 대신 ‘ this ’ 를 사용해야하는데 그러지 않아서 에러이고, 또 다른 에러는 생성자 호출이 첫 번째 줄이 아닌 두 번째 줄 이기 때문에 에러이다.

생성자에서 다른생성자를 첫 줄에서만 호출이 가능하도록 한 이유는 생성자 내에서 초 기화 작업도중에 다른 생성자를 호출하게 되면, 호출된 다른 생성자 내에서도 멤버변수들의 값을 초기화환 함 것이므로 다른 생성자를 호출하기 이전의 초기화 작업이 무의미해질 수 있기 때문이다.

생성자 Car( )에서 또 다른 생성자 Car(String color, String gearType, int door)를 호출하였다. 이처럼 생성자간의 호출에는 생성자의 이름 대신 this를 사용해야만 하므로 ‘Car’ 대신 ‘this’를 사용했다.

Car () {
color = "white"; 
gearType = "auto"; 
door = 4;
}

->

Car() {this("white","auto",4);
}

위 코드는 양쪽 모두 같은 일을 하지만 오른쪽의 코드는 생성자 Car(String color, String gearType. int door)를 활용해서 더 간략히 한 것이다. Car cl = new Car();와 같이 생 성자Car()를 사용해서 Car인스턴스를 생성한 경우에,인스턴스변수 color는 “white”, gearType은 “auto”, door는 4로 초기화 되도록 하였다.

같은 클래스 내의 생성자들은 일반적으로 서로 관계가 깊은 경우가 많아서 이 처런 서로 호출하도록 하여 유기적 으로 연결해주면 더 좋은 코드를 얻을 수 있다 그리고 수정이 필요한경우에 적은 코드만을 변경하면 되므로 유지보수가 쉬워진다.

생성자의 매개변수로 인스턴스변수들의 초기값을 제공받는 경우가 많기 때문에 매개변수와 인스턴스변수의 이름이 일치하는 경우가 자주있다. 이때는 왼쪽코드와 같이 매개변수이름을 다르게 하는 것 보다 ‘this’를 사용해서 구별되도록 하는 것이 의미가 더 명확하고 이해하기 쉽다.

‘this’는 참조변수로 인스턴스 자신을 가리킨다. 참조변수를 통해 인스턴스의 멤버에 접근할 수 있는 것처럼,‘this’로 인스턴스변수에 접근할 수 있는 것이다.하지만, ‘this’를 사용할 수 있는 것은 인스턴스멤버뿐이다.
static메서드(클래스 메서드) 에서는 인스턴스 멤버들을 사용할 수 없는 것처럼, ‘this’ 역시 사용할 수 없다. 왜냐하면, static 메서드는 인스턴스를 생성하지 않고도 호출될 수 있으므로 static 메서드가 호출된 시점에 인스턴스가 존재하지 않을 수도 있기 때문이다.

생성자를 포함한 모든 인스턴스메서드에는 자신이 관련된 인스턴스를 가리키는 참조변수 ‘this’가 지역 변수로 숨겨진 채로 존재한다.

생성자를 포함한 모든 인스턴스메서드에는 자신이 관련된 인스턴스를 가리키는 참조변수 ‘this’가 지역 변수로 숨겨진 채로 존재한다.일반적으로 인스턴스메서드는 특정 인스턴스와 관련된 작업을 하기 때문에 자신과 관련 된 인스턴스의 정보가 밀요하지만, static 메서드는 인스턴스와 관련 없는 작업을 하기 때 문에 인스턴스에대한 정보가 필요 없기 때문이다.

5.5 생성자를 이용한 인스턴스의 복사

CarCar c) {
color = c.color; 
gearType = c.gearType; 
door = c.door;
}

Car 클래스의 참조변수를 매개변수로 선언한 생성자이다. 매개변수로 넘겨진
참조변수가 가리키는 Car인스턴스의 인스턴스변수인 color, gearType, door의 값을 인스턴스 자신으로 복사하는 것

인스턴스를 추가로 생성할 수 있 다 . Java API 의 많은클래스들이 인스턴스의 복사를 위한 생성자를 정의

class Car{
String color; //색상
String gearType;//변속기 종류=auto, manual
int door; //문의 개수

Car(){
	this("white","auto",4)
   ;
}
Car (Car c) ( // 인스턴스의 복사를 위한 생성자.
color = c.color; 
gearType = c.gearType; 
door = c.door;
}

Car(Car c)  {
color   = c.color; 
gearType = c.gearType;—►
door =c.door;
}
->
Car(Car c) {
// Car(String color,String gearType,int door) 
this(c.color, c.gearType, c.door);
}

생성자에 대해서 모르고도 자바프로그래밍이 가능했던 것을 생각한다면,생성
자는 그리 중요하지 않은 것으로 생각될지도 모른다. 하지만,지금까지 본 것처럼 생성자 를 잘 활용하면 보다 간경하고 직관적인, 객체지향적인 코드를 작성할 수 있을 것이다.
인스턴스를 생성할 때는 다음의 2가지 사항을 결정해야한다.
1. 클래스 一 어떤 클래스의 인스턴스률 생성할 것인가?
2. 생성자 一 선택한 클래스의 어떤 생성자로 인스턴스를 생성할 것인가?

profile
개발 메모창고

0개의 댓글