반응형
이 포스팅에서 작성하는 내용은 EFFECTIVE JAVA(이펙티브자바) 에서 발췌하였습니다.
아이템 27. 비검사 경고를 제거하라
제네릭을 사용하기 시작하면, 컴파일러의 경고를 볼 수 있다. 그 중 비검사 경고에 대해서 알아볼 것이다.
비검사 경고
- 대부분의 비검사 경고는 쉽게 제거할 수 있으며, 컴파일러는 무엇이 잘못됐는 지 알려준다.
(javac 명령줄 인수에 -Xlint:uncheck 옵션을 추가해야만 함) - 컴파일러가 알려준대로 수정하면 경고는 사라진다.
- 비검사 경고를 모두 해결하여 제거한다면 그 코드는 타입 안정성이 보장된다.
(런타임에 ClassCastException이 발생할 일이 없고 의도한 대로 잘 동작하리라 확신할 수 있다.) - 즉, 할 수 있는 한 모든 비검사 경고를 해결하여 제거해야한다.
ex 1) 잘못된 코드를 알려주는 비검사 경고
// 코드
Set<Lark> exaltation = new HashSet();
// 경고
Venery.java:4: warning: [unchecked] unchecked conversion
Set<Lark> exaltation = new HashSet();
^
required: Set<Lark>
found: HashSet
어노테이션 @SuppressWarnings("unchecked")
- 경고를 제거할 수는 없지만 안전하다고 확실할 수 있는 경우 @SuppressWarnings("unchecked") 어노테이션을 달아 경고를 숨길 수 있다.
- 그 코드는 경고 없이 컴파일되겠지만, 런타임 시에 잘못하면 ClassCastException이 발생할 수 있다.
- 안전하다고 검증된 비검사 경고를 숨기지 않고 두면, 진짜 문제를 알리는 새로운 경고가 나와도 눈치채지 못할 수도 있다. (수많은 경고에 파묻힐 가능성이 있기 때문)
- @SuppressWarnings("unchecked") 은 개별 지역변수 선언부터 클래스 전체까지 어떤 선언에도 달 수 있지만,
항상 가능한 한 좁은 범위에 적용해야한다. (심각한 경고를 놓칠 수도 있음) - 이 어노테이션을 사용하면, 그 경고를 무시해도 안전한 이류를 항상 주석으로 남겨놔야 한다.
ex 2) 비검사 경고가 발생하는 ArrayList의 toArray 메서드
public <T> T[] toArray(T[] a) {
if (a.length < size)
return (T[]) Arrays.copyOf(elementData, size, a.getClass());
System.arraycopy(elementData, 0, a, 0, size);
if (a.length > size)
a[size] = null;
return a;
}
// 위의 소스를 컴파일하면 다음과 같은 경고가 발생함
ArrayList.java:305: warning: [unchecked] unchecked cast
return (T[]) Arrays.copyOf(elements, size, a.getClass());
^
required: T[]
found: Object[]
ex 3) 위의 toArray메서드에 @SuppressWarnings 추가
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;
}
정리
- 비검사 경고는 중요하니 무시하지 말자
- 모든 비검사 경고는 런타임에 ClassCastException이 발생할 수 있으니, 해결해야한다.
- 만약, 그 코드가 타입 안전함이 증명된다면 @SuppressWarnings("unchecked") 어노테이션으로 경고를 숨기고 그 근거를 주석으로 남기자.
반응형
'BE > Java' 카테고리의 다른 글
[Effective Java] 아이템 29. 이왕이면 제네릭 타입으로 만들라 (0) | 2022.10.12 |
---|---|
[Effective Java] 아이템 28. 배열보다는 리스트를 사용하라 (0) | 2022.10.11 |
[Effective Java] 아이템 26. 로 타입은 사용하지 말라 (0) | 2022.10.06 |
[Effective Java] 아이템 25. 톱레벨 클래스는 한 파일에 하나만 담으라 (0) | 2022.10.05 |
[Effective Java] 아이템 24. 멤버 클래스는 되도록 static으로 만들라 (0) | 2022.10.04 |