배열과 제네릭타입의 두가지 차이점
1. 공변
- 배열
- 공변 (conariant)
Sub
가 Super
의 하위 타입이라면 배열은 Sub[]
은 배열 Super[]
의 하위 타입이 된다.
- 즉, 함께 변한다.
- 배열은 런타임에도 자신이 담기로 한 원소의 타입을 인지하고 있다.
- 컴파일에는 아무런 영향을 끼치지 않지만 런타임시
ArrayStoreException
을 던진다.
- 제네릭
- 불공변 (invaiant)
- 서로 다른 타입 type1과 type2가 있을 때,
List<type1>
은 List<type2>
의 상위 타입도 아니고 하위 타입도 아니다.
- 컴파일 시 에러 던진다.
2. 실체화
- 배열
- 런타임에도 자신이 담기로 한 원소의 타입을 정확하게 인지하고 확인한다.
- 제네릭
- 런타임에는 타입 정보 소거된다. (erasure)
배열보다 리스트를 써야하는 이유
타입에 더 안전하며 런타임이 아닌 컴파일 시점에 에러를 잡아주기 때문이다
🎈귀중한 참고자료🎈
참고자료1