OCJP (1Z0-851 / 2012-08-28 / Exam A) - 41 번
관련 이론 및 문법
(Generic 참고)
http://kkikkodev.tistory.com/183
(확장 for 문 참고)
http://kkikkodev.tistory.com/190
(Wrapper Class 참고)
http://kkikkodev.tistory.com/189
문제 의도
주어진 소스코드는 Generic 을 사용하기 전의 메소드입니다. Generic 을 사용하여 소스코드를 고쳐서 unchecked warning 을 제거하도록, 고칠 3 부분을 고르는 문제입니다.
답안
A, C, F
풀이 방법
현재 소스코드에서 11 번 라인에 sum 메소드의 매개변수로 List 형의 변수인 list 를 받고 있는데, 여기서, 14 번 라인처럼, 이 List 의 iterator 를 가져와서 next 를 얻은 다음, 이를 무조건 Integer 로 형변환하면, 만약, List 에 Integer 가 아닌 것이 들어 갔을 수도 있기 때문에, 컴파일 타임에서 체크할 수 없는 캐스팅 에러의 위험이 존재하게 됩니다. (unchecked warning) 따라서, 이를 제거하기 위해서 List 를 확실하게 Integer 형만 받을 수 있도록 제네릭화 합니다.
먼저, 11 라인의 List list 를 List<Integer> intList 의 형태로 제네릭화된 List 로 변경합니다. (보기 F) 그리고, 13 라인에서도, 일반 Iterator 를 가져오는 형태가 아닌, Integer 형 (int 형도 상관없음) 을 지정해서 반복할 수 있는 형태로 변경하여야 합니다. 따라서, for(Iterator iter = list.iterator(); iter.hasNext();) 를 for(int i : intList) 의 확장 for 문 형태로 변경합니다. (이미 int 형으로 List 로부터 가져온 것이므로 추후, 따로 Integer 형으로 형변환할 필요가 없습니다.) (보기 C) 마지막으로, 14 번 라인 (int i = ((Integer)iter.next()).intValue();) 을 삭제합니다. (보기 A) 그 이유는, 이미 확장 for 문에서 int i 에다가 형변환해서 List 로부터 가져왔기 때문입니다.
보기 B 와 보기 D 는 제네릭을 사용하지 않고 (Iterator<Integer>) 일반 Iterator 를 사용했기 때문에 답안 후보에서 제외합니다. 보기 E 는, 제네릭은 기본자료형을 지정해 줄 수 없기 때문에 (Wrapper Class 를 대신 넣어주어야 함) 답안 후보에서 제외합니다.
결과적으로, 답안은, A, C, F 가 됩니다.