💥 개요
제네릭을 사용하면 수많은 컴파일러 경고를 보게 된다. 익숙해질수록 마주치는 경고 수는 줄겠지만 새로 작성한 코드가 한번에 깨끗하게 컴파일되리라 기대하지는 말자.
대부분의 비검사 경고는 쉽게 제거가 가능하고, 컴파일러가 이를 알려준다.
이대로 수정하기만 하면 경고가 사라진다.
하지만 제거하기 어려운 경고도 있다. 하지만 포기하지말고 할 수 있는 모든 비검사 경고를 제거하라.
모두 제거하면 타입 안정성이 보장된다.(런타임에 ClassCastException이 발생할 일이 없다.)
경고를 제거할 수 없지만 타입 안전한 경우
@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;
}
...
}
클래스에 어노테이션을 적용하면 자칫 심각한 경고를 놓칠 수 있으니, 절대로 넓은 범위에 적용해서는 안된다.
한 줄이 넘는 메서드나 생성자에 달린 경우에는 지역 변수 선언쪽으로 옮기자.
그리고 주석으로 반드시 경고를 숨긴 이유를 남겨야 한다.
SuppressWarning의 매개변수
- all : 모든 경고를 표시 안함
- cast: 캐스트 연산자 관련 경고를 표시 안함
- dep-ann : 사용하지 말아야 할 주석 관련 경고를 표시 안함
- deprecation : 사용하지 말아야 할 메소드 관련 경고를 표시 안함
- fallthroush : switch문에서의 break 누락 관련 경고를 표시 안함
- finally : 반환하지 않는 finally 블럭 관련 경고를 표시 안함
- null : null 분석 관련 경고를 표시 안함
- rawtypes : 제네릭을 사용하는 클래스 매개 변수가 불특정일 때의 경고를 표시 안함
- unchecked : 검증되지 않은 연산자 관련 경고를 표시 안함
- unused : 사용하지 않는 코드 관련 경고를 표시 안함
🤔 나의 생각
비검사 경고를 제거하는것에 대해서는 전적으로 동의한다. 하지만 SuppressWarning과 같은 어노테이션은 정말 신중해야 한다고 생각한다. 굳이 저런식으로 작성하면서, 주석까지 다는게 과연 맞을까? 라는 생각을 하게 되었다. 모든 경우의 수를 생각해서 코드를 작성하기에는 너무나 많은 노력과, 시간이 들기 때문에 type safe하게 모든 비검사 경고를 제거하는 방향으로 로직을 작성하는게 오히려 낫다고 생각한다.
'Study > 이펙티브 자바' 카테고리의 다른 글
[Effective Java 3E] 이왕이면 제네릭 타입으로 만들라 (1) | 2023.11.28 |
---|---|
[Effective Java 3E] 배열보다는 리스트를 사용하라 (0) | 2023.11.10 |
[Effective Java 3E] 로 타입은 사용하지 말라 (0) | 2023.11.01 |
[Effective Java 3E] 멤버 클래스는 되도록 static으로 만들라 (0) | 2023.10.26 |