Map.Entry는 Map에 저장된 key-value 한 쌍을 표현하는 인터페이스이다.
Map은 데이터를 다음과 같이 저장한다.
Map<String, Integer> map = new HashMap<>();
map.put("사과", 3);
map.put("바나나", 5);
map.put("포도", 2);
이 Map 안에는 다음과 같은 데이터가 들어 있다.
사과 → 3
바나나 → 5
포도 → 2
여기서 "사과" → 3 같은 key-value 한 쌍을 자바에서는 Map.Entry라고 부른다.
왜 Map.Entry가 필요할까?
Map을 순회할 때 key만 필요하다면 keySet()을 사용하면 된다.
for (String key : map.keySet()) {
System.out.println(key);
}
하지만 key와 value를 둘 다 사용하고 싶다면 보통 value도 꺼내야 한다.
for (String key : map.keySet()) {
System.out.println(key + " : " + map.get(key));
}
이 방식은 key를 먼저 꺼낸 뒤, 다시 map.get(key)로 value를 조회한다.
반면 entrySet()을 사용하면 key와 value를 한 번에 꺼낼 수 있다.
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + " : " + entry.getValue());
}
출력 결과는 다음과 같다.
사과 : 3
바나나 : 5
포도 : 2
즉, Map.Entry는 Map을 순회하면서 key와 value를 함께 다루기 위해 사용한다.
entrySet()이 반환하는 것
entrySet()의 반환 타입은 다음과 같다.
Set<Map.Entry<K, V>>
조금 어렵게 보이지만 의미는 간단하다.
Map.Entry<K, V> → key-value 한 쌍
Set<...> → 그 한 쌍들이 모여 있는 집합
예를 들어 아래 Map이 있다면,
Map<String, Integer> map = new HashMap<>();
map.put("사과", 3);
map.put("바나나", 5);
map.entrySet()은 다음과 비슷한 구조라고 보면 된다.
[
("사과", 3),
("바나나", 5)
]
그래서 반복문으로 하나씩 꺼낼 수 있다.
for (Map.Entry<String, Integer> entry : map.entrySet()) {
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println(key + " : " + value);
}
Map.Entry의 주요 메서드
| getKey() | Entry의 key 반환 | entry.getKey() |
| getValue() | Entry의 value 반환 | entry.getValue() |
| setValue(V value) | Entry의 value 변경 | entry.setValue(10) |
| comparingByKey() | key 기준 정렬용 Comparator 반환 | Map.Entry.comparingByKey() |
| comparingByValue() | value 기준 정렬용 Comparator 반환 | Map.Entry.comparingByValue() |
getKey(), getValue() 사용 예시
Map<String, Integer> map = new HashMap<>();
map.put("사과", 3);
map.put("바나나", 5);
map.put("포도", 2);
for (Map.Entry<String, Integer> entry : map.entrySet()) {
String fruit = entry.getKey();
int count = entry.getValue();
System.out.println(fruit + "는 " + count + "개 있습니다.");
}
출력 예시
사과는 3개 있습니다.
바나나는 5개 있습니다.
포도는 2개 있습니다.
setValue() 사용 예시
setValue()를 사용하면 Entry의 value를 변경할 수 있다.
Map<String, Integer> map = new HashMap<>();
map.put("사과", 3);
map.put("바나나", 5);
for (Map.Entry<String, Integer> entry : map.entrySet()) {
if (entry.getKey().equals("사과")) {
entry.setValue(10);
}
}
System.out.println(map);
출력 결과
{사과=10, 바나나=5}
주의할 점은 setValue()는 key를 바꾸는 메서드가 아니라 value만 변경하는 메서드라는 것이다.
comparingByKey() 사용 예시
Map.Entry.comparingByKey()는 key 기준으로 정렬할 때 사용한다.
Map<String, Integer> map = new HashMap<>();
map.put("banana", 5);
map.put("apple", 3);
map.put("grape", 2);
map.entrySet()
.stream()
.sorted(Map.Entry.comparingByKey())
.forEach(entry ->
System.out.println(entry.getKey() + " : " + entry.getValue())
);
출력 결과
apple : 3
banana : 5
grape : 2
comparingByValue() 사용 예시
Map.Entry.comparingByValue()는 value 기준으로 정렬할 때 사용한다.
Map<String, Integer> map = new HashMap<>();
map.put("banana", 5);
map.put("apple", 3);
map.put("grape", 2);
map.entrySet()
.stream()
.sorted(Map.Entry.comparingByValue())
.forEach(entry ->
System.out.println(entry.getKey() + " : " + entry.getValue())
);
출력 결과
grape : 2
apple : 3
banana : 5
언제 keySet(), values(), entrySet()을 사용할까?
필요한 값사용하는 메서드
| key만 필요 | keySet() |
| value만 필요 | values() |
| key와 value 둘 다 필요 | entrySet() |
예를 들어 key만 출력한다면 다음처럼 작성한다.
for (String key : map.keySet()) {
System.out.println(key);
}
value만 출력한다면 다음처럼 작성한다.
for (Integer value : map.values()) {
System.out.println(value);
}
key와 value를 둘 다 출력한다면 다음처럼 작성한다.
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + " : " + entry.getValue());
}
정리
Map.Entry는 Map에 저장된 key-value 한 쌍을 표현하는 인터페이스이다.
Map을 순회할 때 key와 value를 둘 다 사용해야 한다면 keySet()으로 key를 꺼내고 다시 map.get(key)를 호출하는 것보다 entrySet()을 사용하는 것이 더 자연스럽다.
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + " : " + entry.getValue());
}
한 줄로 정리하면 다음과 같다.
Map.Entry는 Map의 key-value 한 쌍을 다루기 위한 인터페이스이며, key와 value를 함께 순회할 때 entrySet()과 함께 사용한다.

'개발공부 > JAVA의 정석' 카테고리의 다른 글
| [Java] 조건문과 반복문 (0) | 2026.06.09 |
|---|---|
| [Java] 자바 연산자 정리: 정수 나눗셈, 오버플로우, 형변환 주의점 (0) | 2026.06.08 |
| chapter 2) 변수 variable (0) | 2026.06.05 |
| chapter 2) 자주 사용되는 타입 간의 변환 (0) | 2026.06.05 |
| chapter 1) 왜 자바는 main()을 찾을까? JVM과 스프링의 실행 시작점 이해하기 (0) | 2026.06.04 |