Effective Java를 읽고 정리한 정리본입니다.

📌 Item 29 : 이왕이면 제네릭 타입으로 만들라

🫧 제네릭 타입

기존 아이템에서 다루었듯, 일반 클래스를 제네릭 클래스로 만들면 타입 안전성 등 여러 장점이 뒤따른다.

따라, 이번 챕터에서는 일반 클래스를 제네릭 클래스로 바꾸는 방법에 대해 설명하고자 한다.

이번 내용에서 나오는 코드는 변경된 부분만 발췌되었다.

✨ 1. 클래스 선언에 타입 매개변수 추가

변경 전 코드

public class Stack {
  private Object[] elements;
  public void push(Object e) {}
  public Object pop() {}
}

변경 후 코드

public class Stack<E> {
  private E[] elements;
  public void push(E e) {}
  public E pop() {}
}

이렇게 변경한다면 E와 같은 실체화 불가 타입으로 배열을 만들 수 없다며 오류가 발생한다.

이러한 문제 해결 방법은 두 가지가 존재한다.

  1. Object 배열 생성 후 제네릭 배열로 형변환하기
elements = (E[]) new Object[DEFAULT_INITIAL_CAPACITY];
  1. element 필드의 타입을 E[] 에서 Object[]로 바꾸기
E result = (E) elements[--size];

첫 번째 방식에서는 배열 생성 시 형 변환을 단 한 번만 해 주면 되지만, 두 번째 방식에서는 배열에서 원소를 읽을 때마다 형변환을 해 줘야 한다.

따라 현업에서는 첫 번째 방식을 더 선호하며 자주 사용한다.

그러나 E가 Object가 아닌 한 배열의 런타임 타입이 컴파일 타입과 달라 힙 오염을 일으킨다.

힙 오염과 관련된 내용은 item 31에서 더 자세하게 다룰 예정이다.