배열 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)되는 반면, 리스트는 그렇지 않다.
배열은 런타임에 타입을 체크한다. 하지만 제네릭은 원소타입을 컴파일 타임에만 체크하므로, 배열과 제네릭은 동작 방식이 어우러지지 못한다.
결론
배열과 제네릭을 섞어 쓰다가 오류/경고 발생시, 배열을 리스트로 대체하는 방법을 시도하자.
'개발 > [스터디] 이펙티브 자바' 카테고리의 다른 글
[이펙티브 자바 스터디] 아이템 41-46 (0) | 2022.01.23 |
---|---|
[이펙티브 자바 스터디] 아이템 31~35 (0) | 2022.01.09 |
[이펙티브자바]아이템27. 비검사 경고를 제거하라 (0) | 2022.01.02 |
[이펙티브자바]아이템26. 로타입은 사용하지 말라 (0) | 2022.01.01 |
[책 요약]이펙티브자바 21~25 (0) | 2021.12.26 |