less than 1 minute read

item 27 비검사 경고(unchecked warning)를 제거하라.

비검사 경고

처음 제너릭을 사용하기 시작하면 수많은 컴파일러 경고를 보게 될 것이나, 대부분의 비검사 경고는 쉽게 제거할 수 있다.

Set<String> words = new HashSet();

예를 들어, 위와 같은 코드를 컴파일할 때 -Xlint:unchecked 옵션을 주어 컴파일하면 다음과 같은 비검사 경고가 발생할 것이다.

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

이와 같은 경고가 발생하는 경우,

  1. 타입 매개변수를 명시하거나
  2. 다이아몬드 연산자<> 를 덧붙이면 컴파일러가 타입 추론을 해 주어 해결할 수 있다.

@SuppressWarnings("unchecked")

  • 어노테이션을 이용해 경고를 숨길 수 있으며, 경고를 제거할 수 없으나 type-safe하다는 확신이 있을 때 사용한다.
    • 만일 문제가 있는 코드에 어노테이션을 사용한다면 런타임 시에 ClassCastException이 발생할 것이다.
  • 지역변수 선언부터 클래스 전체까지 선언에 적용이 가능하나, 가능한 한 좁은 범위에 적용하는 것을 권장한다.
  • 코드의 이해와 유지보수 측면에서, 이 어노테이션을 사용할 때는 경고를 무시해도 좋은 이유를 명시하는 것이 좋다.
public <T> T[] toArray(T[] a) {
    if (a.length < size) {
	// 생성한 배열과 매개변수로 받은 배열의 타입이 모두 T[]로 같으므로 
	// 올바른 형변환이다.
	@SuppressWarnings("unchecked")
	T[] result = (T[]) Arrays.copyOf(elementData, size, a.getClass());
        return result;
    }

    System.arraycopy(elementData, 0, a, 0, size);
    if (a.length > size)
        a[size] = null;
    return a;
}

Leave a comment