Collection을 사용할 때 생길 수 있는 예외 중 하나인 UnsupportedOperationException에 대해서 살펴보겠습니다.
List<Integer> integers = Arrays.asList(1, 2, 3);
integers.add(4);
위 코드는 UnsupportedOperationException을 발생시킵니다.
UnsupportedOperationException은 특정 작업이 해당 클래스에서 지원하지 않을 때 발생합니다.
List에는 add 메소드가 있지만 UnsupportedOperationException 예외가 발생하는 이유는 asList 메서드에 의해 생성된 컬렉션은 크기가 고정되어 있기 때문입니다.
그래서 add 메소드로 컬렉션에 요소를 추가하려고 하면 예외가 발생합니다.
정확하게 설명하면 수정할 수 없는 컬렉션을 수정하려고 하면 발생합니다.
몇 가지 경우를 소개해드립니다.
Map - keySet
Map<String, Integer> map = new HashMap<>();
map.put("1", 0);
map.put("2", 0);
map.put("3", 0);
map.keySet().add("4");
Map의 keySet 메서드를 통해 반환된 컬렉션에는 add를 할 수 없습니다.
keySet 메소드 설명에 add와 addAll 메소드를 지원하지 않는다고 나와있습니다(remove는 가능).
keySet과 같은 이유로, Map의 values 메서드로 반환된 컬렉션에서도 add를 할 수 없습니다.
Collections.unmodifiableCollection()
Collections.unmodifiableCollection은 Arrays.asList와 비슷하게 불변 컬렉션 객체를 생성합니다.
List<String> list = new ArrayList<>();
Collection<String> unmodifiableCollection = Collections.unmodifiableCollection(list);
unmodifiableCollection.add("hello");
unmodifiableCollection이라는 이름처럼 메서드를 통해 반환되는 컬렉션이 불변 객체이기 때문에 수정할 수 없습니다.
따라서 add와 remove 메소드를 사용할 수 없습니다.