이펙티브 자바 - item 28. 배열보다는 리스트를 사용하라

item 28. 배열보다는 리스트를 사용하라

이펙티브 자바 - item 28. 배열보다는 리스트를 사용하라

배열과 제네릭 타입의 차이점

  1. 배열은 공변이나 제네릭은 불공변이다.

공변 : Sub가 Super의 하위 타입이라면 배열 Sub[]는 배열 Super[]의 하위 타입이 된다.

불공변 : 다른 타입 Type1과 Type2가 있을 때, List은 List의 하위타입도 아니고 상위 타입도 아니다.

// 배열
public static void main(String[] args) {
    Object[] objectArray = new Long[1];
    objectArray[0] = "타입이 달라 넣을 수 없다"; // ArrayStoreException을 런타임 중에 내뱉는다.
}

// 제너릭
List<Object> ol = new ArrayList<Long>();
ol.add("타입이 달라 넣을 수 없다");

예를 들어 위와 같은 배열과 리스트가 있을 때, 배열에서는 런타임에야 알게 되지만, 리스트를 사용하면 컴파일할 때 바로 알 수 있다.

  1. 배열은 실체화되지만 제너릭은 실체화되지 않는다.

배열은 런타임에더 자신이 담기로 한 원소의 타입을 인지하고 확인한다. 하지만 제너릭은 원소 타입을 컴파일타임에만 검사하며, 런타임에는 타입정보가 소거되어 알 수 없다.

위의 두 가지 차이점으로 인해 배열과 제너릭은 잘 어우러지지 못한다. 예컨대 배열은 제너릭 타입, 매개변수화 타입, 타입 매개변수로 사용할 수 없다.

정리

배열은 컴파일 단계에서 타입 안정성이 없으므로, 배열보다는 제너릭 타입인 리스트를 사용하자.