[Effective Java 3/e] 아이템 29 - 이왕이면 제네릭 타입으로 만들라


아이템 29 - 이왕이면 제네릭 타입으로 만들라

제네릭으로 변경

Object 기반 스택 - 제네릭이 절실한 강력 후보

public class Stack {
  private Object[] elements;
  private int size = 0;
  private static final int DEFAULT_INITIAL_CAPACITY = 16;

  public Stack() {
    elements = new Object[DEFAULT_INITIAL_CAPACITY];
  }

  public Object pop() {
    if (size == 0)
      throw new EmptyStackException();
    Object result = elements[--size];
    elements[size] = null;  // 다 쓴 참조 해제
    return result;
  }
}

제네릭 스택으로 변경

public class Stack {
  private E[] elements;
  private int size = 0;
  private static final int DEFAULT_INITIAL_CAPACITY = 16;

  // 배열 elements는 push(E)로 넘어온 E 인스턴스만 담는다.
  // 따라서 타입 안전성을 보장하지만, 이 배열의 런타임 타입은 E[]가 아닌 Object[]다!
  @SuppressWarnings("unchecked")
  public Stack() {
    elements = (E[]) new Object[DEFAULT_INITIAL_CAPACITY];
  }

  public E pop() {
    if (size == 0)
      throw new EmptyStackException();

    // push에서 E 타입만 허용하므로 이 형변환은 안전하다.
    @SuppressWarnings("unchecked") E result = (E) elements[--size];

    elements[size] = null;  // 다 쓴 참조 해제
    return result;
  }
}

타입 매개변수에 제약을 두는 제네릭 타입

class DelayQueue<E extends Delayed> implements BlockingQueue<E>

정리

  • 클라이언트에서 직접 형변환해야 하는 타입보다 제네릭 타입이 더 안전하고 쓰기 편하다.