Q: 생성자코드오버로딩에는?? A: this()를 쓰자!

buffet_psi·2023년 2월 26일

바로 코드예시를 통해서 한번 보겠습니다

public class Car {
    String name;
    int number;
    Car(){
        this.name="이름없음";
        this.number= 0;
    }
    Car(String name, int number) {
        this.name = name;
        this.number = number;
    }
}

위의 예시에는 Car()이라는 생성자가 2개가 있습니다.
첫번째 생성자는 매게변수가 없는 생성자, 두번째는 name 과 number를 받는 생성자가 오버로딩 되어있습니다.
이 코드를 해석해보면 Car클래스의 매게변수없이 Car()를 출력해보면 초기값 "이름없음" 과 숫자는 0이 나오는 것을 알 수 있습니다.
그리고 Car클래스에 ( "내가 넣고 싶은 차이름" , 100 )
를 넣고 출력하면 "내가 넣고 싶은 차이름" , 100이 나올 수 있는걸 알 수 있습니다

그런데 위의 코드 같은 생성자끼리 너무 중복되지않나요?
this.name=~~;
this.number= ~~;
이부분들이 중복되는것을 볼 수 있습니다
프로그램밍에서 중요한건뭐? 중복성을 피하는 방법!!
그래서 등장한게 this()입니다.

this 사용예시!

public class Car {
    String name;
    int number;
    Car(){
        this("이름없음",0);
    }
    Car(String name, int number) {
        this.name = name;
        this.number = number;
    }
}

이렇게 사용하시면 오버 로딩 시 불필요한 코드 반복을 피할 수 있습니다!
근데 여기서 중요한 점은 this()는 같은 클래스 내에 있는 다른 생성자를 호출하기 위해서 사용됩니다. 만약에 위의 코드를

public class Car {
    String name;
    int number;
    Car(){
        this("이름없음",0);
    }
}
이렇게 바꾸고 Car 페라리 = new Car("페라리",100)을 호출한다면?
  1. 페라리 인스턴스를 생성한다
  2. 파라미터로 받은 "페라리"와 100을 이용하여 페라리 인스턴스 속성을 초기화한다.
  3. 페라리는 ("페라리",100)로 구성된 생성자를 호출한다.
  4. 페라리는 ("페라리",100)로 구성된 생성자를 호출한다.
  5. 페라리는 ("페라리",100)로 구성된 생성자를 호출한다.
    ...
    이와 같이 this() 때문에 동일한 생성자가 무한적으로 자기 자신을 호출하게 됩니다. 그러면 Recursive constructor invocation 에러가 발생하게 된답니다! 주의해 주세요!
profile
노력과효율!

0개의 댓글