조슈아 블로크 님의 "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")
- 비검사 경고 무시
- 타입 안전하다 확신이 들면 경고를 숨기기
'Java' 카테고리의 다른 글
[Effective Java] 5-3. 제네릭: 고려 사항 (0) | 2024.12.30 |
---|---|
[Effective Java] 5-2. 제네릭: 권고 사항 (3) | 2024.12.28 |
[Effective Java] 4-4. 클래스와 인터페이스: 클래스 (0) | 2024.12.27 |
[Effective Java] 4-3. 클래스와 인터페이스: 인터페이스 (0) | 2024.12.27 |
[Effective Java] 4-2. 클래스와 인터페이스: 상속보다는 컴포지션을 사용하라 (2) | 2024.12.27 |