본문 바로가기
Programming/Java

자바 super()

by hyunipad 2021. 1. 6.
반응형

생성자는 상속되지 않습니다.

생성자의 기본 문법이 public 클래스명(){} 이기 때문에 클래스명이 이미 다르므로 문법에 맞지 않습니다.

서브 클래스의 인스턴스를 생성할 때는 자동으로 슈퍼클래스의 인스턴스를 먼저 생성한 후 서브 클래스의 인스턴스가 생성됩니다.

따라서 서브 클래스의 생성자를 호출하였는데 오류가 발생한다면 슈퍼클래스의 기본 생성자가 생성되어 있지 않을 확률이 높습니다.

생성자는 상속되지 않지만 부모 클래스의 생성자를 호출하는 방법은 있습니다.

 

생성자 super()


super() 메서드는 슈퍼클래스의 생성자를 호출합니다.

목적 1 ) 슈퍼클래스의 생성자 중 특정 생성자를 명시적으로 호출해야 하는 경우

슈퍼클래스에 기본 생성자 없이 파라미터 생성자만 정의할 경우

서브 클래스에서 슈퍼클래스의 기본 생성자를 호출하지 못해 오류가 발생한다.

이때 super()를 쓰면 슈퍼클래스의 생성자를 호출할 수 있다.

목적 2 ) 슈퍼클래스의 생성자에서 초기화하는 코드가 존재할 경우 중복을 제거하기 위해 super() 호출한다.

 

주의할 점

  • 생성자 super()는 반드시 생성자 내에서 첫 번째 문장으로 실행되어야 한다.
  • 생성자 내에서 super()와 this()를 동시에 사용 불가능하다.

 

코드 예시


package hyuni;

public class Spierman {

     public static void main(String[] args) {

     }

}

class Person { // 슈퍼클래스 정의

     String name;
     int age;

     public Person() {}; // 기본 생성자 정의

     public Person(String name, int age) { // name, age를 받아 초기화 하는 생성자 정의

          super(); // Object 의 생성자 호출 !
          this.name = name;
          this.age = age;
     }
}

class Spiderman extends Person{ // Person을 상속받은 Spiderman 서브클래스

     boolean spiderMode; // 스파이더맨 모드 온오프

     public Spiderman() { // 서브클래스의 기본 생성자
          super("피터파커", 25); // 슈퍼클래스의 생성자를 호출하여 초기화 ! 코드를 절약할 수 있다.
     }

     public Spiderman(boolean spiderMode) { // 서브클래스의 멤버변수를 받아 초기화 하는 생성자 정의
          super(name, age); // name과 age는 슈퍼클래스의 생성자를 호출하여 정의
       // this.name = name , this.age = age => super(name, age); // 코드를 절감할 수있다.
         this.spiderMode = spiderMode; // 자신의 멤버변수만 직접 초기화
}

}

 

반응형

댓글