Java에서 array를 List로 바꾸려면 어떻게 해야될까?
for문을 쓰는것이 당연하지만 왠지 복잡해 보이고..
Arrays.asList가 List를 리턴한다. 간단해 보이므로 이걸쓰자.
하지만 잘 살펴보지 않으면 여기에 함정이 있다.
다음 코드를 살펴보자.
Integer[] arr = new Integer[]{1, 2, 3, 4, 5}; List<Integer> list = Arrays.asList(arr); list.add(6);
Exception in thread "main" java.lang.UnsupportedOperationException at java.base/java.util.AbstractList.add(AbstractList.java:153) at java.base/java.util.AbstractList.add(AbstractList.java:111) at ArrayAsList.main(ArrayAsList.java:10)
흠..List인데 add가 안된다?
Arrays.asList 구현을 보자.
public static <T> List<T> asList(T... a) { return new ArrayList<>(a); }
ArrayList리턴인데 머지..?
하지만 이건 java.util.ArrayList 가 아니다.(머여그럼)
바로 밑에 코드를 보면 Arrays 안에 private static 으로 구현되어있다. 생성자로 array를 받고 전역변수로 array로 관리한다.
private static class ArrayList<E> extends AbstractList<E> implements RandomAccess, java.io.Serializable { private static final long serialVersionUID = -2764017481108945198L; private final E[] a; ArrayList(E[] array) { a = Objects.requireNonNull(array); } ... }
그리고 add 메소드가 구현이 안되어있다. AbstractList 로 따라가다 보면 다음과 같이 UnsupportedOperationException을 발생시키는걸 볼 수 있다.
public void add(int index, E element) { throw new UnsupportedOperationException(); }
Arrays.asList 에서 나오는 결과로는 동적 List를 만들 수 없다.
동적 List로 만들고 싶다면 오브젝트를 생성하여 반복문으로 새로 값을 할당해야 한다.
'Java' 카테고리의 다른 글
[Java] Wrapper 클래스 Cache (0) | 2020.06.18 |
---|---|
[Java] Java에서 Map 관련 Iterate(반복문) 방법 (0) | 2016.11.10 |