[아이템 26] raw type은 사용하지 말라
IT 개발/개념 정리
2022. 5. 27. 23:53
제네릭 클래스(인터페이스) : 클래스, 인터페이스 선언 시 타입 매개변수 사용. 제네릭 타입(generic type)
제네릭을 활용하면 주석이 아닌 타입 선언 시 콜렉션 객체의 매개변수화 타입을 알 수 있다.
raw type : 제네릭 타입에서 타입 매개변수를 사용하지 않는 것
raw type을 쓰면 제네릭이 안겨주는 안전성과 표현력을 모두 잃게 된다.
- 제네릭이 나오기 이전의 자바에서 raw type으로 사용된 코드가 이미 사용되고 있어 마이그레이션 호환성을 위해 raw type을 지원
- 대신 제네릭 구현에는 소거(erasure:아이템 28) 방식을 사용
- * 예외 1 : class 리터럴에는 raw type을 써야한다.
- * 예외 2 : instanceof 연산자 : 런타임에는 제네릭 타입 정보가 지워져 instanceof 연산자는 비한정적 와일드카드 타입 이외의 매개변수화 타입에는 적용할 수 없다.
List<Object>처럼 임의 객체를 허용하는 매개변수화 타입은 괜찮다.
List<Object>같은 매개변수화 타입을 사용할 때와 달리 List 같은 raw type을 사용하면 타입 안정성을 잃게 된다.
- 제네릭 하위 타입 규칙 : List<String>은 raw type인 List의 하위 타입이나, List<Object>의 하위 타입은 아닌다.
제네릭 타입을 쓰고 싶지만 실제 타입 매개변수가 무엇인지 신경 쓰고 싶지 않다면 물음표(?) - 와일드카드 타입
- 와일드카드 타입은 안전하고, raw tyype은 안전하지 않다.
- raw type 컬렉션에는 아무 원소나 넣을 수 있으나 타입 불변식을 훼손
- * Collection<?>에는 (null 외에는) 어떤 원소도 넣을 수 없다. (아이템 30, 31 참조)
뒷 장에서 확인할 내용
컴파일러 경고를 숨기지 않았어야한다.(아이템 27)
제네릭 구현에는 소거(erasure : 아이템 28) 방식을 사용
반응형
'IT 개발 > 개념 정리' 카테고리의 다른 글
[아이템 28] 배열보다는 리스트를 사용하라 (0) | 2022.05.29 |
---|---|
[아이템 27] 비검사 경고를 제거하라 (0) | 2022.05.28 |
[아이템 25] 톱레벨 클래스는 한 파일에 하나만 담으라 (0) | 2022.05.27 |
[아이템 23] 태그 달린 클래스보다는 클래스 계층구조를 활용하라 (0) | 2022.05.27 |
[아이템 22] 인터페이스는 타입을 정의하는 용도로만 사용하라 (0) | 2022.05.26 |