Java에서 Map과 Entry의 관계는 많은 초보 개발자들이 헷갈려하는 부분입니다. 이번 글에서는 Map과 Entry의 개념과 관계를 명확하게 이해해보겠습니다.
Map.Entry<K, V>는 Map 인터페이스 내부에 정의된 내부 인터페이스(nested interface)로, Map에 저장된 하나의 키-값 쌍을 표현합니다.
public interface Map<K, V> {
// ...
interface Entry<K, V> {
K getKey();
V getValue();
V setValue(V value);
// ...
}
// ...
}
주요 메서드:
getKey(): 엔트리의 키를 반환getValue(): 엔트리의 값을 반환setValue(V value): 엔트리의 값을 변경Map은 본질적으로 Entry(키-값 쌍)들의 집합입니다. 예를 들어 HashMap은 여러 개의 Entry를 저장하고 있는 컨테이너입니다.
시각적으로 표현하면:
Map<String, Integer> = {
Entry<String, Integer> #1 ("사과" = 10),
Entry<String, Integer> #2 ("바나나" = 20),
Entry<String, Integer> #3 ("오렌지" = 15),
...
}
Map 인터페이스의 entrySet() 메서드는 Map에 포함된 모든 Entry를 담은 Set을 반환합니다.
Set<Map.Entry<K, V>> entrySet();
반환 타입이 Set<Map.Entry<K, V>>인 이유:
1. Set: 중복을 허용하지 않는 컬렉션 (Map의 키는 중복될 수 없으므로 Entry도 중복될 수 없음)
2. Map.Entry: Set의 각 요소는 키-값 쌍을 나타내는 Entry 객체
Map<String, Integer> map = new HashMap<>();
map.put("blue", 96);
map.put("hong", 86);
map.put("white", 92);
// 올바른 방법: for-each 루프로 각 엔트리 순회
for (Map.Entry<String, Integer> entry : map.entrySet()) {
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println(key + ": " + value);
}
// 잘못된 방법: 타입 캐스팅 오류 발생
// Map.Entry<String, Integer> entries = (Map.Entry<String, Integer>)map.entrySet(); // 오류!
오류가 발생하는 이유:
map.entrySet()은 Set<Map.Entry<String, Integer>> 타입을 반환Map.Entry 객체로 캐스팅할 수 없음Map에서 하나의 Entry만 가져오려면:
// 방법 1: iterator 사용
Map.Entry<String, Integer> firstEntry = map.entrySet().iterator().next();
// 방법 2: 스트림 API 사용 (Java 8 이상)
Optional<Map.Entry<String, Integer>> firstEntry = map.entrySet().stream().findFirst();
// 방법 3: 첫 번째 엔트리만 처리하고 루프 종료
for (Map.Entry<String, Integer> entry : map.entrySet()) {
// entry 사용
break; // 첫 번째 항목만 처리하고 종료
}
entrySet()은 Map의 모든 Entry를 Set 형태로 반환합니다.entrySet()을 활용하여 키와 값에 동시에 접근하는 것이 효율적입니다.