제네릭을 사용하면서 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[] elements를 T[]로 형변환하는 과정에서 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을 사용하면서도 해당 코드에서 발생할 수 있는 문제점에 대해 충분히 이해하고 개발자가 책임을 질 수 있는 상황에서만 사용해야 한다.
'Language > Java' 카테고리의 다른 글
[effective java] 아이템 29. 이왕이면 제네릭 타입으로 만들라. (0) | 2023.05.09 |
---|---|
[effective java] 아이템 28. 배열보다는 리스트를 사용하라. (0) | 2023.05.09 |
[effective java] 아이템 26. Raw 타입은 사용하지 말라. (0) | 2023.05.09 |
[effective java] 아이템 25. 톱레벨 클래스는 한 파일에 하나만 담으라. (0) | 2023.05.09 |
[effective java] 아이템 17. 변경 가능성을 최소화하라. (0) | 2023.03.25 |