어제 오늘 내일

[Java] Collections.unmodifiableMap() – 읽기 전용 맵 만들기 본문

IT/Java

[Java] Collections.unmodifiableMap() – 읽기 전용 맵 만들기

hi.anna 2025. 9. 14. 02:19

Java에서 Map을 외부에 그대로 반환하면, 의도치 않게 키-값 쌍이 수정될 수 있습니다.
이를 막고 싶을 때 사용하는 방법이 바로 Collections.unmodifiableMap() 입니다.
이 메서드는 맵을 읽기 전용(Read-Only)으로 감싸서 안전하게 다룰 수 있도록 해줍니다.

 

1. 기본 사용법

import java.util.*;

public class UnmodifiableMapExample {
    public static void main(String[] args) {
        Map<String, String> original = new HashMap<>();
        original.put("A", "Apple");
        original.put("B", "Banana");

        Map<String, String> unmodifiable = Collections.unmodifiableMap(original);

        System.out.println(unmodifiable); // {A=Apple, B=Banana}
    }
}

👉 unmodifiableMap()은 원본 맵을 감싸는 읽기 전용 뷰(View)를 반환합니다.

 

2. 수정 불가능

읽기 전용 뷰에서는 키-값을 추가, 삭제, 변경할 수 없습니다.

unmodifiable.put("C", "Cherry");   // UnsupportedOperationException 발생
unmodifiable.remove("A");          // UnsupportedOperationException 발생

👉 단순 조회(get(), containsKey(), 반복문 등)는 정상적으로 가능합니다.

 

3. 원본 변경은 반영됨

읽기 전용 맵은 복사본이 아니라 원본을 감싼 뷰이므로, 원본이 수정되면 읽기 전용 뷰에도 반영됩니다.

original.put("C", "Cherry");
System.out.println(unmodifiable); // {A=Apple, B=Banana, C=Cherry}

👉 따라서 완전한 불변 Map은 아님에 주의해야 합니다.

 

4. 언제 쓰면 좋을까?

  • API 안정성 확보: 외부에 맵을 반환할 때 실수로 변경하지 못하게 함
  • 데이터 보호: 내부 데이터는 유지하면서 안전하게 읽기 전용으로 제공
  • 디버깅 편의: 원치 않는 변경으로 인한 버그 방지

5

. 진짜 불변 Map이 필요하다면?

Java 9 이상에서는 Map.of() 또는 Map.ofEntries()를 사용하면 아예 수정 불가능한 Immutable Map을 만들 수 있습니다.

Map<String, String> immutableMap = Map.of(
    "A", "Apple",
    "B", "Banana",
    "C", "Cherry"
);

👉 이 경우 원본 자체도 변경 불가능합니다.

 

6. 정리

  • Collections.unmodifiableMap(map) → 읽기 전용 Map 뷰 생성
  • 뷰에서는 추가/삭제/수정 불가능
  • 단, 원본을 수정하면 뷰에도 반영됨 → 완전한 불변 Map은 아님
  • 진짜 불변 Map은 Map.of() 또는 Map.ofEntries() 활용

👉 외부에 안전하게 Map을 제공하고 싶다면 Collections.unmodifiableMap()을 사용하자!

 

 

반응형
Comments