어제 오늘 내일

[Java] Collections.unmodifiableSet() – 읽기 전용 집합 만들기 본문

IT/Java

[Java] Collections.unmodifiableSet() – 읽기 전용 집합 만들기

hi.anna 2025. 9. 13. 12:18

Java에서 Set을 외부에 그대로 반환하면, 원하지 않는 요소 추가나 삭제가 발생할 수 있습니다.
이때 Collections.unmodifiableSet()을 사용하면 집합을 읽기 전용(Read-Only)으로 감싸 안전하게 다룰 수 있습니다.

 

1. 기본 사용법

import java.util.*;

public class UnmodifiableSetExample {
    public static void main(String[] args) {
        Set<String> original = new HashSet<>();
        original.add("Java");
        original.add("Python");

        Set<String> unmodifiable = Collections.unmodifiableSet(original);

        System.out.println(unmodifiable); // [Java, Python]
    }
}

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

 

2. 수정 불가능

읽기 전용 뷰에서는 요소를 추가하거나 삭제할 수 없습니다.

unmodifiable.add("C++");     // UnsupportedOperationException 발생
unmodifiable.remove("Java"); // UnsupportedOperationException 발생

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

 

3. 원본 변경은 반영됨

unmodifiableSet()이 반환하는 것은 복사본이 아니라 원본을 감싼 뷰이므로, 원본을 수정하면 읽기 전용 뷰에도 그대로 반영됩니다.

original.add("C#");
System.out.println(unmodifiable); // [Java, Python, C#]

👉 즉, 진짜 불변 Set은 아님에 주의해야 합니다.

 

4. 언제 쓰면 좋을까?

  • API 안정성 확보: 외부 호출자에게 Set을 반환할 때 실수로 변경하지 못하게 하고 싶을 때
  • 읽기 전용 뷰 제공: 내부 데이터는 유지하면서 외부에는 안전하게 제공
  • 데이터 보호: 실수나 의도치 않은 조작으로부터 데이터 보호

 

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

Java 9 이상에서는 Set.of()를 사용하여 불변 Set을 바로 만들 수 있습니다.

Set<String> immutableSet = Set.of("A", "B", "C");

👉 이 경우 원본 자체도 수정할 수 없습니다.

 

6. 정리

  • Collections.unmodifiableSet(set) → 읽기 전용 Set 뷰 생성
  • 뷰에서는 추가/삭제/수정 불가능
  • 원본을 바꾸면 뷰에도 반영됨 → 불변 컬렉션은 아님
  • 진짜 불변 Set은 Set.of() 사용

👉 Set을 외부에 안전하게 공유하려면 Collections.unmodifiableSet()을 사용하자!

 

 

반응형
Comments