본문 바로가기
안 씀/java-개념

상속과 생성자

by unhyepnhj 2024. 5. 21.

서브/슈퍼 클래스의 생성자 호출 및 실행 

 

new에 의해 서브 클래스의 객체가 생성될 때 슈퍼 클래스의 생성자와 서브 클래스의 생성자가 모두 실행된다

이 때 생성자의 호출 순서와 실행 순서가 반대이다. new 실행 시 서브 클래스의 생성자가 호출되고, 이는 슈퍼 클래스의 생성자를 호출한다. 호출된 슈퍼 클래스의 생성자는 자신의 코드를 실행하고, 이를 리턴하여 서브 클래스의 생성자를 실행한다.

  • 호출: 서브 → 슈퍼
  • 실행: 슈퍼 → 서브


서브 클래스에서 슈퍼 클래스의 생성자 선택

- 슈퍼 클래스와 서브 클래스 각각 생성자 여러 개 작성 가능

- 서브 클래스의 각 생성자에 대해 함께 실행될 슈퍼 클래스의 생성자를 지정해야 함

- super()을 이용하여 서브 클래스에서 슈퍼 클래스의 생성자 선택

- 명시적으로 지정하지 않을 경우 컴파일러는 자동으로 슈퍼 클래스의 기본 생성자를 호출


슈퍼 클래스의 기본 생성자가 자동 선택되는 경우

- 개발자의 명시적 지시가 없으면 서브 클래스 생성자의 매개변수와 관계없이 슈퍼 클래스의 기본 생성자가 선택

 

서브 클래스에서 지정하지 않음

지정하지 않은 경우

- B는 A를 상속

- A의 두 생성자 중 어떤 것을 호출할지 지정되지 않았으므로 자동으로 A() 호출

 

슈퍼 클래스에 기본 생성자가 없음(오류)

- B의 생성자와 짝을 이룰 기본 생성자가 존재하지 않음

- Implicit super constructor A() is undefined. Must explicitly invoke another constructer 오류 메시지 출력

 

+ 클래스에 아무 생성자도 존재하지 않는 경우에만 기본 생성자가 자동 삽입되는데, A에 이미 A(int x)가 존재하기 때문에 기본 생성자가 삽입되지 않는다. B에서 A의 어떤 생성자를 호출할 지 지정하지 않았으므로 기본 생성자 A()가 호출되어야 하는데, 앞의 이유로 A()가 존재하지 않으니 오류가 발생하는 것이다.

 

서브 클래스에 매개변수를 가진 생성자가 있음

- 서브 클래스 생성자가 기본 생성자가 아니지만 자동으로 슈퍼 클래스의 기본 생성자가 호출


super()

- 슈퍼 클래스 생성자를 호출하는 코드

- super()를 이용하여 명시적으로 슈퍼 클래스의 생성자 선택 가능

- 괄호 안에 인자를 전달하여 슈퍼 클래스의 적당한 생성자 호출

- 반드시 서브 클래스 생성자 코드의 가장 첫 라인에 위치


예제 5-3 super()를 이용하여 ColorPoint 클래스의 생성자에서 슈퍼 클래스 Point의 생성자를 호출하는 예시 작성

'안 씀 > java-개념' 카테고리의 다른 글

메소드 오버라이딩(+동적 바인딩)  (0) 2024.05.22
업캐스팅과 다운캐스팅(+instanceof 연산자)  (0) 2024.05.22
상속과 접근지정자  (0) 2024.05.21
상속  (0) 2024.05.21
final  (0) 2024.05.20