Arrays.asList()
를 사용하면 간단한 리스트를 짧은 코드로 만들 수 있다.
List<String> animals = new ArrayList<>();
animals.add("dog");
animals.add("cat");
animals.add("duck");
List<String> animals = Arrays.asList("dog", "cat", "duck");
그렇다면 두 코드의 결과는 같을까?
Arrays
를 뜯어 보자.
Arrays.asList()
는 varargs(가변인자)를 매개변수로 받아 새로운 ArrayList
를 반환한다.
그렇다면 이 ArrayList
는 우리가 알고있는 ArrayList
일까?
정답은 우리가 생각하는 클래스가 아니다.
Arrays
의 이너 클래스인 ArrayList
이다. (ArrayList in Arrays
)
이 클래스는 final 변수로 배열을 가지고 있어 생성자를 통해서만 생성할 수 있다.
즉, 재할당 불가능하기 때문에 크기를 변경할 수 없다.
따라서 다음과 같이 원소를 추가하려고 하면...
public class Test {
public static void main(String[] args) {
List<String> animals = Arrays.asList("dog", "cat", "duck");
animals.add("cow");
}
}
UnsupportedOperationException
이 발생한다.
이는 ArrayList in Arrays
가 상속 받는 추상 클래스 AbstractList
에서 add()
메소드 호출 시 예외를 발생시키게 구현했기 때문이다.
별다른 오버라이딩이 없었기 때문에 super의 메소드가 호출되었고 예외가 발생된 것이다.
결론적으로 Arrays.asList()
로 반환되는 ArrayList
는 우리가 알고 있는 것과 다르며, 고정적인 크기로 add()
를 지원하지 않기 때문에 유의해서 사용해야 한다.
따라서 우리가 원하는 결과를 얻기 위해서는
List<String> animals = new ArrayList<>(Arrays.asList("dog", "cat", "duck"));
와 같이 ArrayList
의 생성자의 인자로 asList()
반환 값을 넘겨주면 된다.
ArrayList
의 생성자 인자는 Collection
이기 때문에,
Collection
-> AbstractList
-> ArrayList in Arrays
순서로 상속 받는 ArrayList in Arrays
를 인자로 전달할 수 있다.