본문 바로가기
Category/정보처리기사

상속 관계에서 생성자 호출 순서

by Corinee 2024. 10. 10.
728x90
반응형

자식 클래스의 생성자가 호출되면 부모 클래스의 생성자자동으로 먼저 호출됩니다. 이때, 기본 생성자를 명시적으로 호출하지 않으면 자식 클래스 생성자에서 암묵적으로 부모 클래스의 기본 생성자가 호출됩니다.

자세한 설명

  1. 부모 클래스 생성자 호출: 자식 클래스 생성자가 호출될 때, 자식 클래스가 부모 클래스의 필드메서드를 상속받기 때문에, 부모 클래스의 생성자가 먼저 호출되어 부모 클래스의 인스턴스가 초기화됩니다.
    • 부모 클래스의 기본 생성자가 없을 경우, 자식 클래스는 명시적으로 부모 클래스의 생성자를 호출해야 합니다. 이를 위해 super()를 사용합니다.
  2. 상속 관계에서의 생성자 호출 순서:
    • 자식 클래스의 생성자가 호출되면, 부모 클래스의 생성자가 먼저 호출되고, 그 후 자식 클래스의 생성자가 실행됩니다.

코드 분석

class Parent {
    int x = 100;

    Parent() {
        this(500);  // Parent(int x) 생성자를 호출
    }

    Parent(int x) {
        this.x = x;  // Parent 클래스의 x 값 설정
    }

    int getX() {
        return x;
    }
}
 
class Child extends Parent {
    int x = 4000;

    Child() {
        this(5000);  // Child(int x) 생성자를 호출
    }

    Child(int x) {
        this.x = x;  // Child 클래스의 x 값 설정
    }
}
 
public class Main {
    public static void main(String[] args) {
        Child obj = new Child();
        System.out.println(obj.getX());
    }
}

실행 과정:

  1. Child obj = new Child();이 호출되면, 먼저 자식 클래스의 기본 생성자 Child()가 호출됩니다.
    • this(5000);을 통해 Child(int x) 생성자가 호출됩니다.
    • Child(int x) 생성자는 this.x = 5000;을 실행하여 자식 클래스의 x 값을 5000으로 설정합니다.
  2. 자식 클래스의 생성자를 호출할 때, 부모 클래스의 생성자가 자동으로 호출됩니다.
    • Parent() 기본 생성자가 호출됩니다. 이 생성자는 내부에서 this(500);을 호출하여 Parent(int x) 생성자를 호출합니다.
    • Parent(int x)부모 클래스의 x 값500으로 설정합니다.
  3. System.out.println(obj.getX());에서 getX()부모 클래스의 메서드이므로, 부모 클래스의 x 값(500)을 출력합니다.

결과:

 
500

중요한 점:

  • 부모 생성자는 자동으로 호출됩니다. 자식 클래스의 생성자가 실행되기 전에 부모 클래스의 생성자가 먼저 실행됩니다.
  • 자식 클래스에서 super()를 사용하여 명시적으로 부모 생성자를 호출할 수 있으며, 명시적으로 호출하지 않으면 부모 클래스의 기본 생성자가 자동으로 호출됩니다.