생성자 설정

상속 관계에서 생성자 설정

상위 클래스에서 생성자를 만들 때 가장 중요하게 생각해야 하는 부분은 하위 클래스에서도 해당 생성자의 형태를 맞춰야 한다는 것이다. 상속 관계인 하위 클래스의 객체를 만들면 상위 클래스의 생성자가 자동으로 불러지도록 되어 있기 때문인데, 예제를 통해서 살펴본다.

데모 1 : 상위 클래스에 기본 생성자가 존재할 경우

이 경우에는 상속을 받는 데 아무런 문제가 없다. 하지만 숨겨진 코드에 대해서 이해할 필요가 있다.

Phone.java
public class Phone {
    protected String number;
}

위의 클래스를 상속받아 Galaxy20s 클래스를 만든다면 구현 시 어떠한 문제도 발생하지 않는다.

Galaxy20s.java
public class Galaxy20s extends Phone{
    
}

자바에 존재하는 자동완성 코드들은 여러 종류가 있다.

  • import java.lang.*;

  • 기본 생성자

  • super()

  • extends Object

이 중 현재 필요한 부분만 반영하여 다시 Phone과 Galaxy20s 클래스를 만들어본다면 다음과 같다.

Phone.java
public class Phone {
    protected String number;

    //모든 클래스는 별도의 생성자를 만들지 않으면 기본 생성자가 존재한다.
    public Phone(){
        super();//상위 클래스 생성자 호출 코드가 없다면 자동으로 생성된다.
    }

}
Galaxy20s.java
public class Galaxy20s extends Phone{
    //모든 클래스는 별도의 생성자를 만들지 않으면 기본 생성자가 존재한다.
    public Galaxy20s(){
        super();//상위 클래스 생성자 호출 코드가 없다면 자동으로 생성된다.
    }
}

만약 Galaxy20s의 객체를 생성한다면 숨겨진 코드를 고려하여 다음과 같은 순서를 거쳐 만들어진다.

  1. Galaxy20s의 생성자를 호출한다.

  2. super()에 의해 Phone의 생성자를 호출한다.

  3. super()에 의해 Phone의 상위 클래스 생성자를 호출한다(있다면)

  4. Phone 클래스 초기화가 완료된다

  5. Galaxy20s 클래스 초기화가 완료된다.

  6. 객체가 생성된다

  7. 객체 참조가 반환된다

자동 생성된 super() 가 자동 생성된 기본 생성자를 호출하기 때문에 아무런 오류가 발생하지 않는 것이며, 생성자를 추가할 경우 이 형태에 맞지 않으면 오류가 발생한다.

데모 2 : 상위 클래스에 기본 생성자가 존재하지 않을 경우

휴대폰 정보 관리 앱에서 사용할 휴대폰 클래스를 만든다고 가정했을 때 다음과 같은 요구사항이 있을 수 있다.

  • 모든 휴대폰에는 반드시 전화번호가 존재해야 한다

반드시 설정되어야 하는 정보는 생성자를 통해 설정하도록 구현해야 하므로 휴대폰(Phone) 클래스는 다음과 같이 구현한다.

Phone.java
public class Phone {
    protected String number;
    public Phone(String number){
        this.number = number;
    }
}

위의 Phone 클래스를 상속받는 즉시 오류가 발생한다.

Galaxy21s.java
public class Galaxy21s extends Phone {

}

이 경우 숨겨진 코드를 고려해야만 오류의 발생 원인을 찾을 수 있으며, Galaxy21s에 숨겨진 코드만 작성해보면 다음과 같다.

Galaxy21s.java
public class Galaxy21s extends Phone {
    //모든 클래스는 별도의 생성자를 만들지 않으면 기본 생성자가 존재한다.
    public class Galaxy21s(){
        super();//상위 클래스 생성자 호출 코드가 없다면 자동으로 생성된다(오류 발생)
    }
}

숨겨진 코드를 고려하면 super() 코드에서 오류가 난다는 것을 알 수 있으며, 이는 상위 클래스에서 필요로 하는 생성 정보를 맞추지 못했기 때문에 오류가 발생하는 것이다. 따라서 오류를 해결하고 상속을 완성하려면 상위 클래스 생성자를 호출하여 데이터를 전달하는 구문이 필요하다.

Galaxy21s.java
public class Galaxy21s extends Phone {
    public class Galaxy21s(String number){
        super(number);//상위 클래스의 생성자에 number를 전달한다.
    }
}

생성자를 맞추기 위해 외부에서 값을 전달받아서 상위 클래스의 생성자로 전달하는 코드를 작성하였으며, 이를 통하여 Phone 클래스를 상속받을 수 있게 되었다.

Last updated