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

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

kkikkodev 2015. 8. 14. 17:23



관련 이론 및 문법

(HashSet 클래스 참고)

http://kkikkodev.tistory.com/215


문제 의도

주어진 소스코드를 컴파일하여 실행하였을 때의 결과를 고르는 문제입니다.


답안

D


풀이 방법

소스 코드 2 라인을 살펴보면, WrappedString 클래스가 정의되어 있는 것을 알 수 있습니다. 3 라인에는, String 형으로 s 라는 이름의 멤버 변수를 가지고 있고, 4 라인에는, 매개변수 String 형 s 를 받는 생성자가 있습니다.


프로그램이 실행되어, 5 번 라인의 main 메소드가 실행되면, 6 번 라인에서, Object 형으로 HashSet 클래스형 변수 hs 를 생성합니다. 7 번과 8 번 라인에서는, ws1, ws2 라는 이름의 WrappedString 형의 변수에 객체를 "aardvark" 라는 문자열 값으로 생성하여 각각 대입합니다. 9 번과 10 번 라인에서는, s1, s2 라는 이름의 String 형의 변수에 객체를 "aardvark" 라는 문자열 값으로 생성하여 각각 대입합니다. 11 번 라인에서, hs.add(ws1); 문장을 통해, HashSet 에 ws1 을 추가합니다. 


그리고, hs.add(ws2); 문을 통해 HashSet 에 ws2 를 추가합니다. HashSet 의 add 를 할 때, 내부적으로 같은 데이터라고 판단되면 추가하지 않는데, HashSet 이 Object 형으로 만들어졌기 때문에 기본적으로 Object 의 hashCode 와 equals 메소드가 불려져서 데이터가 같은지 판단하게 됩니다. 단, 추가하는 클래스에 따로 이 메소드들이 overriding 되어 있으면 그 메소드가 호출됩니다. 


Object 클래스는 hashCode 메소드에서는, 선언한 인스턴스 변수가 다르면 다른 해시 값을 반환하고, equals 메소드 또한 인스턴스 변수가 같은지 판단합니다. ws2 의 자료형은 WrappedString 이기 때문에, 이 클래스에는 따로 hashCode 나 equals 메소드가 overriding 되어 있지 않으므로, Object 의 메소드들이 호출됩니다. 


따라서, HashSet 에 이미 존재하는 ws1 과 새로 추가하려고 하는 ws2 는 인스턴스 변수가 다르기 때문에 다른 것으로 인식되어 추가되어 집니다. 그래서 현재 HashSet 에는 ws1 과 ws2 가 존재하게 됩니다. 이어서, hs.add(s1); 문을 통해 HashSet 에 s1 을 추가하려고 하는데, s1 은 String 형이고, String 형에는, hashCode 와 equals 메소드가 overriding 되어 있으므로, Object 것이 아닌, String 의 메소드가 호출됩니다. ws1 과 ws2 의 클래스형은 String 형이 아니라서, String 의 equals 메소드에서 다른 것으로 판단합니다. 따라서, s1 도 추가됩니다. 


마지막으로, hs.add(s2); 문을 통해 s2 를 HashSet 에 집어 넣으려고 하면, 이전과 마찬가지로, s2 는 String 형이기 때문에, 이 클래스의 hashCode 와 equals 메소드가 호출될 것이고, ws1 와 ws2 는 s2 와 다른 것으로 판단될 것입니다. 하지만, s1 과 s2 은 문자열 값이 같기 때문에 hashCode 메소드와 equals 메소드 모두 같은 데이터로 판단합니다. 따라서, s2 인스턴스는 HashSet 에 추가되지 못합니다. 따라서, HashSet 에는 최종적으로, ws1, ws2, s1 총 3 개의 인스턴스가 들어가게 되고, 12 라인에서 hs.size() 를 통해 HashSet 의 사이즈를 출력해 보면, 3 이 출력됩니다.


그래서 답안은 D 가 됩니다.