[Effective Java] - 5장 아이템 29. 이왕이면 제네릭 타입으로 만들라

yeom yaloo·2023년 12월 21일
0

Effective Java

목록 보기
17/20
post-thumbnail

제네릭

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

[핵심 정리]

  • 클라이언트에서 직접 형변환해야 하는 타입보다는 제네릭 타입이 더 안전하고 쓰기 편하다.
  • 새로운 타입을 설계할 예정이라면 배열 대신 제네릭을 사용해서 만들자

[Object 기반의 stack로 알아보는 문제]

1. Object 기반의 stack 코드

public class stack{

	private Object[] elements;
    ... 이하 생략

}

2. 제네릭을 사용한 방법 (1)

public class stack<E>{

	private E[] elements;
    ... 이하 생략
}
  • 해당 경우엔 컴파일이 되지 않는 문제가 발생한다.
  • 이는 아이템 28에서 알아봤듯, E와 같은 실체화 불가 타입으로는 배열을 반환할 수 없기 때문이다.

3. 2번의 해결 방법 (1)

  • 제네릭 배열 생성 금지를 우회하는 방법으로 Object 배열을 생성한 다음 제네릭 배열로 형변환을 하면 된다.
  • 그러나 이 방법은 컴파일러는 오류 대신 경고를 내보내고 이 방법은 타입 안전성을 보장할 수 없다.
@SuppressWarning("unchecked")
public stack(){
	elements = (E[]) new Object[DEFAULT_INITIAL_CAPACITY];
	... 이하 생략
}

3. 2번의 해결 방법 (2)

  • 두번째 해결 방법은 비검사 형변환이 안전함을 직접 증명해내는 방법이다.
public E pop(){
	if (size == 0)
    	throw new EmptyStackException();
    
    @SuppressWarnings("unchecked") E result = (E) elements[--size];
    
    elements[size] null; // 다 쓴 참조 해제
    return result; 
}
  • E는 실체화가 불가한 타입으로 컴파일러는 런타임에 이뤄지는 형변환이 안전한지 알수 없다.
profile
즐겁고 괴로운 개발😎

0개의 댓글