Java 상속 - super 생성자

상속 관계 클래스로 인스턴스를 생성한 경우 메모리 내부에는 자식과 부모 클래스가 만들어진다. Child 생성 시 부모인 Parent 와 함께 만들어진다. 생성자가 필요한 경우 부모 자식 각각 호출이 필요하다.

즉, 상속 관계로 자식 클래스가 생성자가 필요한 경우,
자식 클래스는 부모 클래스 생성자를 호출되어야 한다.


예제 코드

다음과 같이 클래스를 만들도록 한다.

src
└ex2 (+)
    ├ClassA.java (+)
    ├ClassB.java (+)
    └ClassC.java (+)

ClassA.java

  • 생성자를 포함한 최상위 ClassA 클래스를 생성한다.
package ex2;

public class ClassA {

    public ClassA() {
        System.out.println("ClassA Constructor");
    }
}

ClassB.java

  • ClassA 상속 받아 ClassB 클래스를 생성한다.
  • 파라미터 인자 1개의 생성자를 생성한다.
  • 파라미터 인자 2개의 생성자를 생성한다.
  • 각 생성자는 첫 줄에 super(...); 사용해서 부모 클래스 생성자를 호출해야 한다.
    • 예외로 첫 줄에 this(...) 사용 할 수 있다. 하지만 this 넘어간 생성자에서 super() 호출은 필수이다.
  • 부모 클래스 생성자가 파라미터가 없는 생성자라면 super() 키워드를 생략 가능하다.
    • 자바에서 편의로 기본생성자를 호출하는 super() 자동으로 넣어준다.
package ex2;

public class ClassB extends ClassA {

    public ClassB(int x) {
        super(); // 생략해도 컴파일에서 자동으로 입력함
        System.out.println("ClassB x = " + x);
    }

    public ClassB(int x, int y) {
        super(); // 생략해도 컴파일에서 자동으로 입력함
        System.out.println("ClassB x = " + x);
        System.out.println("ClassB y = " + y);
    }
}

ClassC.java

  • ClassB 상속 받아 ClassC 클래스를 생성한다.
  • 파라미터가 없는 기본 생성자 super(); 호출 할 수 없다.
    • 상위 클래스 ClassB 파라미터가 있는 생성자로 생성하였기에 기본생성자가 없어졌다.
    • 만약 super(); 사용하고 싶다면, ClassB 에서 public ClassB() {}; 생성자를 만들어야 한다.
package ex2;

public class ClassC extends ClassB {
    public ClassC() {
        super(100, 99);
        System.out.println("ClassC Constructor");
    }
}

Main.java

package ex2;

public class Main {
    public static void main(String[] args) {
        ClassC class1 = new ClassC();
    }
}

실행결과

ClassA Constructor
ClassB x = 100
ClassB y = 99
ClassC Constructor

코드 실행 결과를 보듯이 부모의 부모를 부르고 부모의 부모가 코드를 실행되고, 자식의 코드가 실행되고 이어서 자식의 코드를 extend 하게 타고 가는 것을 볼 수 있다.

요약

  • 상속 관계의 생성자 호출은 부모에서 자식 순서로 코드가 실행한다.
    부모의 데이터를 먼저 초기화하고 이어서 자식의 데이터 초기화가 필요하다.
  • 자식 클래스에서 생성자는 첫 줄에 super() 키워드를 호출한다.
    • 부모가 기본 생성자인 경우 생략 가능