본문 바로가기

개발/[스터디] 이펙티브 자바

[이펙티브자바]아이템28. 배열보다는 리스트를 사용하여라.

배열 VS 제네릭 비교

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

배열은 공변(covariant)이다. 즉, A가 B의 하위 타입이면 A[]는 B[]의 하위 타입이다. 

반면 제네릭은 불공변(invariant)이다. 즉, A가 B의 하위 타입이라도, List<A> 와 List<B>는 하위 관계가 성립되지 않는다. 

Object[] arr = new Long[1];
arr[0] = "문자열"; // 런타임 에러 발생

List<Objet> ol = new ArrayList<Long>();
ol.add("문자열"); // 컴파일 에러 발생

리스트를 사용할 경우 컴파일 타임 에러를 사용하여 버그를 방지할 수 있다. 

 

2 배열은 실체화(relify)되는 반면, 리스트는 그렇지 않다. 

배열은 런타임에 타입을 체크한다. 하지만 제네릭은 원소타입을 컴파일 타임에만 체크하므로, 배열과 제네릭은 동작 방식이 어우러지지 못한다. 

 

결론

배열과 제네릭을 섞어 쓰다가 오류/경고 발생시, 배열을 리스트로 대체하는 방법을 시도하자.