본문 바로가기

Java

상속과 생성자

자바에서 사용되는 상속에 대해서 정리 해본다.

GrandFather
Father
Son

이 3가지의 클래스가 있고 각각 상위의 클래스를 상속받고 있다 라고 한다면

public GrandFather {
...
}


public Father extends GrandFather {
...
}

public Son extends Father {
...
}


Son son = new Son();

이렇게 Son을 생성한다면 어떻게 될까나..~

기본적으로 상속을 받은 후 하위의 클래스 인스턴스를 생성할때는

상위 클래스의 생성자를 호출해 주어야 한다.

위와 같은 경우에는 디폴트 생성자에서 그 역할을 해주기 때문에

오류가 나지 않는다.

즉 Son의 디폴트 생성자에서 Father의 디폴트 생성자를 호출하고

Father의 디폴트 생성자에서 GrandFather의 디폴트 생성자를 호출하게 된다.


그럼 아래와 같은 경우를 보자.

public class Father {
private String name = "";

public Father(String name) {

this. name=name;

}


public class Son extends Father {

public Son (String name) {
}


public static void main(String[] args) {
 Son son = new Son("이름");
}


위의 소스는 어떨까?

컴파일에러가 발생하게 된다. 왜냐하면 Father의 생성자를 오버라이드 했기 때문에

Father의 디폴트 생성자는 사용 할 수 없게 되고, Son의 인스턴스를 생성할때
Father의 생성자를 호출해주지 않았으므로, 에러가 발생하는 것이다.

아래의 경우에는 에러가 발생하지 않는다.

1. Father의 생성자를 디폴트 생성자로 정의.
혹은
1. Son의 생성자에서 super(name); 을 호출
혹은
1. Father에 디폴트 생성자를 추가.

요는 최하위 클래스의 인스턴스를 생성 하게 되면 최상위부터 차상위까지 클래스들의
인스턴스까지 생성이 되게 된다. 클래스가 생성이 되면서 가장 먼저 실행하게 되는 것이 바로 생성자 메서드인데, 만일 디폴트 생성자 대신 오버로드한 생성자가 존재하고, 하위 클래스에서 상위 클래스의 이 오버로드된 생성자를 호출하지 않는다면, 생성자를 실행하지 못해 컴파일 에러가 발생하는 것이다.

참고 : jabook