Item 27 - 비검사 경고를 제거하라
제네릭을 사용하면 수많은 컴파일러 경고를 볼 수 있다. (비검사 경고)
ex. 비검사 형변환 경고, 비검사 메서드 호출 경고, 비검사 매개변수화 가변인수 타입 경고 등
비검사 경고 예시
1
Set<String> words = new HashSet();
위 코드에서는 다음과 같은 경고를 볼 수 있다.
1
2
Raw use of parameterized class HashSet
Unchecked assignment: java.util.HashSet to java.util.Set<java.lang.String>
- 인스턴스로 생성한
HashSet
을 로 타입으로 사용했기 때문에 나타난 비검사 경고이다.
컴파일러가 알려준대로 HashSet<String>
과 같이 타입 매개변수를 명시하던가,
자바 7부터 지원하는 다이아몬드 연산자 <>
를 활용해 경고를 없앨 수 있다.
1
Set<String> set = new HashSet<>();
- 다이아몬드 연산자를 사용하면 컴파일러가 올바른 실제 타입 매개변수를 추론해준다.
비검사 경고를 제거할 수 없을 때
경고를 제거할 수는 없지만 타입 안전하다고 확신한다면
@SuppressWarnings("unchecked")
애너테이션을 달아 경고를 숨기자.
- 해당 애너테이션을 붙이면 경고 없이 컴파일은 되지만, 런타임 시에
ClassCastException
을 던질 수 있다. - 해당 애너테이션은 개별 지역변수 선언부터 클래스 전체까지 다 달 수 있지만, 가능한 좁은 범위에 적용하자.
- 경고를 놓칠 수 있기 때문이다.
- 해당 애너테이션을 사용할 때는 그 경고를 무시해도 안전한 이유를 주석으로 꼭 달아놓자.
💡 핵심 정리
- 비검사 경고는 중요하니 무시하지 말자.
- 비검사 경고는 런타임에
ClassCastException
을 일으킬 수 있는 잠재적 가능성을 뜻하니 최대한 제거하라. - 경고를 없앨 수 없다면, 타입 안전함을 증명하고, 가능한 한 범위를 좁혀
@SuppressWarnings("unchecked")
애너테이션으로 경고를 숨겨라.- 경고를 숨기기로 한 근거를 주석으로 남겨라.
This post is licensed under CC BY 4.0 by the author.