OCJP (1Z0-851 / 2012-08-28 / Exam C) - 23 번
관련 이론 및 문법
(HashSet 클래스 참고)
http://kkikkodev.tistory.com/215
문제 의도
다음 보기 중 참인 것을 고르는 문제입니다.
답안
B
풀이 방법
주어진 코드를 살펴보면 Person 클래스가 있고, 멤버 변수로는 String 형 name 변수가 있습니다. String 형 name 을 매개변수로 받는 매개변수 생성자가 있고, equals 메소드가 overriding 되어 있습니다. equals 메소드에서는 현재 객체의 name 과 매개변수로 받은 Person 객체의 name 을 비교하여 같으면 true, 다르면 false 를 반환하도록 재정의 되어 있습니다.
보기 A 를 보면, hashCode 메소드를 overriding 하지 않아서 컴파일 오류가 난다고 했는데, 실제로 hashCode 메소드 overriding 은 선택적이므로 컴파일 오류는 나지 않습니다. 따라서 답안 후보에서 제외합니다.
보기 C 는, Person 객체는 hashCode 메소드가 overriding 되어 있지 않아서 같은 hash code 값을 가질 수 있다고 했는데, hashCode 메소드가 overriding 되어 있지 않으면, Object 클래스의 hashCode 메소드가 호출되므로, Object 클래스의 hashCode 메소드는 다른 객체라면 다른 정수의 해시코드 값을 반환하도록 정의되어 있습니다. 따라서 답안 후보에서 제외합니다.
보기 D 는, 만약 HashSet 이 name 이 Fred 인 Person 객체를 하나 이상 포함하고 있다면, name 이 Fred 인 Person 객체를 삭제하면, name 이 Fred 인 다른 모든 객체들도 삭제된다고 했는데, 이는 맞지 않습니다. HashSet 에서 추가하거나 삭제할 경우에는 기본적으로 hashCode 메소드의 결과값에 따라서 객체를 검색하기 때문에, name 이 같더라도 hashCode 는 각각 다르기 때문에 서로 다른 군에 저장되어 있을 확률이 큽니다. 따라서 한 객체를 검색 성공하여 삭제에 성공했다 하더라도 다른 객체가 지워지는 경우는 없으므로 답안 후보에서 제외합니다.
보기 B 는, 한 HashSet 은 같은 이름을 가지는 다수의 Person 객체를 포함할 수 있다고 나와있는데, 이것은 맞는 말입니다. 왜냐하면, HashSet 에 객체를 추가하면, 먼저 hashCode() 메소드를 호출하여 그 결과값을 가지고 같은 것들끼리 묶어서 저장을 하는데, 이 Person 객체는 hashCode 메소드를 overriding 하지 않았으므로 Object 클래스의 hashCode 메소드가 대신 호출되게 되고, 이 hashCode 메소드는 객체마다 고유한 정수값을 반환하도록 정의되어 있어서, 같은 name 값을 가지는 Person 객체이더라도 서로 다른 객체라면 무조건 hashCode 값이 다르게 됩니다. 따라서 다른 군으로 분류될 확률이 높아집니다. (운 좋게 같은 버킷으로 분류될 수도 있지만)
결과적으로 답안은 B 가 됩니다.