본문 바로가기
  • _^**_
무근본 IT 지식 공유/무근본 자바(JAVA)

자바 생성자 규칙 - 상속 시 Super() 위치

by 크리드로얄워터 2023. 11. 25.
반응형

[질문사항]


package myClass;

class Parent2{
int a;
Parent2(){ //기본생성자 안쓰면 자동생성
a = 10;
}
Parent2(int n){
a = n;
}
}

class Child2 extends Parent2{
int b;
Child2() {
b=20;
super(40); //이 부분입니다.

}
public void display() {
System.out.println(a);
System.out.println(b);
}
}
public class Inheritance02 {
public static void main(String[] args) {
Child2 ch = new Child2();
ch.display();
}
}

궁금한점이 class Child2 extends Parent2 이부분에서 왜 super(40)이 b=20; 밑에 적으면 오류가 날까요?


[답변]

super(40);가 b = 20; 아래에 위치할 경우 오류가 발생하는 이유는 자바의 생성자 호출 규칙 때문입니다.


자바에서 하위 클래스의 생성자가 상위 클래스의 생성자를 호출하는 경우 (super()를 사용하는 경우), 이 호출은 하위 클래스 생성자의 첫 번째 명령문이어야 합니다.

자바에서 클래스의 인스턴스가 생성될 때, 상위 클래스의 생성자가 먼저 호출되어야 객체의 상위 부분이 먼저 초기화됩니다. 그 후에 하위 클래스의 나머지 부분이 초기화됩니다. 이러한 순서를 보장하기 위해, 자바는 상위 클래스 생성자 호출 (super())을 하위 클래스 생성자의 첫 번째 명령문으로 요구합니다.

Child2 클래스의 생성자에서 super(40);가 b = 20; 이후에 오면, 상위 클래스 Parent2의 생성자 호출이 이미 필드 초기화 이후에 이루어지게 되어 규칙을 위반하게 됩니다. 이로 인해 컴파일러는 오류를 발생시키게 됩니다.

올바르게 구현하려면, super(40);를 b = 20;보다 먼저 호출해야 합니다. 이렇게 하면 상위 클래스 Parent2의 인스턴스가 먼저 올바르게 초기화되고, 그 다음에 Child2의 필드 b가 초기화됩니다.





반응형

댓글