티스토리 뷰
728x90
반응형
비검사 경고를 제거하라
💡비검사 경고란?
- 비검사 경고란 에러는 아니지만 warning이 뜨거나 영역이 노란색으로 되어 개발자에게 경고를 알려주는 것입니다. 제네릭을 사용하면서 자주만나게 되며, 비검사 경고로는 비검사 형변환, 메서드 호출, 매개변수화 가변인수 타입, 변환 경고등 다양한데 이러한 대부분의 비검사 경고들은 쉽게 해결할 수 있습니다.
💡비검사 경고해결 방법
- 자바 7버전부터는 다이아몬드 연산자(<>)만으로도 해결이 가능합니다.(타입 추론 가능)
- 이런 경고는 해결하기 쉬운 경고이며, 해결하기 어렵거나 바로 해결할 수 없는 경고가 나타날 수 있는데 이런 비검사 경고를 최대한 제거할 수 있도록 해야합니다. 그렇게 된다면 타입 안전성이 보장됩니다.
List<Food> foods = new ArrayList<Food>();
// or
List<Food> foods = new ArrayList<>();
💡@SupperssWarning("unchecked")
- 만약 경고를 제가할 수는 없지만 타입이 안전하다고 확신할 수 있는 경우라면 해당 어노테이션을 사용하여 경고를 숨길 수 있습니다.
- 단, 타입 안전성을 검증하지 않은 채 경고를 숨기면 스스로에게 잘못된 보안 인식을 심어주는 꼴이 될 수 있습니다. 그 코드는 경고없이 컴파일되겠지만 런타임에는 여전히 ClassCastException을 발생시킬 수 있습니다. 한편, 안전하다고 검증된 비검사 경고를 숨기지 않고 그대로 두면 진짜 문제를 알리는 새로운 경고가 나와도 눈치재치 못할 수 있습니다.
- 해당 어노테이션은 개별 지역변수 선언부터 클래스 레벨까지 어디에도 선언할 수 있지만 항상 가능한 좁은 범위에 적용해야 합니다.
- 즉 변수 선언, 짧은 메서드, 생성자 정도에 사용이 될 것이며, 범위가 넓어질수록 해당 어노테이션이 경고를 숨기는 범위가 넓어지기 때문에 위험합니다. 그러므로 범위는 최소화하는게 좋습니다.
💡예제 코드
- 아래는 ArrayList 클래스 중 일부입니다.
- 아래는 return문에서 비검사 경고가 발생할 것입니다. 요구되는건 정규타입 매개변수이지만 elementData는 Object타입이기 때문입니다. 그래서 @SuppressWarning 어노테이션을 사용하여 경고를 숨길 수 있습니다.
public class ArrayList<E> ... {
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;
}
}
💡 SuppressWarning
- 해당 어노테이션을 사용하되 해당 코드가 비검사 경고를 무시해도 되는 이유를 주속으로 달아주어야합니다. 그래야 다른 사람이 해당 코드를 보고 왜 이 어노테이션이 붙은지 알 수 있기 때문입니다.
public class ArrayList<E> ... {
public <T> T[] toArray(T[] a) {
if (a.length < size) {
@SuppressWarning("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을 발생시킬 수 있는 잠재적 가능성을 뜻하니 최대한 제거하는게 좋습니다.
- 방법을 찾지 못했다면, 그 코드가 타입 안전함을 증명하고 가능한 범위를 좁혀 @SuppressWarning 어노테이션을 사용하여 경고를 숨기고 숨긴 이유를 주석으로 남겨야 합니다.
728x90
반응형
'스터디 > 이펙티브 자바' 카테고리의 다른 글
이펙티브 자바 - Item29. 이왕이면 제네릭 타입으로 만들라. (0) | 2022.07.20 |
---|---|
이펙티브 자바 - Item28. 배열보다는 리스트를 사용하라. (0) | 2022.07.18 |
이펙티브 자바 - Item26. 로 타입은 사용하지 말라. (0) | 2022.07.17 |
이펙티브 자바 - Item24. 멤버 클래스는 되도록 static으로 만들라. (0) | 2022.07.16 |
이펙티브 자바 - Item23. 태그 달린 클래스보다는 클래스 계층구조를 활용하라. (0) | 2022.07.16 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- pipeline architecture
- @ControllerAdvice
- redis sorted set으로 대기열 구현
- 레이어드 아키텍처란
- 공간 기반 아키텍처
- java userThread와 DaemonThread
- spring boot 엑셀 다운로드
- 람다 표현식
- spring boot excel download oom
- 트랜잭셔널 아웃박스 패턴 스프링 부트 예제
- transactional outbox pattern spring boot
- 서비스 기반 아키텍처
- 트랜잭셔널 아웃박스 패턴 스프링부트
- 자바 백엔드 개발자 추천 도서
- java ThreadLocal
- spring boot redisson destributed lock
- space based architecture
- polling publisher spring boot
- redis sorted set
- pipe and filter architecture
- spring boot excel download paging
- spring boot redisson sorted set
- redis 대기열 구현
- microkernel architecture
- transactional outbox pattern
- spring boot poi excel download
- spring boot redisson 분산락 구현
- spring boot redis 대기열 구현
- JDK Dynamic Proxy와 CGLIB의 차이
- service based architecture
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함