Post

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.