Arrays.asList()의 반환 값

wannabeking·2022년 10월 26일
0

Java

목록 보기
8/13
post-thumbnail

가짜 ArrayList?

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를 인자로 전달할 수 있다.



profile
내일은 개발왕 😎

0개의 댓글