Study/java

[Java] Collection - UnsupportedOperationException

 

Collection을 사용할 때 생길 수 있는 예외 중 하나인 UnsupportedOperationException에 대해서 살펴보겠습니다.

 

List<Integer> integers = Arrays.asList(1, 2, 3);
integers.add(4);

UnsupportedOperationException 발생
UnsupportedOperationException 발생

위 코드는 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에서 unsupportedOperationException 발생
map에서 unsupportedOperationException 발생

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");

Collections. unmodifiableCollection 객체에 add하면 UnsupportedOperationException 발생
Collections. unmodifiableCollection 객체에 add하면 UnsupportedOperationException 발생

 

unmodifiableCollection이라는 이름처럼 메서드를 통해 반환되는 컬렉션이 불변 객체이기 때문에 수정할 수 없습니다.

따라서 add와 remove 메소드를 사용할 수 없습니다.