자식 클래스의 객체를 생성할때 부모 클래스의 "기본 생성자"를 default 로 호출한다. 만약 자식 클래스 생성자에서 부모 클래스의 특정 생성자를 호출하지 않으면서 부모 클래스에 기본 생성자가 존재하지 않는 경우, 자식 클래스 객체 생성시 에러가 발생한다.
예제를 통해 알아보자. AniOne 클래스를 상속받는 자식 클래스 AniTwo, 실행 함수 클래스 study 가 있다.
AniOne.java
package study;
public class AniOne {
//필드 선언할때 초기화 안해준 상태에서 다른 클래스에서 매개변수 초기화없이 생성할때 실험
public int num;
public AniOne(int num) {
this.num = num;
System.out.println("AniOne custom 생성자!");
}
}
AniTwo.java
package study;
public class AniTwo extends AniOne{
public AniTwo(){
System.out.println("AniTwo 기본 생성자");
}
}
study.java
package study;
public class study{
public static void main(String[] args) {
// TODO Auto-generated method stub
AniTwo ani2 = new AniTwo();
System.out.printf("%d", ani2.num);
}
}
위 상황의 경우 커스텀 생성자가 정의되어 있기 때문에 default로 호출하는 기본 생성자가 컴파일 시 자동으로 추가되지 않는다. 따라서 기본 생성자를 호출할 수 없어 에러가 발생한다.
위 문제를 해결하기 위해서는 부모 클래스에 기본 생성자를 추가하거나, 자식 클래스의 생성자에서 부모 클래스의 특정 생성자(기본 생성자X)를 호출하면 된다.
부모 클래스의 기본 생성자가 아닌 특정 생성자를 호출하기 위해선 super(...) 메서드를 자식 클래스 생성자의 중괄호 제일 상단에 적으면 해당 매개변수 전달 형식과 맞는 특정생성자가 호출된다.
방법 1) 부모 클래스에 기본 생성자를 추가하거나,
package study;
public class AniOne {
//필드 선언할때 초기화 안해준 상태에서 다른 클래스에서 매개변수 초기화없이 생성할때 실험
public int num;
public AniOne() {
this.num = 1;
System.out.println("AniOne 기본 생성자!");
}
public AniOne(int num) {
this.num = num;
System.out.println("AniOne custom 생성자!");
}
}
방법 2) 자식 클래스 생성자에서 부모 클래스의 특정 생성자(기본 생성자X)를 호출한다.
package study;
public class AniTwo extends AniOne{
public AniTwo(){
super(100);//예시
System.out.println("AniTwo 기본 생성자");
}
}
<정리>
자식 클래스의 객체 생성 시 default 로 부모 class 의 "기본 생성자" 가 호출됨을 유의하자. 기본 생성자가 없을 경우 기본 생성자를 추가하거나 특정 생성자 호출을 위해 super(...) 메서드를 사용할 수 있다.