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

OCJP (1Z0-851 / 2012-08-28 / Exam B) - 60 번

kkikkodev 2015. 9. 10. 13:34



관련 이론 및 문법

(제네릭 범위에 따른 구분 참고)

http://kkikkodev.tistory.com/191


문제 의도

주어진 소스코드의 5 라인에, 삽입하였을 때, 경고 없이 정상적으로 컴파일되는 보기를 2 개 고르는 문제입니다.


답안

B, C


풀이 방법

소스코드를 살펴보면, Hancock 클래스가 정의되어 있고, 6 번 라인에서는 list.add("foo"); 문이 있는데, list 변수의 add 메소드를 호출하면서 "foo" 문자열을 넘기고 있습니다. 이것이 경고 없이 가능하기 위해 5 번 라인에 메소드의 시그니처 (정의부 헤더) 가 와야 하는데, 매개변수로 list 가 넘어와야 합니다.


일단 보기 A 는, 매개변수가 List list 형태로 넘어오는데, 이는 제네릭이 적용이 안 되었기 때문에, add 할 때 Object 형을 매개변수로 받습니다. 따라서 어느 형이나 넘길 수는 있지만, 추후 형변환과 같은 문제 때문에 type safety 경고를 발생시킵니다. 따라서 답안 후보에서 제외합니다.


보기 B 는, 매개변수가 List<String> list 형태로 넘어오는데, 이는 제네릭 타입으로 String 이 지정되었기 때문에, add 할 때 String 형을 매개변수로 받습니다. 따라서 답안 후보가 됩니다.


보기 C 는, 매개변수가 List<? super String> list 형태로 넘어오는데, 이는 제네릭 타입이긴 하지만, String 을 자식 클래스로 취하는 클래스 혹은 String 그 자신이 지정됩니다. 그러나 String 이 부모로 삼는 클래스는 따로 없으므로, String 만 올 수 있습니다. 따라서 add 메소드에는 String 만 넘길 수 있게 되므로 답안 후보가 됩니다.


보기 D 는, 매개변수가 List<? extends String> list 형태로 넘어오는데, 이는 제네릭 타입이긴 하지만, String 을 부모 클래스로 취하는 클래스 혹은 String 그 자신이 지정됩니다. String 클래스는 final 클래스라서, 상속할 수가 없는 구조이므로, 하지만, 매개변수로 넘어올때는 따로 에러를 내지 않지만, 실제로 add 할때 String 을 넘기면, 컴파일 에러를 발생시킵니다. 따라서 답안 후보에서 제외합니다.


결과적으로 답안은 B 와 C 가 됩니다.