이펙티브 자바 - item 28. 배열보다는 리스트를 사용하라
on JAVA
이펙티브 자바 - item 28. 배열보다는 리스트를 사용하라
배열과 제네릭 타입의 차이점
- 배열은 공변이나 제네릭은 불공변이다.
공변 : Sub가 Super의 하위 타입이라면 배열 Sub[]는 배열 Super[]의 하위 타입이 된다.
불공변 : 다른 타입 Type1과 Type2가 있을 때, List
// 배열
public static void main(String[] args) {
Object[] objectArray = new Long[1];
objectArray[0] = "타입이 달라 넣을 수 없다"; // ArrayStoreException을 런타임 중에 내뱉는다.
}
// 제너릭
List<Object> ol = new ArrayList<Long>();
ol.add("타입이 달라 넣을 수 없다");
예를 들어 위와 같은 배열과 리스트가 있을 때, 배열에서는 런타임에야 알게 되지만, 리스트를 사용하면 컴파일할 때 바로 알 수 있다.
- 배열은 실체화되지만 제너릭은 실체화되지 않는다.
배열은 런타임에더 자신이 담기로 한 원소의 타입을 인지하고 확인한다. 하지만 제너릭은 원소 타입을 컴파일타임에만 검사하며, 런타임에는 타입정보가 소거되어 알 수 없다.
위의 두 가지 차이점으로 인해 배열과 제너릭은 잘 어우러지지 못한다. 예컨대 배열은 제너릭 타입, 매개변수화 타입, 타입 매개변수로 사용할 수 없다.
정리
배열은 컴파일 단계에서 타입 안정성이 없으므로, 배열보다는 제너릭 타입인 리스트를 사용하자.