본문 바로가기
Java의 정석/객체지향 프로그래밍 II

생성자 super()

by Hwanii_ 2023. 6. 5.
728x90

마치, 참조변수 this와 생성자 this()와 마찬가지로,

참조변수 super 와 생성자 super()는 완전 다른 개념이다.

 

 

생성자의 첫 줄에 호출 하지 않으면 뜨는 에러

 

1. 자식 클래스 내부의 생성자에서 부모의 멤버변수를 직접 초기화 해도 오류가 뜨지는 않는다.

 

2. 하지만 절대로 그렇게 부모의 멤버변수를 자식이 직접 초기화 하지 않는다.

 

3. 부모의 멤버변수는 부모 자기 자신이 직접 초기화를 한다.

어떻게 ?  super() 메서드를 통해 본인의 생성자를 호출 해서.

 

 

 

 

1. 부모의 멤버변수 x와 y를 상속받았기에, 

자식은 this.x와 this.y로 표현이 가능하다.

 

2. 같은말로, 부모의 멤버변수 x와 y이기에

자식에서 부모의 멤버변수를 사용한다는 의미로,

super.x와 super.y로 표현이 가능하다.

 

3. 암튼, 위에처럼 하지 않고 아래와 같이 표현 한다.

 

 

1. super(x,y) 

인자 두개짜리 자기 자신의 생성자를 호출 한다는 의미.

즉, super(x,y) == Point(int x,int y) 이다.

 

[ 예시 ]

 

 

 

 

1. 위처럼, super()을 직접 호출하지 않게되면,

컴파일러는 자동으로 super()을 호출하게 된다.

 

2. 근데 오류가 뜨는 모습을 볼 수 있다.

왜 ? 부모 클래스에 인자 0개짜리 생성자가 없기 때문 이다.

 

3. 이미 부모 클래스에는 인자 2개짜리 생성자가 있기 때문에,

디폴트 생성자가 생성 될 수 없는 상황 이다.

 

4. 뭐.. 만약에 그래서 인자 0개 짜리 생성자를 부모 클래스에 만들어 주면

해결이 되기는 하는데, 이렇게는 하지 않는다.

 

 

이렇게 하면, 빨간 밑줄은 사라지는 모습을 볼 수 있다.

 

5. 그렇지만, 위에 말했듯이 이렇게 코드를 작성하지 않는다.

왜 ?

 

이유 : 

설계를 충분히 하고, 코딩에 들어가는게 순서 이다.

이러한 상황은, 설계의 문제가 아니라 코딩의 문제 이다.

만약, 디폴트 생성자를 (인자 0개 짜리 생성자)를 새롭게 만들어주면,

이것은 설계 자체를 바꿔버리는 행동이기에

이렇게 해결하지 않는다.

 

 

[ Console ]

 

반응형

'Java의 정석 > 객체지향 프로그래밍 II' 카테고리의 다른 글

캡슐화와 접근 제어자  (0) 2023.06.06
제어자  (0) 2023.06.06
참조변수 super  (0) 2023.06.05
오버라이딩 (Overriding)  (0) 2023.06.05
단일 상속 (Single Inheritance), Object클래스  (0) 2023.06.05