[Effective Java] 아이템 27. 비검사 경고를 제거하라

2022. 10. 7. 22:59· BE/Java
목차
  1. 아이템 27. 비검사 경고를 제거하라
반응형

EFFECTIVE JAVA(이펙티브 자바)

 

 

 

이 포스팅에서 작성하는 내용은 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
  1. 아이템 27. 비검사 경고를 제거하라
'BE/Java' 카테고리의 다른 글
  • [Effective Java] 아이템 29. 이왕이면 제네릭 타입으로 만들라
  • [Effective Java] 아이템 28. 배열보다는 리스트를 사용하라
  • [Effective Java] 아이템 26. 로 타입은 사용하지 말라
  • [Effective Java] 아이템 25. 톱레벨 클래스는 한 파일에 하나만 담으라
멍목
멍목
개발 관련 새롭게 알게 된 지식이나 좋은 정보들을 메모하는 공간입니다.
반응형
멍목
김멍목의 개발블로그
멍목
전체
오늘
어제
  • 분류 전체보기 (514)
    • BE (190)
      • Spring (21)
      • Java (141)
      • Kotlin (6)
      • JPA (22)
    • FE (33)
      • Javascript (16)
      • Typescript (0)
      • React (5)
      • Vue.js (9)
      • JSP & JSTL (3)
    • DB (32)
      • Oracle (22)
      • MongoDB (10)
    • Algorithm (195)
    • Linux (8)
    • Git (6)
    • etc (42)
    • ---------------------------.. (0)
    • 회계 (4)
      • 전산회계 2급 (4)
    • 잡동사니 (2)

블로그 메뉴

  • 홈
  • 관리

공지사항

인기 글

태그

  • 코테 공부
  • JPA
  • Java to Kotlin
  • 자바공부
  • 프로젝트로 배우는 Vue.js 3
  • 이펙티브자바
  • 더 자바 Java 8
  • 알고리즘 공부
  • 알고리즘공부
  • 자기개발
  • 자바 공부
  • 자바 개발자를 위한 코틀린 입문
  • Effective Java
  • 자기 공부
  • MongoDB with Node.js
  • 더 자바 애플리케이션을 테스트하는 다양한 방법
  • 자바 테스팅 프레임워크
  • 코테공부
  • MongoDB 공부
  • Oracle
  • 코틀린
  • 전산회계 2급 준비
  • JPA 공부
  • vue3 공부
  • 자기 개발
  • java 8
  • junit5
  • 이펙티브 자바
  • MongoDB 기초부터 실무까지
  • 자기공부

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.0
멍목
[Effective Java] 아이템 27. 비검사 경고를 제거하라
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.