참조: Effective Java 2nd Edition. Item 24: Eliminate unchecked warnings


Set<Lark> exaltation = new HashSet();

다음과 같은 코드는 컴파일 시 unchecked 경고를 발생시킨다. 

Set<Lark> exaltation = new HashSet<Lark>();

이렇게 수정하면 경고가 사라진다. 가능한 모든 unchecked 경고를 없애자. 모든 경고를 제거했다면 코드의 타입 안전성을 확보하는 것이다. 즉 실행시에 ClassCastException을 보지 않을 것이다.

만약 경고를 없앨 수 없지만 타입 안전성을 확신한다면 @SupressWarnings("unchecked") 애노테이션을 사용하여 경고를 무시할 수 있다.

SupressWarning 애노테이션을 사용할 때는 항상 최소 단위에 적용하도록 하자. 만약 클래스위에 붙여버리면 @_@.. 메서드에 붙여도 @_@. 메서드 내부에 코드가 많다면 그 중 어디선가 또 다른 타입 안전성 문제가 발생할 수 있다. 메서드 내부에 변수를 만들고 해당 변수에다가 붙이자. 단 한 줄짜리 메서드라면 뭐.. 

SupressWarning 애노테이션을 사용할 때마다 왜 타입 안전성이 보장되는지 주석을 달아두도록 하자. 그래야 다른 사람들도 이해할 수 있다.

요약: 경고는 중요하다. 무시하지 말자. 모든 unchecked 경고는 잠재적으로 런타임시의 ClassCastException에 해당한다. 이 경고들을 없애는데 주력하자. 만약 없앨 수 없지만 타입 안전성을 확신한다면 가장 최소한의 규모에 @SuppressWarning("unchecked") 애노테이션을 붙이자. 그리고 그렇게 결정한 이유를 주석으로 남기자.