본문 바로가기
Java

[Java] 상위 클래스를 상속받는 하위 클래스에 대해서 / default 생성자 자동 생성 / super() 예약어를 통한 생성자 호출

by bkuk 2022. 9. 29.

 

default 생성자

 

인스턴스를 생성할 때 new 연산자를 이용해서 생성자를 호출하게 됩니다.

 

생성자를 별도로 정의하지 않았다면, 컴파일러는 자동적으로 default 생성자를 생성하고 호출을 합니다.

 

하지만 매개변수를 갖는 생성자를 정의했다면,

컴파일러는 default 생성자를 해주지 않으며 컴파일 오류가 발생합니다.

 

 

한번 더 강조하지만,

인스턴스를 생성하기 위해서는 반드시 생성자를 호출해야 합니다.

 

 

상위 클래스로부터 상속받은 메소드 및 필드는 상위 클래스에 정의된 것입니다.

상위 클래스의 생성자가 호출되어야 하위 클래스에서 사용이 가능하다고 알고 있어야합니다.

 

 

 

아래 예제 코드를 같이 보시면 이해가 빠르실 겁니다.

class Parent {
    
    // 상위 클래스의 생성자
    Parent() {
        System.out.println( "Parent 생성자 호출 :" + this );
    }
}

class Child extends Parent{

	// 하위 클래스의 생성자
    Child() {
        System.out.println( "Child 생성자 호출 :" + this );
    }
}


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

		// 하위 클래스의 인스턴스 생성
        Child c = new Child();
        
    }
}

 

상위 클래스와 하위 클래스의 생성자를 정의하고, main 메서드를 통해 인스턴스를 생성했습니다.

 

 

하위 클래스의 인스턴스 생성시,

하위 클래스의 생성자와 상위 클래스의 생성자가 호출되어 위와 같이 출력된 것을 확인할 수 있습니다.

순서는 상위 클래스의 생성자가 먼저이며, 하위 클래스의 생성자가 뒤에 호출되었습니다.

 


 

상위 클래스에 default 생성자가 없는 상황.

즉, 상위 클래스의 매개변수만 갖는 생성자만 있다는 가정입니다.

class Parent {
    
    Parent( int i ) {
        System.out.println( "Parent 생성자 호출 :" + this );
    }
}

class Child extends Parent{

    Child() {
        System.out.println( "Child 생성자 호출 :" + this );
    }
}


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

        Child c = new Child();
    }
}

 

부모 클래스의 생성자로 인한 오류가 발생했다고 컴파일 오류가 출력됩니다.

 

 

오류의 발생 원인상위  클래스의 매개변수를 갖는 생성자를 호출할 수 없기 때문입니다.

따라서 상위 클래스의 생성자를 반드시 호출을 해야 합니다.

 

 

이때 오류 해결방법 중 하나상위 클래스의 기본 생성자를 추가할 수 있습니다.

 

하지만 좋은 방법은 아닙니다.

그렇다면, 매개변수를 갖는 생성자의 호출 방법을 아래 소스코드를 통해서 알아봅시다.

 

class Parent {
    
    Parent( int i ) {
        System.out.println( "Parent 생성자 호출 :" + this );
    }
}

class Child extends Parent{

    Child() {
        super( 10 );
        System.out.println( "Child 생성자 호출 :" + this );
    }
}


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

        Child c = new Child();
        System.out.println( c );
    }
}

하위 클래스의 생성자의 첫 줄에 super()라는 키워드를 추가했습니다.

 

 super는 부모를 의미하며,

괄호( ) 안에 매개값을 전달하여 상위 클래스의 생성자를 호출하게 됩니다.

 

 

이때 주의해야 할 내용이 있습니다.

super()는 반드시 하위 클래스 생성자의 첫 줄에 위치하여야 하며 ,

상위 클래스의 생성자 매개변수와 동일한 자료형으로 작성해야 합니다.

 


 

이제 위에 내용을 정리해보겠습니다.

컴파일러는 

하위 클래스로 인스턴스를 생성할 때 자동적으로 상위 클래스의 default 생성자가 생성되며 호출된다.

 

상위 클래스의 생성자가 매개변수를 가지고 있다면 하위 클래스를 인스턴스화할 때 자동으로 호출되지 않는다.

 

따라서, 하위 클래스의 생성자에서 명시적으로 부모 생성자를 호출해야 한다.

이때 사용되는 키워드가 super() 이며,

단, super()를 사용할 때는 하위 클래스의 생성자 첫 줄에 위치하여야 한다.

 

 

 

댓글