티스토리 뷰
개요
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 |
|---|
