이왕이면 제네릭 타입으로 만들라

  • 클라이언트에서 직접 형변환해야 하는 타입보다 제네릭 타입이 더 안전하고 쓰기가 편하다.
  • 새로운 타입을 설계할 때는 형변환 없이도 사용할 수 있게 하라.
  • 기존 타입 중 제네릭타입 이었어야 하는 게 있다면 제네릭으로 변경하자

E와 같은 실체화 불가 타입을 어떻게 배열로 만들까?

  1. 제네릭 배열 생성 금지를 대놓고 우회
    • Object 배열을 생성한 다음 제네릭 배열로 형변환
    • 일반적으로 타입안전하지 않다.
    elements = (E[]) new Object[10];
    
  2. E 대신 Object 사용
    @SupressWarnings("unchecked") E result = (E) elements[--size];
    

1번 방법은 가독성이 더 좋다. 또한 형변환을 배열 생성시 한번만 해주면 된다. 하지만 2번은 배열에서 원소를 읽을 때마다 형변환을 해줘야 한다. 하지만 (E가 Object가 아닌 이상) 배열의 런타임 타입이 컴파일타임 타입과 달라 힙오염을 일으킨다.

Item28과 배치되는 내용 아닌가?

  • 제네릭 타입 안에서 리스트를 쓰는 것이 항상 가능한 것은 아니다. 꼭 더 좋다고 할수도 없음.
  • ArrayList같은 제네릭 타입도 결국 기본 타입인 배열을 통해 구현 함.
  • HashMap은 성능을 높이기 위해 배열 사용.
Last Updated: 10/31/2020, 3:49:13 PM