티스토리 뷰

개요

List.of()로 생성한 List에서 remove() 메서드를 사용하려던 중 에러가 발생했다.

UnsupportedOperationException 은 지원되지 않는 작업을 요청한 경우 발생하는 에러이다.

@DisplayName("입력받은 길이의 다리를 생성한다.")
@ParameterizedTest
@MethodSource("generateMakeBridgeData")
void makeBridge(List<Integer> bridgeNumbers, int bridgeSize, List<String> expectedBridge) {
    TestNumberGenerator testNumberGenerator = new TestNumberGenerator(bridgeNumbers);
    BridgeMaker bridgeMaker = new BridgeMaker(testNumberGenerator);
    List<String> bridge = bridgeMaker.makeBridge(bridgeSize);
    assertThat(bridge).containsExactly(String.valueOf(expectedBridge));
}
    
static Stream<Arguments> generateMakeBridgeData() {
        return Stream.of(
            arguments(List.of(0, 0, 1), "3", List.of("D", "D", "U")),
            arguments(List.of(1, 1, 0, 0, 1), "5", List.of("U", "U", "D", "D", "U"))
        );
    }

static class TestNumberGenerator implements BridgeNumberGenerator {

    private final List<Integer> numbers;

    TestNumberGenerator(List<Integer> numbers) {
        this.numbers = numbers;
    }

    @Override
    public int generate() {
        return numbers.remove(0);
    }
}

 

원인

List는 인터페이스이기 때문에 remove 와 같은 메서드가 구현되어 있지 않다.

 

List.of() 메서드를 살펴보자

요소의 개수가 0, 1, 2 개인 경우 List12라는 형태의 객체로 반환해주고,

요소의 개수가 2보다 큰 경우 ListN 이라는 형태의 객체로 반환해준다.

ListN 객체를 살펴보자

ListN은 ImmutableCollection 클래스의 정적 내부 클래스로 존재한다. (ImmutableCollection.ListN)

remove(), add() .. 와 같이 List 내부 값을 조작하는 메서드는 구현되어 있지 않다.

결론적으로, List.of() 를 통해 생성된 List는 remove() 메서드를 지원하지 않았고,

존재하지 않는 메서드를 호출하려고 하니 UnsupportedOperationException 에러가 발생한 것이다.

 

추가로,

Arrays.asList() 를 통해 생성한 List도 내부 값을 조작하려 하면 UnsupportedOperationException  에러가 발생한다.

List<Integer> list = Arrays.asList(1, 2, 3);
list.remove(0);

Arrays.asList 를 살펴보자

 

'Language > Java' 카테고리의 다른 글

[Java] Generic 이란?  (0) 2022.11.29
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/01   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함