티스토리 뷰
반응형
제네릭 사용시에 컴파일러 경고를 많이 보게 될 것이다. (비검사 경고)
대부분의 비검사 경고는 쉽게 제거할 수 있다.
할수 있는한 모든 비검사 경고를 제거하라. 그러면 타입 안전성이 보장된다.
비검사 경고 예시
Set<String> set = new HashSet();
위 코드는 구현체 타입을 명확히 작성하지 않고 HashSet 객체를 생성하고 있다.
이는 컴파일러가 아래와 같이 경고를 한다.
Set<String> set = new HashSet();
^
required: Set<String>
found: HashSet
컴파일러가 알려준대로 수정하면 경고가 사라지지만,
자바7부터 다이아몬드 연산자(<>)를 지원하기 때문에 그걸로 해결할 수 있다.
다이아몬드 연산자를 사용하면 컴파일러가 올바른 실제 타입 매개변수를 추론해준다.
Set<String> set = new HashSet<>();
비검사 경고를 제거할 수 없을때
- 최대한 경고를 제거해도 제거할 수 없을때 타입 안전하다고 확신한다면 @SuppressWarnings(”unchecked”) 애너테이션을 달아서 경고를 숨기자.
- 이 애너테이션을 붙이면 경고 없이 컴파일은 되지만, 런타임 시에 ClassCastException 을 던질 수 있다.
- 이 애너테이션은 개별 지역변수 선언부터 클래스 전체까지 다 달 수 있지만 항상 가능한 좁은 범위에 적용하자. (경고를 놓칠 수 있기 때문)
- 이 애너테이션을 사용할 때는 그 경고를 무시해도 안전한 이유를 주석으로 꼭 달아놓자.
결론
비검사 경고는 중요하니 무시하지 말자.
비검사 경고는 런타임에 ClassCastException 을 일으킬 수 있는 잠재적 가능성을 말하는 것이기 때문에 최대한 제거해라.
경고를 못없앤다면 타입 안전함을 증명하고 가능한 범위를 좁혀 @SuppressWarnings(”unchecked”) 애너테이션으로 경고를 숨겨라.
(경고를 숨겨도 되는 이유를 주석으로 꼭 설명)
반응형
'Java > Effective Java' 카테고리의 다른 글
[Effective Java] 29.이왕이면 제네릭 타입으로 만들라 (0) | 2022.03.23 |
---|---|
[Effective Java] 28.배열보다는 리스트를 사용하라 (0) | 2022.03.23 |
[Effective Java] 26.로 타입은 사용하지 말라 (0) | 2022.03.18 |
[Effective Java] 25.톱레벨 클래스는 한 파일에 하나만 담으라 (0) | 2022.03.17 |
[Effective Java] 24.멤버 클래스는 되도록 static으로 만들라 (0) | 2022.03.17 |
댓글