-
item 28 배열보다는 리스트를 사용하라책/이펙티브 자바 2022. 3. 19. 22:21
ITEM 28 배열보다는 리스트를 사용하라
배열과 제네릭 타입의 차이
- 배열은 공변이다
- 함께 변한다는 뜻
- sub가 super의 하위 타입이라면 배열sub[]는 배열 super[]의 하위 타입이 된다
- 제네릭은 불공변이다
- 서로 다른 타입 type1 , type2 가 있다면 List
은 List 의 하위 타입도 아니고 상위 타입도 아니다 - 문제가 있는건 제네릭이 아닌 배열이다(제네릭은 컴파일 단계에서 문제를 알 수 있지만 배열은 런타임 단계에서 오류를 발생한다)
- 서로 다른 타입 type1 , type2 가 있다면 List
- 배열은 실체화(reify) 된다
- 런타임에도 자신이 담기로 한 원소의 타입을 인지하며 확인한다
- 제네릭은 타입 정보가 런타임에는 소거된다
- 원소 타입을 컴파일타임에만 검사하고 런타임시기에는 알 수 없다
- 소거는 제네릭이 지원되기 전의 레거시 코드와 제네릭 타입의 호환을 위해 사용된다
- 위와 같은 이유로 배열과 제네릭은 어울리지 않는다
- 배열은 제네렉타입, 매개변수화 타입, 타입 매개변수로 사용이 불가능하다
- 제네릭 배열은 타입 안정성이 떨어져 만들지 못하게 하였다
- 제네릭과 배열을 같이 사용하면 컴파일 오류가 생길 가능성이 높으니 이런 경우에는 배열 대신 리스트를 고려해보자
- 비검사 형변환 경고나 ClassCastException 발생을 방지하자
'책 > 이펙티브 자바' 카테고리의 다른 글
item 30 이왕이면 제네릭 메서드로 만들어라 (0) 2022.03.22 item 29 이왕이면 제네릭 타입으로 만들라 (0) 2022.03.21 item 27 비검사 경고를 제거하라 (0) 2022.03.17 item 26 로 타입은 사용하지 말라 (0) 2022.03.16 item 25 톱 레벨 클래스는 한 파일에 하나만 담으라 (0) 2022.03.15 - 배열은 공변이다