- 공변성 (Covariance):
- 공변성은 서브타입 관계에서 타입이 변할 때 같은 방향으로 변하는 특성을 말합니다. 즉, A가 B의 서브타입인 경우, A 타입의 객체를 B 타입으로 변환할 수 있습니다.
- 예를 들어, List<String>이 List<Object>의 서브타입이라면, List<String> 타입의 객체를 List<Object> 타입으로 변환할 수 있습니다. 이것은 배열의 공변성과 유사합니다.
- 불변성 (Invariance):
- 불변성은 서브타입 관계에서 타입이 변하지 않는 특성을 말합니다. 즉, A가 B의 서브타입이더라도 A 타입의 객체를 B 타입으로 변환할 수 없습니다.
- 예를 들어, List<String>이 List<Object>의 서브타입이 아니라면, List<String> 타입의 객체를 List<Object> 타입으로 변환할 수 없습니다.
결론 : 배열과 제네릭에는 매우 다른 타입 규칙이 적용된다. 배열은 공변이고 실체화되는 반면, 제네릭은 불공변이고 타입 정보가 소거된다. 그 결과 배열은 런타임에는 타입 안전하지만 컴파일타임에는 그렇지 않다. 제네릭은 반대다. 그래서 둘을 섞어 쓰기란 쉽지 않다. 둘을 섞어 쓰다가 컴파일 오류나 경고를 만나면, 가장 먼저 배열을 리스트로 대체하는 방법을 적용해보자.
'이펙티브 자바' 카테고리의 다른 글
[이펙티브 자바] 아이템 30. 이왕이면 제네릭 메서드로 만들라 (0) | 2024.04.01 |
---|---|
[이펙티브 자바] 아이템 29. 이왕이면 제네릭 타입으로 만들라 (0) | 2024.03.28 |
[이펙티브 자바] 아이템 27. 비검사 경고를 제거하라 (0) | 2024.03.27 |
[이펙티브 자바] 아이템 26. 로 타입은 사용하지 말라 (0) | 2024.03.27 |
[이펙티브 자바] 아이템 25. 톱레벨 클래스는 한 파일에 하나만 담으라 (0) | 2024.03.25 |