삽질

Arrays.asList()와 ArrayList가 다른 클래스인 이유

ksb-dev 2023. 7. 25. 17:45

흔히 배열을 리스트로 만들 때 Arrays.asList()를 많이 사용하실 것입니다.

 

Arrays.asList()는 아래와 같이 선언되어 있습니다.

@SafeVarargs
@SuppressWarnings("varargs")
public static <T> List<T> asList(T... a) {
    return new ArrayList<>(a);
}

 

가변 변수인 a를 받아서 ArrayList로 변환하여 반환합니다.

 

이와 똑같이 배열을 만들어 우리가 잘 아는 java.util.ArrayList 생성자에 넣어보겠습니다.

위 그림과 같이 불가능 합니다.

 

왜 그럴까요?

 

그 이유는 Arrays.asList()로 만들어지는 ArrayList와 java.util.ArrayList가 다른 클래스이기 때문입니다.

[java.util.ArrayList에는 배열을 받는 생성자가 존재하지 않습니다.]

 

Arrays.asList()는 아래 그림과 같이 내부에 ArrayList를 따로 정의하여 사용하고 있습니다.

보시다시피, Arrays.asList()는 Arrays 내부의 ArrayList를 사용합니다.

 

즉, java.util.ArrayListjava.util.Arrays.ArrayList는 서로 다른 클래스입니다.

 

그러면 아래 코드는 왜 동작할까요?

List<String> list = Arrays.asList(arr);

 

위 그림에서 Arrays 내부의 ArrayList는 AbstractList는 아래와 같이 선언되어 있습니다.

AbstractList가 List를 구현하고 있기 때문에 List로 Arrays.asList()의 ArrayList를 받을 수 있는 것입니다.

 

위와 같은 이유들 때문에 java.util.ArrayList로는 Arrays.asList() 내부의 ArrayList를 받을 수 없습니다!!

 

만약 java.util.ArrayList로 강제 타입 변환을 하게 되면 런타임시 에러가 발생합니다.

// 런타임시 타입 캐스팅 에러 발생
ArrayList<String> list = (ArrayList<String>) Arrays.asList(arr);

이 코드는 직접 해 보시기 바랍니다.