28. 배열보다는 리스트를 사용하라

신명철·2022년 2월 22일
0

Effective Java

목록 보기
26/80

배열과 제네릭타입

배열과 제네릭타입에는 중요한 차이가 있다. 첫째는 배열은 공변이고 제네릭은 비공변이라는 것이다. 즉, Sub[] 와 Super[] 이 존재하면 Sub[] 는 배열 Super[] 의 하위타입이 된다. 반면 서로 다른 타입 Type1, Type2 가 있을 때 List<Type1>은 List<Type2>의 하위 타입도 상위 타입도 아니다.

두번째 차이로는 배열은 실체화가 된다. 즉, 배열은 런타임에도 자신이 담기로 한 원소의 타입을 인지하고 확인한다. 하지만 제네릭은 타입 정보가 런타임에 소거된다. 원소 타입을 컴파일 타입에만 검사하고 런타임에는 알수조차 없다는 뜻이다.

Object[] objectArray = new Long[1];
objectArray[0] = "타입이 달라 넣을 수 없다" // ArrayStoreException

List<Object> ol = new ArrayList<Long>(); // 호환되지 않는 타입이다.
ol.add("타입이 달라 넣을 수 없다");
  • 위의 코드에서 배열은 런타임에야 실수를 파악하지만 리스트는 컴파일할 때 바로 알 수 있다.

위와 같은 차이로 배열과 제네릭은 서로 섞어서 쓰기가 어렵다. 둘을 섞어 쓰다가 컴파일 오류나 경고를 만나면 가장 먼저 배열을 리스트로 바꾸는 방법을 적용해보자.

profile
내 머릿속 지우개

0개의 댓글