본문 바로가기

이펙티브 자바

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

  1. 공변성 (Covariance):
    • 공변성은 서브타입 관계에서 타입이 변할 때 같은 방향으로 변하는 특성을 말합니다. 즉, A가 B의 서브타입인 경우, A 타입의 객체를 B 타입으로 변환할 수 있습니다.
    • 예를 들어, List<String>이 List<Object>의 서브타입이라면, List<String> 타입의 객체를 List<Object> 타입으로 변환할 수 있습니다. 이것은 배열의 공변성과 유사합니다.
  2. 불변성 (Invariance):
    • 불변성은 서브타입 관계에서 타입이 변하지 않는 특성을 말합니다. 즉, A가 B의 서브타입이더라도 A 타입의 객체를 B 타입으로 변환할 수 없습니다.
    • 예를 들어, List<String>이 List<Object>의 서브타입이 아니라면, List<String> 타입의 객체를 List<Object> 타입으로 변환할 수 없습니다.

 

 

 

결론 : 배열과 제네릭에는 매우 다른 타입 규칙이 적용된다. 배열은 공변이고 실체화되는 반면, 제네릭은 불공변이고 타입 정보가 소거된다. 그 결과 배열은 런타임에는 타입 안전하지만 컴파일타임에는 그렇지 않다. 제네릭은 반대다. 그래서 둘을 섞어 쓰기란 쉽지 않다. 둘을 섞어 쓰다가 컴파일 오류나 경고를 만나면, 가장 먼저 배열을 리스트로 대체하는 방법을 적용해보자.