비 검사 경고를 제거하라
제네릭을 사용하기 시작하면 수많은 컴파일러 경고를 보게 될 것이다.
- 비검사 형변환 경고
- 비검사 메서드 호출 경고
- 비검사 매개변수화 가변인수 타입 경고
- 비검사 변환 경고
그리고, 새로 작성한 코드가 한번에 깨끗하게 컴파일되리라 기대하지는 말자.
대부분의 비검사 경고는 쉽게 제거할 수 있다. 컴파일러가 알려준 잘못된 코드를 수정하면 경고가 사라진다.
JAVA 7부터 지원하는 다이아몬드 연산자(
<>
)만으로 해결할 수 있다.java Set<Lark> exaltation = new HashSet<>();
할 수 있는 한 모든 비검사 경고를 제거하라
모두 제거하면 타입 안정성이 보장된다.
런타임에 ClassCastException이 발생할 일이 없고, 내가 의도한대로 잘 동작한다.
@SuppressWarnings("unchecked")
경고를 제거할 수는 없지만 타입이 안전하다고 확신할 수 있으면 @SuppressWarnings("uncheck") 애너테이션을 사용해서 경고를 숨기자.
- 검증하지 않은 채 경고를 숨기면,
경고없이 컴파일이 되어도 런타임에 여전히 ClassCastException을 던질 수 있다. - 안전하다고 검증된 비검사 경고를 (숨기지 않고) 그대로 두면,
진짜 문제를 알리는 새로운 경고가 나와도 눈치채지 못할 수 있다.
가능한 한 좁은 범위에 적용하자.
- 변수 선언, 아주 짧은 메서드, 생성자에서만 적용하자.
- 절대로 클래스 전체에 적용해서는 안 된다.
- return 문에는 사용할 수 없다.
경고를 무시해도 안전한 이유를 항상 주석으로 남겨야한다.
@SuppressWarning("unchecked") 애너테이션을 사용할 때 그 경고를 무시해도 안전한 이유를 항상 주석으로 남겨야한다.
- 다른 사람이 코드를 이해하는 데 도움이 된다.
- 다른 사람이 코드를 잘못 수정해서 타입 안전성을 잃는 상황을 줄여준다.
✅ 핵심정리
내용 정리하기 전에, 핵심 포인트를 집어보자.
- 비검사 경고는 중요하니 무시하지 말자.
- 모든 비검사 경고는 런타임에 ClassCastException을 일으킬 수 있기 때문에 제거하자.
- 경고를 없앨 방법을 찾지 못하겠으면, 코드가 타입 안전함을 증명하고 가능한 범위를 좁혀서 애너테이션을 사용하자.
'Dev Books > Effective Java' 카테고리의 다른 글
[item 25] 톱레벨 클래스는 한 파일에 하나만 담으라 (0) | 2024.06.17 |
---|---|
[item 28] 배열보다는 리스트를 사용하라 (0) | 2024.05.31 |
[item 26] 로 타입은 사용하지 말라 (0) | 2024.05.31 |
[item 24] 멤버 클래스는 되도록 static으로 만들라. (0) | 2024.04.05 |
[item 3] private 생성자나 열거 타입으로 싱글턴임을 보증하라 (1) | 2024.01.14 |
댓글