본문 바로가기

개발일지/TIL

[231126] Arrays.asList에서 사용할 때 주의할 점

Arrays.asList는 읽기만 가능하다

💬 Arrays.asList는 여러 값을 한 번에 입력해 List를 만들어주는 메서드입니다. 저는 이것을 자주 애용했습니다. 회사에서 이번에 API를 개발하면서 사용을 했는데 Arrays.asList를 통해 만들어진 List에 add 호출을 할 때 예외가 터졌습니다. 

읽기만 가능한 이유?

✅ Arrays.asList로 List를 만들 경우 ArrayList가 하나 만들어집니다. 이 ArrayList안의 멤버 변수에 크기가 고정된 배열이 할당 되기 때문입니다.

➡ asList의 매개변수는 가변인자이며 각 값들이 합쳐진 배열로 만들어져 들어갑니다.
public static <T> List<T> asList(T... a) {
    return new ArrayList<>(a);
}​

➡ ArrayList로 넘어간 배열은 final 변수에 들어가기 때문에 배열의 크기가 고정이 되어버린 것이었습니다.
private final E[] a;

ArrayList(E[] array) {
    a = Objects.requireNonNull(array);
}​

결론

💬 외부 라이브러리를 습관적으로 쓰다보면 이러한 문제들을 마주하게 됩니다. 그럴 때마다 내부에는 어떻게 동작을 하는지 파악을 하고 다음에는 그것들을 인지하고 사용해야겠다는 생각을 하게 되었습니다. 이런 것이 성장하게 하는 경험치가 아닐까 싶습니다.