자식 클래스 객체 생성시 부모 클래스의 생성자 호출 방식

Hyun·2023년 3월 29일
1

자바 문법

목록 보기
6/8

<상속 관계에 있는 class 간 생성자 호출 규칙>

  • subclass 객체 x 생성 시 최상위 class 생성자부터 아래로 내려오며 x 의 생성자까지 차례로 호출된다.
  • (특정 생성자를 지정하지 않으면) default 로 각 class 의 기본 생성자가 호출됨
  • defualt 생성자는 사용자가 직접 정의한 특정 생성자가 없을 때만 자동으로 추가됨

자식 클래스의 객체를 생성할때 부모 클래스의 "기본 생성자"를 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(...) 메서드를 사용할 수 있다.

profile
better than yesterday

0개의 댓글