이 문제는 생성자 호출 흐름, this 키워드 등의 개념을 알고 있는지 확인하는 문제이다.
먼저 풀어보고, 풀이 확인!
class Parent {
int x = 100;
Parent() {
this(500);
}
Parent(int x) {
this.x = x;
}
int getX() {
return x;
}
}
class Child extends Parent {
int x = 1000;
Child() {
this(5000);
}
Child(int x) {
this.x = x;
}
}
public class Main {
public static void main(String[] args) {
Child obj = new Child();
System.out.println(obj.getX());
}
}
더보기
[ 답 ]
500
[ 풀이 ]
이 문제에서 알아야 할 것은 두 가지가 있다.
첫 번째는 Parent에 있는 x와 Child에 있는 x는 서로 다른 x라는 것을 알아야 한다.
두 번째는 객체가 생성되는 흐름을 알아야 한다.
Main에서 Child()를 호출할 때, 자식 생성자보다 부모 생성자가 먼저 호출되므로 아래와 같은 흐름을 따른다.
기본 Parent() 호출 → Parent() → this(500) → Parent(int x) 호출 → Parent.x = 500 (부모 필드 설정)
이후 자식 생성자가 호출되기 때문에 아래의 흐름도 발생한다.
Child() → this(5000) 호출 → Child(int x) 호출 → Child.x = 5000 (자식 필드 설정)
결과적으로 Parent.x = 500, Child.x = 5000 이라는 값이 설정된다.
Main에서는 obj.getX() 를 호출했는데, 해당 함수는 Parent에서만 정의되어 있기 때문에 Parent의 값을 참조한다.
따라서 출력되는 값은 500