java에서 map, set 계열을 다룰 때 전체 원소들을 순회해야 할 때가 있습니다. 이 때 어떻게 해야 하는지 간단하게 알아보겠습니다.

 


 보통 map 계열 중에서는, treemap과 hashmap의 사용 빈도가 꽤 높은 편인데요. 이는 hash 계열은 equal 쿼리에, tree 계열은 range 쿼리에 매우 유리한 구조이기 때문입니다. 그리고 저는 농담처럼 자바에서는 TreeMap만 알고 있으면 풀 수 있는 코딩테스트 문제가 상당히 많을 거다. 라는 말도 하는데요. equal 쿼리도 성능이 그렇게 썩 나쁜 편이 아니기 때문입니다. 로그 복잡도로 찾아도 나름 빠르기도 하고요.

 

 

 먼저, Map에서의 Key, Value 쌍을 모두 순회하기 위해서는, keySet을 이용해야 합니다. 이것은 Map에 있는 key들의 Set을 리턴해 주는 역할을 합니다. 즉, map 안에 키가 1, 3, 4, 7이 있다면 이들을 모아놓은 set을 돌려주게 됩니다.

 

 

 0이상 4000 미만의 정수들 중에서 3의 배수만 키 값으로 넣습니다. 그리고 value 값은 키 값의 2배로 설정했는데요. 7번째 줄을 보시면, hm.keySet()을 가지고 향상된 for 문을 돌리는 것을 알 수 있어요. hm.get(cur)는 키 값이 cur인 것의 value 값을 얻어옵니다.

 

 

 실행 결과는 위와 같습니다.

 

 


 Set 계열은 어떨까요? 다른 점은 별로 없습니다.

 

 

 7번째 줄을 보시면 Set 객체인 hm을 그대로 향상된 for문에 넣고 있음을 알 수 있어요.

 

 

 이는 기본적으로 iterator가 map.keySet()의 iterator를 리턴하기 때문입니다. 그러면, map은 무엇일까요?

 

 

 단순하게, Set 밑에 들어있는 map입니다. hashSet 안에는 hashMap이 들어있고, TreeSet 안에는 NavigableMap이 들어 있습니다. backing map이라고 주석에서 설명하고 있는데요. 한 마디로 set 안에 map이 포장된 셈입니다.

 

 

 보시면, 정확하게 Map이 있음을 알 수 있어요.

 

 

 실행 결과는 위와 같습니다. HashSet에 있는 모든 키들을 순회하였습니다.