Chapter5 제네릭
1. 로 타입은 사용하지 말라
제네릭 타입은
<>
로 효현 하며, 제네릭 타입을 정의하면, 동시에 로타입도 같이 형성된다.- ex)
List<E>
,List
- ex)
<>
가 없는 로 타입을 사용했을 때는 컴파일 시에 오류가 잡히지 않고, 런타임 때 오류가 잡힌다- 오류는 빨리 잡힐 수록 좋기 때문에 되도록이면 제네릭 타입을 사용해야 한다.
제네릭 타입은 로 타입보다 안정성이 뛰어나다.
2. 비검사 경고를 제거하라
- 비검사 경고는 런타임에
ClassCastException
이 발생할 수 있음을 알려준다.- 최대한 없애도록 노력하고, 경고가 발생했는데 없애는 방법을 모른다면
@SuppressWarings("unchecked")
를 사용하여 경고를 숨겨라@SuppressWarings
은 최대한 좁은 범위에서 쓰여야 한다.
- 최대한 없애도록 노력하고, 경고가 발생했는데 없애는 방법을 모른다면
3. 배열보다는 리스트를 사용하라
- 배열은 런타임에서 안전하지 않고, 리스트는 반대로 컴파일 타임에서 안전하지 않다.
- 하지만 오류는 빨리 발생하는것이 좋으므로 리스트를 사용해야 한다.
4. 이왕이면 제네릭 타입으로 만들라
제네릭으로 만드는 방법
클래스 선언에 타입 매개변수를 선언하고 Object를 적절한 매개변수로 바꾼다.
오류가 발생하면 아래 두가지 방법 중 하나로 해결
Object 배열을 생성한 뒤에 제네릭 배열로 형변환
(E[]) Object[]
필드 타입을 오브젝트 배열로 선언
Object[] element
→E[] element
5. 이왕이면 제네릭 메서드로 만들라
6. 한정적 와일드카드를 사용해 API 유연성을 높이라
- 매개변수 타입(제네릭)은 불공변하는 성질을 가지고 있다.
List<String>
과List<Object>
는 어떠한 상위/하위 관계가 아니다.- 따라서 유연성이 적을 수 밖에 없는데, 이 때 한정적 와일드카드를 사용하면 유연성을 높일 수 있다.
- 펙스(PECS : producer - extends, consumer-super)
- 하위 타입까지 포함하는 한정적와일드 카드의 예:
<? extends E>
- 상위 타입까지 포함하는 한정적와일드 카드의 예:
<? super E>
- 하위 타입까지 포함하는 한정적와일드 카드의 예:
7. 제네릭과 가변인수를 함께 쓸 때는 신중하라
- 제네릭과 가변인수를 함께쓰면 안전하지 않다.
8. 타입 안전 이종 컨테이너를 고려하라
- 이종 컨테이너는 Class를 키로 사용하는 일종의 Map으로써 다양한 타입의 키를 받을 수 있다.
※ 참고
- 이펙티브 자바 - 조슈아 블로크
'BOOK > [이펙티브 자바]' 카테고리의 다른 글
[Effective Java] Chapter7 람다와 스트림 (0) | 2022.03.17 |
---|---|
[Effective Java] Chapter6 열거 타입과 애너테이션 (0) | 2022.03.15 |
[Effective Java] Chapter4 클래스와 인터페이스 (0) | 2022.02.10 |
[Effective Java] Chapter3 모든 객체의 공통 메서드 (0) | 2022.02.08 |
[Effective Java] Chapter2 객체 생성과 파괴 (0) | 2022.02.03 |