JAVA

Java의 UnsupportedOperationException (feat array, List)

Ambitions 2021. 12. 8. 11:03

개발을 하던 와중에 Arrays의 asList를 이용해서 리스트를 선언과 초기화를 해준 뒤 다음 이후에 리스트를 추가하거나 삭제하려고 했더니 UnsupportedOperationException이 발생했다. 에러 메세지만 보면 내가 작성한 코드가 지원할 수 없다는 내용인데, 

 

이유를 찾아보니 Arrays.asList는 배열을 리스트로 그냥 덮어씌운상태(래핑)로 변경되고, 변경된 상태의 데이터들은 배열을 이용하고 있고 asList자체가 타겟으로 들어온 배열의 길이를 고정된 값으로 리턴하기 때문에, add나 remove를 사용할 수 없다는 것 같다. 다만 set을 이용하면 데이터 교체는 가능하다. 

 

결론적으로 asList를 이용해서 내가 원하는 결과(List로 리턴받아 add, remove)를 수행하려면 다음과 같이 작성해야 했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class ListTest {
    public static void main(String[] args) {
 
//        testCodes.codesOne.add("5"); // UnsupportedOperationException 발생
        testCodes.codesOne.set(3"5"); // set을 이용하면 수정은 가능하나 확장은 불가능하다.
        testCodes.codesTwo.add("5"); // 정상적으로 삽입됨
    }
 
    private interface testCodes {
        String a = "1";
        String b = "2";
        String c = "3";
        String d = "4";
 
        List<String> codesOne = Arrays.asList(a,b,c,d); // {a,b,c,d} -> [a,b,c,d]가 된 것뿐임 
        ArrayList<String> codesTwo = new ArrayList<>(Arrays.asList(a,b,c,d));
        List<String> emptyCodes = new ArrayList<>();
    }
}
 
cs

※ 나의 경우 List를 선언과 동시에 초기화를 하고싶어서 이렇게 썼지만, 배열 -> 리스트로 변경할 때도 기본 내용은 비슷하다.

위 화면의 주석을 확인하면 이해가 쉬울 것 같고, 이번일로 Arrays.asList에 대해서 알아볼 수 있는 기회가 되어서 유익했던 것 같다.