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

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

kkikkodev 2016. 10. 29. 17:41



관련 이론 및 문법

(인스턴스 변수로 접근할 수 있는 멤버의 범위 참고)

http://kkikkodev.tistory.com/357


문제 의도

코드를 컴파일한 후 실행한 결과를 고르는 문제입니다.


답안

F


풀이 방법

윗 부분의 주어진 코드를 살펴보면, A 라는 인터페이스가 있고,  그 안에는 x 라는 추상 메소드가 존재합니다. 그 다음 줄에는, B 라는 클래스가 A 인터페이스를 상속하고, 안에는 x 와 y 라는 메소드가 정의되어 있습니다. 그 다음 줄에는, C 라는 클래스가 B 클래스를 상속하고 있고, 안에는 x 메소드가 정의되어 있습니다. B 와 C 클래스는 x 메소드를 overriding 한 것입니다.


그리고 밑 부분의 주어진 코드를 살펴보면, 20 라인에서, java.util.List<A> list = new java.util.ArrayList<A>(); 문장을 통해서, java.util 패키지에 있는 List 인터페이스의 제네릭 타입 A 형으로 list 라는 인스턴스 변수를 선언하고, java.util 패키지의 ArrayList 클래스의 제네릭 타입 A 를 받는 생성자를 통해서 생성한 객체를 list 변수가 가리키게 하고 있습니다. 21 라인에서는 list 에 B 객체를 생성하여 추가합니다. 22 라인에서는 list 에 C 객체를 생성하여 추가합니다. 23 ~ 26 라인에서는, 확장 for 문으로 list 를 전체 반복하면서, 순서대로 요소를 A 형 인스턴스 변수 a 가 가리키게 하고, 이 a 변수를 통해서, x 메소드와 y 메소드를 호출하고 있습니다.


그러나, 변수 a 의 클래스형은 A 이기 때문에, A 에는, y 메소드가 없고, x 메소드만 있기 때문에 (추상 메소드이더라도) a.x(); 문장은 문제없이 돌아가지만, a.y(); 문장은 컴파일 에러를 발생시키게 됩니다. a.x(); 문장은, overriding 된 자식 클래스들의 x 메소드를 호출할 것입니다.


따라서, 25 라인 때문에, 컴파일 에러가 나기 때문에, 답안은 F 가 됩니다.