Java

[Effective Java] 5-1. 제네릭: 제한 사항

noahkim_ 2024. 12. 27. 22:04

조슈아 블로크 님의 "Effective Java" 책을 정리한 포스팅 입니다.


1. 로 타입은 사용하지 말라

타입

제네릭 타입
  • 제네릭 클래스: 클래스 선언에 타입 매개변수가 쓰인 클래스
  • 제네릭 인터페이스: 인터페이스 선언에 타입 매개변수가 쓰인 인터페이스

 

매개변수화 타입
  • 타입 매개변수의 타입

 

로 타입
  • 제네릭 타입에서 타입 매개변수를 전혀 사용하지 않을 때
  • 호환성 때문에 남아있음

 

제네릭 타입 권고

타입 안정성
  • 컬렉션에서 원소를 꺼내는 모든 곳에 보이지 않는 형변환을 추가

 

디버깅
  • 오류는 가능한 컴파일 타임에 발견하는 것이 좋음
  • 런타임에 발견 시, 원인 제공 코드를 발견하기 어려움

 

제네릭 규칙

소거 방식
  • 컴파일 후, 런타임에 타입 정보가 제거되는 방식
  • 하위 호환성을 위해 소거 방식으로 구현되었음

 

하위 타입 규칙
List<Object> objectList = new ArrayList<String>(); // 허용되지 않음 (컴파일 에러)
  •  불공변성
    • 타입 매개변수의 관계와 객체 타입과 관계 없음
    • 제네릭 타입간의 관계를 허용할 경우 타입 안정성을 잃을 수 있음

 

와일드카드
List<? extends Object> list = new ArrayList<String>();
List<? super String> list = new ArrayList<Object>();
  • 상한 제한
  • 하한 제한

 

instanceof
  • 로 타입에서만 사용 가능
  • 런타임에 타입이 소거되기 때문

 

2. 비검사 경고를 제거하라

  • 타입 안정성을 보장받기 위해 비검사 경고를 제거

 

제네릭을 사용하면 많은 컴파일러 경고가 발생함
  • 비검사 형변환 경고
  • 비검사 메서드 호출 경고
  • 비검사 매개변수화 가변인수 타입 경고
  • 비검사 변환 경고

 

@SuppressWarnings("unchecked")
  • 비검사 경고 무시
  • 타입 안전하다 확신이 들면 경고를 숨기기