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만 출력되는 이유를 좀 설명해 주십시요.
# 변수의 활동영역(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가 되었을 것입니다.