본문 바로가기

JAVA/복습

super & 부모생성자

super와 부모생성자

class가 인스턴스화 될 때 생성자가 실행되면서 객체의 초기화를 한다.

그때 자신의 생성자만 실행이 되는 것이 아니고, 부모의 생성자부터 실행된다.


 Car4.java ( 부모생성자 )

package Java02;

public class Car4 {
    // Car4클래스의 기본생성자
    public Car4(){
        System.out.println("Car4의 기본생성자입니다.");
    }
}

 

Truck.java ( 자식생성자 ) 

package Java02;

//Car4를 상속받은 Truck 클래스
public class Truck extends Car4{

    //Truck이라는 클래스의 기본생성자
    public Truck(){
        System.out.println("Truck의 기본생성자입니다.");
    }
}

 

TruckExam.java ( 생성자테스트 )

package Java02;

public class TruckExam {
    public static void main(String[] args) {

        Truck truck = new Truck();
    }
}

 

-- 실행

 

결과 -- > 콘솔 창에 출력된 메시지

 

 

 위와 같이 출력된 것은 왜일까?

 

객체가 생성이 될 때 반드시 생성자를 실행하고 생성이 되더라라는 것을 기억하자.

 

  • new 연산자로 Bus객체를 생성하면, Bus객체가 메모리에 올라갈 때 부모인 Car도 함께 메모리에 올라간다.
  • 생성자는 객체를 초기화하는 일을 한다.
  • 생성자가 호출될 때, 자동으로 부모의 생성자가 호출되면서 부모 객체를 초기화하게 된다.

요약. 반드시 내가 태어나기 위해서는 반드시 부모가 먼저 태어나야 한다.

 

 

 

- 정리 -

 

생성자가 하는 일은 객체를 초기화하는 일
생성자가 호출될 때 자동으로 부모의 생성자가 호출되면서 부모 객체를 초기화하게 된다.
부모의 생성자를 호출할 때는 부모 객체를 나타내는 super라는 키워드를 사용하게 된다.
부모 생성자는 super에 괄호 열고 닫고를 붙이면 부모의 생성자가 호출되게 된다.

 

Truck의 생성자가 호출됐을 때 사실은 자동으로 컴파일러는 무얼 추가시켰냐면
super(); 부모의 기본 생성자를 호출해주세요 이 부분이 추가됐을 것이다.

나를 가리키는 키워드가 this 였다면 부모를 가르키는 키워드는 super라는 것을 기억하자.


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

클래스는 기본 생성자가 없는 경우도 존재한다.

 

  public Car4(String name){
        System.out.println("Car4의 name 생성자입니다.");
    }

 

package Java02;

//Car4를 상속받은 Truck 클래스
public class Truck extends Car4{
    // Truck의 생성자가 호출됐을 때 사실은 자동으로 컴파일러는 무얼 추가시켰냐면
    //  super(); 부모의 기본 생성자를 호출해주세요 이부분이 추가 됐을것이다.

    // 나를 가르키는 키워드가 this 였다면 부모를 가르키는 키워드는 super라는 것을 기억하자.


    //Truck이라는 클래스의 기본생성자
    public Truck(){

        
        System.out.println("Truck의 기본생성자입니다.");
    }

}

Truck.java 컴파일오류 발생

이유 : 부모가 기본생성자가 없기 때문에 컴파일 오류가 발생하게 되는 것이다.

 

 

이런 문제를 해결하려면 자식 클래스의 생성자에서 직접 부모의 생성자를 호출해야 한다.

 

Truck.java

   public Truck(){

		// 문자열을 매개변수로 받는 부모 생성자를 호출
        super("트럭"); // 부모생성자 직접호출
        System.out.println("Truck의 기본생성자입니다.");
    }

 

**super 키워드는 자식에서 부모의 메소드나 필드를 사용할 때에도 쓸 수 있다.

 

 

'JAVA > 복습' 카테고리의 다른 글

클래스형변환  (0) 2021.10.11
오버라이딩(Overriding)  (0) 2021.10.11
추상클래스  (0) 2021.10.11
접근제한자  (0) 2021.10.11
패키지  (0) 2021.10.09