Java에서 Map(맵) 데이터를 다루다 보면 저장된 요소를 하나씩 확인해야 하는 경우가 자주 있습니다. 이 글에서는 Java에서 Map을 순회(iterate)할 수 있는 대표적인 여러 가지 방법을 예제 코드와 함께 살펴봅니다. 특히 Java 8부터는 forEach 메서드와 Iterator 클래스를 활용해 더욱 간결하게 맵을 반복 처리할 수 있습니다.
1. Map 엔트리(키와 값) 함께 순회하기
entrySet()을 사용하면 키와 값을 동시에 꺼낼 수 있습니다. 키와 값이 모두 필요할 때 가장 효율적이고 일반적으로 권장되는 방식입니다.
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}
2. 키(Key)만 순회하기
키 목록만 필요하다면 keySet() 메서드를 사용하면 됩니다.
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (Integer key : map.keySet()) {
System.out.println("Key = " + key);
}
3. 값(Value)만 순회하기
저장된 값만 확인하고 싶은 경우에는 values() 메서드를 활용합니다.
for (Integer value : map.values()) {
System.out.println("Value = " + value);
}
- Java에서 ArrayList 순회하는 방법
4. Iterator 사용하기
반복자(Iterator)를 직접 사용하는 방식으로, 순회 도중 조건에 따라 요소를 제거해야 할 때 특히 유용합니다.
제네릭스(Generics) 사용 시
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
Iterator<Map.Entry<Integer, Integer>> entries = map.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry<Integer, Integer> entry = entries.next();
System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}
제네릭스 없이 사용 시
타입 안전성이 보장되지 않아 명시적인 형 변환(casting)이 필요합니다.
Map map = new HashMap();
Iterator entries = map.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry entry = (Map.Entry) entries.next();
Integer key = (Integer)entry.getKey();
Integer value = (Integer)entry.getValue();
System.out.println("Key = " + key + ", Value = " + value);
}
5. 키를 순회하며 값 조회하기
keySet()으로 키를 순회하면서 get() 메서드로 해당 값을 조회하는 방식입니다. 단, 이 방법은 매번 해시 조회가 발생하므로 키와 값이 모두 필요하다면 entrySet()을 사용하는 것이 성능 면에서 더 유리합니다.
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (Integer key : map.keySet()) {
Integer value = map.get(key);
System.out.println("Key = " + key + ", Value = " + value);
}
6. Java 8 ForEach 사용하기
Java 8에서 도입된 람다 기반 forEach 메서드를 사용하면 코드를 한 줄로 간결하게 작성할 수 있습니다.
Map<String, Integer> items = new HashMap<>();
items.put("key 1", 1);
items.put("key 2", 2);
items.put("key 3", 3);
items.forEach((k,v)->System.out.println("Item : " + k + " Count : " + v));
마무리: 어떤 방법을 선택해야 할까?
- 키와 값이 모두 필요한 경우:
entrySet()순회가 성능과 가독성 면에서 가장 좋습니다. - 순회 중 요소 제거가 필요한 경우:
Iterator를 사용하세요. - 간결한 코드를 원하는 경우: Java 8 이상이라면 람다 기반
forEach가 편리합니다. - 키 또는 값 중 하나만 필요한 경우:
keySet()또는values()를 그대로 사용하면 됩니다.