관련 이론 및 문법

(HashSet 클래스 참고)

http://kkikkodev.tistory.com/215


(Wrapper Class 참고)

http://kkikkodev.tistory.com/189


문제 의도

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


답안

B


풀이 방법

이 문제는 HashSet 클래스에 대한 문제입니다. 소스코드가 실행되어 main 메소드가 호출되면, HashSet<Integer> 객체를 set 이라는 이름의 인스턴스 변수로 생성합니다. 그리고, Integer 형 i1 변수에 45 를 대입하고 (Auto Boxing) Integer 형 i2 변수에 46 을 대입합니다. (Auto Boxing)


그 다음에, set 에 i1 을 add 합니다. 이 때에는 set 에 아무 데이터도 없기 때문에, 바로 추가됩니다. 그 다음 라인에서, 또 i1 을 set 에 add 합니다. 이 때는, HashSet 에서 내부적으로 hashCode 메소드와 equals 메소드를 호출하여 데이터가 서로 같은지 판단하고, 같으면, 넣지 않고, 다를 때에만 데이터를 추가합니다. Integer 클래스의 hashCode 와 equals 메소드는 실제 정수 값이 같기만 하면, 같은 데이터라고 간주하기 때문에, 기존의 HashSet 에 있는 i1 (정수값은 45) 과 새로 넣으려는 i2 (정수값은 45) 이 같다고 판단되어 i2 를 추가하지 않게 됩니다. 


그 다음 라인에서는 i2 를 HashSet 에 add 합니다. i2 는 정수값이 46 이기 때문에 기존 HashSet 의 데이터인 i1 (정수값은 45) 과 다르다고 판단되어 추가됩니다. 여기까지, HashSet 의 현재 데이터들은 i1 (정수값은 45), i2 (정수값은 46) 총 2 개가 됩니다. 따라서, set.size() 를 화면에 출력하면 2 가 출력이 됩니다.


그 다음에, set.remove(i1); 문을 통해서, i1 을 HashSet 에서 찾아서 삭제합니다. (i1 과 정수값이 같은 데이터를 찾아서) 그러면, 현재 HashSet 에는, i2 (정수값 46) 만 남아 있게 됩니다. 또, set.size() 를 화면에 출력하면 1 이 출력 됩니다.


마지막으로, i2 인스턴스 변수에 47 을 대입합니다. (현재 HashSet 에는 i2 의 복사본이 이미 들어 있고, 이 HashSet 의 i2 까지 47 로 바뀌지 않습니다.) 그 다음 라인에서, set.remove(i2); 문을 통해 HashSet 에서 i2 (정수값 47) 를 삭제하려고 하지만, 47 이라는 정수값을 지닌 데이터가 HashSet 에 없기 때문에 삭제에 실패합니다. 따라서 set.size() 를 출력하면 그대로 1 이 출력 됩니다.


결과적으로 정답은 B (2 1 1) 가 됩니다.


by kkikkodev 2015. 8. 19. 18:01