[Java] Item 29 : 이왕이면 제네릭 타입으로 만들라
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와 같은 실체화 불가 타입으로 배열을 만들 수 없다며 오류가 발생한다.
이러한 문제 해결 방법은 두 가지가 존재한다.
- Object 배열 생성 후 제네릭 배열로 형변환하기
elements = (E[]) new Object[DEFAULT_INITIAL_CAPACITY];
- element 필드의 타입을 E[] 에서 Object[]로 바꾸기
E result = (E) elements[--size];
첫 번째 방식에서는 배열 생성 시 형 변환을 단 한 번만 해 주면 되지만, 두 번째 방식에서는 배열에서 원소를 읽을 때마다 형변환을 해 줘야 한다.
따라 현업에서는 첫 번째 방식을 더 선호하며 자주 사용한다.
그러나 E가 Object가 아닌 한 배열의 런타임 타입이 컴파일 타입과 달라 힙 오염을 일으킨다.
힙 오염과 관련된 내용은 item 31에서 더 자세하게 다룰 예정이다.