11.3 What is the output of the following code?
```
public class Test1 {
public static void main(String[] args) {
ChildClass c = new ChildClass();
c.print();
}
}
class ParentClass {
int id = 1;
void print() {
System.out.println(id);
}
}
class ChildClass extends ParentClass {
int id = 2;
}
```
A. 0
B. 1
C. 2
D. Nothing
저는 메인메소드에서
1. c = new ChildClass();에서 부모 생성자가 생성되면서 1을 출력하고,
2. c.print(); 에서 1을 출력한 이후, 2를 출력할거라고 기대했는데
1만 출력되는 이유를 좀 설명해 주십시요.
sehongpark님의 답변
# 변수의 활동영역(scope)
## 요약
print() 메소드의 정의 영역이 ParentClass 이므로, print() 메소드에서 출력하는 id 값은 ParentClass의 id 값인 1이 출력 됩니다.
## 비판
제시된 코드 자체가 좋지 않습니다. 일반적으로 부모클래스에서 가지고 있는 필드명을 자식클래스에서 똑같이 정의하는 경우는 없습니다. 문제를 위한 문제인듯 하네요.
## 설명
메인 메소드에서 ChildClass 객체를 생성하고 print() 메소드를 수행하고 있습니다.
```
ChildClass c = new ChildClass();
c.print();
```
print() 메소드는 ParentClass에서 정의되고 있구요.
```
class ParentClass {
int id = 1;
void print() {
System.out.println(id);
}
}
```
print() 메소드는 id 값을 출력하는데, 여기서 id 값은 ParentClass의 인스턴스변수인 id 즉 1이 출력이 됩니다. 왜냐하면 print() 메소드가 ParentClass에 정의되어 있기 때문입니다. 변수의 활동영역(scope) 개념을 확인해주세요.
만약 print() 메소드가 ChildClass 에서 정의가 되었거나, 또는 오버라이딩(재정의) 되었다면, id의 출력값은 2가 되었을 것입니다.