java.util 패키지의 Collections 클래스는 컬렉션만을 대상으로 동작하는 다양한 정적 메서드를 제공합니다. 이 메서드들은 다형적 알고리즘(polymorphic algorithms)을 포함한 여러 부가적인 연산을 수행할 수 있도록 도와줍니다.
특히 이 클래스는 기존 컬렉션을 수정 불가능한(unmodifiable) 뷰로 변환해 주는 unmodifiable() 메서드의 여러 변형을 제공합니다. 각 메서드의 종류와 설명은 아래 표와 같습니다.
| 번호 | 메서드 및 설명 |
|---|---|
| 1 | static <T> Collection<T> unmodifiableCollection(Collection<? extends T> c) 모든 종류의 컬렉션 객체를 인자로 받아, 해당 컬렉션의 수정 불가능한 뷰를 반환합니다. |
| 2 | static <T> List<T> unmodifiableList(List<? extends T> list) List 인터페이스의 객체를 인자로 받아, 해당 리스트의 수정 불가능한 뷰를 반환합니다. |
| 3 | static <K,V> Map<K,V> unmodifiableMap(Map<? extends K,? extends V> m) Map 인터페이스의 객체를 인자로 받아, 해당 맵의 수정 불가능한 뷰를 반환합니다. |
| 4 | static <T> Set<T> unmodifiableSet(Set<? extends T> s) Set 인터페이스의 객체를 인자로 받아, 해당 집합의 수정 불가능한 뷰를 반환합니다. |
| 5 | static <K,V> SortedMap<K,V> unmodifiableSortedMap(SortedMap<K,? extends V> m) SortedMap 인터페이스의 객체를 인자로 받아, 해당 정렬 맵의 수정 불가능한 뷰를 반환합니다. |
| 6 | static <T> SortedSet<T> unmodifiableSortedSet(SortedSet<T> s) SortedSet 인터페이스의 객체를 인자로 받아, 해당 정렬 집합의 수정 불가능한 뷰를 반환합니다. |
다시 말해, 컬렉션의 유형에 맞는 위 메서드 중 하나를 호출하기만 하면 해당 컬렉션 객체를 손쉽게 읽기 전용으로 만들 수 있습니다.
예제
다음 Java 프로그램은 Vector 객체를 생성하고 요소를 추가한 뒤, 이를 Collections.unmodifiableCollection() 메서드로 읽기 전용 컬렉션으로 변환합니다.
import java.util.Collection;
import java.util.Collections;
import java.util.Vector;
public class CollectionReadOnly {
public static void main(String[] args) {
// Vector 객체 생성
Vector<String> vector = new Vector<String>();
vector.add("JavaFx");
vector.add("Java");
vector.add("WebGL");
vector.add("OpenCV");
System.out.println(vector);
// 읽기 전용 컬렉션으로 변환
Collection<String> immutableVector = Collections.unmodifiableCollection(vector);
System.out.println("Vector converted to read only " + immutableVector);
// 수정 시도 → 예외 발생
immutableVector.add("CoffeeScript");
}
}실행 결과 및 예외
[JavaFx, Java, WebGL, OpenCV]
Vector converted to read only [JavaFx, Java, WebGL, OpenCV]
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.Collections$UnmodifiableCollection.add(Unknown Source)
at September19.CollectionReadOnly.main(CollectionReadOnly.java:20)위 실행 결과에서 볼 수 있듯이, 마지막 줄에서 add() 메서드로 새로운 요소를 추가하려는 순간 UnsupportedOperationException이 발생합니다.
주의 사항
컬렉션의 읽기 전용 뷰를 한 번 얻고 나면 그 내용을 수정할 수 없습니다. 즉, 직접 메서드를 호출하거나 Iterator 객체를 통해 요소를 추가·삭제하려고 하면 모두 UnsupportedOperationException이 발생합니다.
또한 참고로, unmodifiable 계열 메서드가 만드는 것은 원본 컬렉션의 '뷰(view)'라는 점에 유의해야 합니다. 원본 컬렉션이 변경되면 읽기 전용 뷰에도 그 변경이 그대로 반영됩니다. 완전히 불변(immutable)인 컬렉션이 필요하다면 Java 9 이상에서 제공하는 List.of(), Set.of(), Map.of() 같은 팩토리 메서드를 사용하는 것이 좋습니다.