본문 바로가기

STUDY/이펙티브자바

5-2) 비검사 경고를 제거하라

비검사 경고

 

//비검사 형변환 경고 발생
Set<String> nameSet = new HashSet();

//타입 매개변수를 명시하여 비검사 형변환 경고 제거
Set<String> nameSet = new HashSet<String>();

제네릭을 사용하기 시작하면 많은 컴파일러 경고를 보게 될 것이다. 위의 코드에서는 보면 Set<String>타입의 변수에 HashSet 객체를 넣으려고 하자 비검사 형변환 경고가 발생했다. HashSet에 타입 파라미터가 없으므로 어떤 타입이 들어갈 지 알 수 없으므로, 런타임에 형변환 문제가 발생 할 수 있다는걸 경고한 것이다. 이는 실제로 위험한 코드이기 때문에 타입 파라미터를 명시하여 비검사 형변환 경고를 제거해주어야 한다.

 

 


@SuppressWarnings

 

@SuppressWarnings("unchecked")
public static <T> T[] toArray(T[] a) {
    return (T[]) Arrays.copyOf(a, a.length, a.getClass());
}

코드가 안전하다고 확신한다면 @SuppressWarning("unchecked") 어노테이션을 달아서 경고를 숨길 수 있다. 위의 코드에서는 copyOf의 결과를 T[]로 형변환 하는 과정에서 경고가 발생하지만 T[] 타입인 a를 복사하는 것이므로 안전한 코드라고 할 수 있다. 따라서 함수에 @SuppressWarning("unchecked") 어노테이션을 달아서 경고를 숨겼다. 하지만 어노테이션으로 경고를 숨길때는 가능한 좁은 범위에 사용하는 것이 좋다. 그리고 주석을 달아서 해당 코드가 안전한 이유를 적어주어야 다른 개발자가 보기에도 좋다. 따라서 경고를 숨길 때는 아래의 코드처럼 해야한다.

 

public static <T> T[] toArray(T[] a) {
    //T[] 타입인 a를 복사하여 T[] 타입으로 형변환 하는 것이므로 안전한 코드이다
    @SuppressWarnings("unchecked")
    T[] result = (T[]) Arrays.copyOf(a, a.length, a.getClass());
    return result;
}
728x90