4.1) OCJP/1Z0-851 / 2012-08-28

OCJP (1Z0-851 / 2012-08-28 / Exam C) - 2 번

kkikkodev 2016. 10. 29. 17:40



관련 이론 및 문법

(extends VS implements 참고)

http://kkikkodev.tistory.com/84


(상속관계에서 인스턴스의 대입 참고)

http://kkikkodev.tistory.com/129


(메소드 오버라이딩 (method overriding) 참고)

http://kkikkodev.tistory.com/86


문제 의도

주어진 소스코드를 컴파일한 후, 실행한 결과를 고르는 문제입니다.


답안

F


풀이 방법

소스코드를 살펴보면, 총 인터페이스 3 개와 클래스 2 개로 구성되어 있는 것을 확인할 수 있습니다. A interface 는 추상 메소드 aMethod() 를 가지고 있습니다. 또 B interface 는 추상 메소드 bMethod() 를 가지고 있습니다. C interface 는 A 와 B interface 를 상속하고 있고 (interface 상속은 다중상속 가능) 추상 메소드 cMethod() 를 가지고 있습니다. 현재 C interface 에는 A 와 B 로부터 물려받은 aMethod(), bMethod() 가 있고, 자신이 가지고 있는 cMethod() 까지 총 3 개의 추상 메소드가 존재하게 됩니다.


D class 는 B interface 를 상속하고 있고, bMethod() 를 overriding 하고 있습니다. E class 는 D class 를 상속하고 있고, C interface 를 상속하고 있습니다. 그리고, aMethod(), bMethod(), cMethod() 모두를 overriding 하고 있습니다.


일단, 코드 자체는 문제가 없으므로, compile error 가 나지 않습니다. 따라서, 보기 A, B, C 는 답안 후보에서 제외합니다.


보기 D 를 보면, D e = new E(); e.bMethod(); 문장들을 실행하면, 일단, e 는 부모 클래스인 D 형 인스턴스 변수이고, 실제 생성하는 객체는 자식 클래스인 E 형 인스턴스이기 때문에, 자식 객체를 부모형 인스턴스 변수로 가리키기 때문에, 문제가 없고, 이 때, bMethod() 를 호출하게 되면, 실제 생성된 E 형 객체에 존재하는 bMethod() 를 호출하게 됩니다. (D 의 bMethod() 는 가려지게 됩니다.) 따라서 Line 5 가 아닌, Line 9 의 bMethod() 가 호출되게 됩니다. 결과적으로 보기 D 는 답안 후보에서 제외됩니다.


보기 E 를 보면, D e = (D)(new E()); e.bMethod(); 문장들을 실행하면, 부모 클래스 D 형 인스턴스 변수 e 로, 자식 클래스형 E 형 객체를 가리키므로, 문제가 없습니다. 설사 그 객체를 부모 클래스로 강제형변환해서 대입하더라도 문제가 없습니다. 이 때에도 bMethod() 를 호출하게 되면, 실제 생성된 E 형 객체의 bMethod() 를 호출하게 되므로 Line 5 가 아닌, Line 9 의 bMethod() 가 호출되게 됩니다. 따라서 보기 E 는 답안 후보에서 제외됩니다.


보기 F 를 보면, D e = (D)(new E()); e.bMethod(); 문장들을 실행하면, 보기 E 와 마찬가지로 문제 자체는 없고, bMethod() 를 호출하면 Line 9 의 bMethod() 가 호출됩니다. 따라서 답안은 보기 F 가 됩니다.