Language/Java

[effective java] 아이템 27. Unchecked Warning을 제거하라.

JOYERIM 2023. 5. 9. 01:35

 

 

 

제네릭을 사용하면서 Unchecked Warning을 많이 접할 수 있다. 타입 안정성을 보장하기 위해, 최대한 Unchecked Warning이 발생하지 않도록 코드를 작성해야 한다.

 

 

 

  Checked Exception Unchecked Exception
확인 시점 컴파일 시점 런타임 시점
처리 여부 반드시 예외 처리해야 한다. (컴파일 안됨) 명시적으로 하지 않아도 된다. (특정 런타임 때 에러가 발생할 가능성이 있다.)
종류 IOException, ClassNotFoundException 등 NullPointerException, ClassCastException 등

 

 

 

 

 

@SuppressWarnings("unchecked")

 

경고를 제거할 수는 없지만 타입 안전하다고 확신할 수 있다면 @SuppressWarnings("unchecked") 에너테이션을 달아서 경고를 숨기자.

 

 

개별 지역변수부터 클래스 전체까지 어디에나 선언 가능하지만, 항상 최대한 범위를 좁히자. 심각한 경고를 놓칠 수 있으니 절대로 클래스 전체에 적용해서는 안 된다.

 

 

 

적절하게 @SuppressWarnings("unchecked") 에너테이션을 적용하는 예시를 보자.

 

// ArrayList의 toArray 메서드
public <T> T[] toArray(T[] a) {
    if (a.length < size)
        return (T[]) Arrays.copyOf(elements, size, a.getClass());
    System.arraycopy(elements, 0, a, 0, size);
    if (a.length > size)
        a[size] = null;
    return a;
}

 

위 코드는 Object[] elementsT[]로 형변환하는 과정에서 Type Safety 경고가 발생한다. 해당 코드에서는 매개 변수로 받은 배열의 타입으로 Array를 새로 생성하기 때문에 모두 T[]로 동일하므로 올바른 형 변환이다. 따라서 @SuppressWarnings("unchecked") 에너테이션으로 경고를 숨길 수 있다.

 

 

public <T> T[] toArray(T[] a) {
    if (a.length < size) {
        // 생성한 배열과 매개변수로 받은 배열의 타입이 모두 T[]로 같으므로 올바른 형변환이다.
        @SuppressWarnings("unchecked") T[] result = 
            (T[]) Arrays.copyOf(elements, size, a.getClass());
        return result;
    }
    System.arraycopy(elements, 0, a, 0, size);
    if (a.length > size)
        a[size] = null;
    return a;
}

 

@SuppressWarnings("unchecked") 에너테이션은 선언에만 달 수 있으므로 지역 변수를 선언하여 달아주었다.

 

@SuppressWarnings("unchecked") 에너테이션을 사용할 때, 경고를 무시해도 안전한 이유를 항상 주석으로 남겨놓자. 

 

 

 

 

 

핵심 요약

 

suppressWarning은 컴파일러가 발생시키는 경고 메시지를 무시하도록 하는 에너테이션이다. 이 에너테이션을 사용하는 이유는 코드의 가독성을 높이기 위해서이다. 종종 제네릭 타입을 사용하는 코드에서는 컴파일러가 경고 메시지를 발생시키는 경우가 있다. 이는 제네릭 타입이 타입 안정성을 보장하지 않을 수 있는 가능성이 있기 때문이다. 하지만, 이러한 경고 메시지를 개발자가 이미 알고 있거나 이미 처리를 하여 의미 없는 메시지일 수 있다. 이때, suppressWarning을 사용하여 컴파일러가 발생시키는 경고 메시지를 무시하도록 하여 코드의 가독성을 높일 수 있다.

 

그러나, 이러한 에너테이션을 사용하면서 무분별하게 경고 메시지를 무시하는 것은 옳지 않다. 경고 메시지가 발생하는 이유를 분석하고, 그에 대한 적절한 대응을 하는 것이 중요하다. 또한, suppressWarning을 사용하면서도 해당 코드에서 발생할 수 있는 문제점에 대해 충분히 이해하고 개발자가 책임을 질 수 있는 상황에서만 사용해야 한다.