바로 코드예시를 통해서 한번 보겠습니다
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)을 호출한다면?
- 페라리 인스턴스를 생성한다
- 파라미터로 받은 "페라리"와 100을 이용하여 페라리 인스턴스 속성을 초기화한다.
- 페라리는 ("페라리",100)로 구성된 생성자를 호출한다.
- 페라리는 ("페라리",100)로 구성된 생성자를 호출한다.
- 페라리는 ("페라리",100)로 구성된 생성자를 호출한다.
...
이와 같이 this() 때문에 동일한 생성자가 무한적으로 자기 자신을 호출하게 됩니다. 그러면 Recursive constructor invocation 에러가 발생하게 된답니다! 주의해 주세요!