[프로그래머스 자바 입문] super와 부모 생성자

1 분 소요

부모 생성자

  • 클래스가 인스턴스화될 때, 생성자가 실행되면서 객체의 초기화를 한다. 이 때, 자신의 생성자만 실행되는 것이 아니고 부모의 생성자부터 실행된다.

    public class Car { // 부모 클래스
      public Car() {
        System.out.println("Car의 기본 생성자입니다.");
      }
    }
      
    public class Bus extends Car { // 자식 클래스
      public Bus() {
        System.out.println("Bus의 기본 생성자입니다.");
      }
    }
      
    public class BusExam {
      public static void main(String[] args) {
        Bus b = new Bus(); // 자식 클래스의 객체 생성
      }
    }
    
    • 실행 결과

      Car의 기본 생성자입니다.
      Bus의 기본 생성자입니다.
      
      • new 연산자로 Bus 객체를 생성하면, Bus 객체가 메모리에 올라갈 때 부모인 Car도 함께 메모리에 올라간다.
      • 생성자는 객체를 초기화하는 역할.
      • 생성자가 호출될 때 자동으로 부모의 생성자도 호출되면서 부모 객체도 초기화한다.
  • 이러한 부모 클래스의 생성자 호출은 모든 클래스의 부모 클래스의 Object 클래스의 생성자까지 계속 거슬러 올라가며 수행된다.

super 키워드

  • 자신을 가리키는 키워드가 this라면, 부모를 가리키는 키워드는 super.
  • 부모 클래스로부터 상속받은 필드메소드를 자식 클래스에서 참조하는 데 사용하는 참조 변수.

super()

  • 부모의 생성자를 의미.
  • 부모의 생성자를 임의로 호출하지 않으면, 부모 클래스의 기본 생성자가 자동으로 호출된다.
    • 자바 컴파일러는 부모 클래스의 생성자를 명시적으로 호출하지 않는 모든 자식 클래스의 생성자 첫 줄에 자동으로 super();를 추가한다.
  • 아래 예제는 super()를 호출할 때와 하지 않을 때 모두 부모 클래스의 기본 생성자를 호출하므로 결과가 같다.

    // 자식 클래스 생성자
    public Bus() {
      // 부모 클래스 기본 생성자 자동 호출
      System.out.println("Bus의 기본 생성자입니다.");
    }
      
    public Bus() {
      // 부모 클래스 생성자 직접 호출
      super(); 
      System.out.println("Bus의 기본 생성자입니다.");
    }
    

부모의 기본 생성자가 아닌 다른 생성자를 호출하는 방법

  • 클래스의 기본 생성자가 없는 경우도 존재

    // 부모 클래스
    public class Car { 
      // 사용자 정의 생성자
      public Car(String name) {
        System.out.println(name + " 을 받아들이는 생성자입니다.");
      }
    }
    
  • 부모 클래스의 기본 생성자가 없으므로, 자식 클래스에서 부모 클래스의 기본 생성자를 호출하면 오류가 발생한다.
  • 따라서, 자식 클래스의 생성자에서 직접 부모 클래스의 생성자를 호출해야 한다.

    // 자식 클래스 생성자
    public Bus() {
      // 문자열을 매개변수로 받는 부모 생성자 호출
      super("소방차");
      System.out.println("Bus의 기본생성자입니다.");
    }
    
  • 💡 이와 같은 오류를 방지하기 위해, 매개변수를 가지는 생성자를 선언해야 할 경우에는 되도록이면 기본 생성자까지 명시적으로 선언하는 것이 좋다.

    // 부모 클래스
    public class Car { 
      
      // 기본 생성자
      public Car() {
        System.out.println("Car의 기본 생성자입니다.");
      }
      
      // 사용자 정의 생성자
      public Car(String name) {
        System.out.println(name + " 을 받아들이는 생성자입니다.");
      }
        
    }
    

출처