티스토리 뷰

반응형

제네릭 사용시에 컴파일러 경고를 많이 보게 될 것이다. (비검사 경고)

대부분의 비검사 경고는 쉽게 제거할 수 있다.

할수 있는한 모든 비검사 경고를 제거하라. 그러면 타입 안전성이 보장된다.

 

비검사 경고 예시

Set<String> set = new HashSet();

위 코드는 구현체 타입을 명확히 작성하지 않고 HashSet 객체를 생성하고 있다.

이는 컴파일러가 아래와 같이 경고를 한다.

Set<String> set = new HashSet();
                          ^
  required: Set<String>
  found:    HashSet

컴파일러가 알려준대로 수정하면 경고가 사라지지만,

자바7부터 다이아몬드 연산자(<>)를 지원하기 때문에 그걸로 해결할 수 있다.

다이아몬드 연산자를 사용하면 컴파일러가 올바른 실제 타입 매개변수를 추론해준다.

Set<String> set = new HashSet<>();

 

비검사 경고를 제거할 수 없을때

  • 최대한 경고를 제거해도 제거할 수 없을때 타입 안전하다고 확신한다면 @SuppressWarnings(”unchecked”) 애너테이션을 달아서 경고를 숨기자.
  • 이 애너테이션을 붙이면 경고 없이 컴파일은 되지만, 런타임 시에 ClassCastException 을 던질 수 있다.
  • 이 애너테이션은 개별 지역변수 선언부터 클래스 전체까지 다 달 수 있지만 항상 가능한 좁은 범위에 적용하자. (경고를 놓칠 수 있기 때문)
  • 이 애너테이션을 사용할 때는 그 경고를 무시해도 안전한 이유를 주석으로 꼭 달아놓자.

 

결론

비검사 경고는 중요하니 무시하지 말자.

비검사 경고는 런타임에 ClassCastException 을 일으킬 수 있는 잠재적 가능성을 말하는 것이기 때문에 최대한 제거해라.

경고를 못없앤다면 타입 안전함을 증명하고 가능한 범위를 좁혀 @SuppressWarnings(”unchecked”) 애너테이션으로 경고를 숨겨라.

(경고를 숨겨도 되는 이유를 주석으로 꼭 설명)

반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday