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

yeom yaloo·2023년 12월 19일
0

Effective Java

목록 보기
15/20
post-thumbnail

제네릭

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

  • 비검사 경고가 무엇인지 알아보자

[핵심 정리]

  • 제네릭을 사용하면 경고가 줄어들것이다.
  • 그럼에도 뜨는 비검사 경고가 있다면 이를 제거하도록 하자
  • 모든 비검사 경고는 런타임에 ClassCastException을 발생시킬 수 있다. 그러니까 모든 가능한 경고를 제거하도록하자.
  • 경고를 없앨 수 없다면 최대한 범위를 좁혀서 @SuppressWarnings("unchecked")를 사용해 경고를 숨기자

[비검사 경고?]

비검사 경고 (Unchecked Warnings):
컴파일러가 코드에서 타입 안전성을 검증할 수 없거나, 컴파일러가 특정 조건에서 발생하는 경고를 의미합니다. 예를 들어, 제네릭이 사용된 컬렉션에서 원시 타입을 사용하거나, 형 변환을 할 때 타입 캐스트가 안전한지 검증할 수 없는 경우에 비검사 경고가 발생할 수 있습니다. 이러한 경고는 코드의 안정성을 보장하기 위해 컴파일러가 경고를 통해 개발자에게 알려줍니다. 경고는 컴파일 시점에 발생하며 프로그램 실행과는 직접적으로 관련되지 않습니다.

  • 그러나 제네릭을 사용할 때 비검사 경고가 나면 이를 모두 처리하는 것이 좋다.
  • 모두 처리한 경우엔 타입 안전성을 찾을 수 있다.

[경고를 제거하는 예시]

  • Set<Lark> exaltation = new HashSet();: 컴파일러가 해당 코드의 문제점 해경 방안을 명시해준다.
  • Set<Lark> exaltation = new HashSet<>();:타입 매개변수를 명시하여 해당 문제를 해결할 수도 있지만 이 경우엔 다이아몬드 연산자를 이용해서도 문제를 해결할 수 있다.

[경고를 제거하지 못할 땐 @SuppressWarnings("unchecked")]

  • 런타임 시 ClassCastException이 발생할 일이 없고 의도한대로 잘 동작할 것이라고 예상한다면 @SuppressWarnings("unchecked")를 달아주자.
  • 해당 애너테이션을 붙이게 되면 경고를 숨길 수 있다.
  • 그러나 타입 안전성의 확보 없이 해당 애너테이션을 붙인다고 해서 컴파일시에 문제 없이 돌아가던 것이 런타임시에도 그렇다고는 보장할 수 없다.

1. @SuppressWarnings("unchecked")를 사용할거라면?

1-1. 모든 선언에도 사용 가능하지만, 가능한 좁은 범위에서 사용하자

  • 모든 범위에서 사용이 가능하지만 사용할거라면 생성자, 짧은 메서드 등에서만 사용하는 것을 권장한다.
  • 넓은 범위가 될거 같다면 지역 변수를 선언해서 해당 지역 변수에 애너테이션을 붙여 사용할 수 있게 하자.
  • 위의 말은 다시해서 클래스 전체에서 해당 애너테이션을 붙이게 되면 심각한 문제가 런타임시에 발생할 수 있다는 사실이다.

[경고를 무시해도 되는 이유]

  • 해당 @SuppressWarnings("unchecked")를 사용해서 경고를 무시한다면 해당 경고를 무시해도 안전한 이유를 항상 주석으로 남겨두어야 한다.
  • 이는 다른 사람이 코드를 이애하는데 도움이 되는 뿐만 아니라 다른 사람이 해당 코드를 수정했을 상황에 타입 안전성을 잃는 상황을 줄여주기 때문이다.
profile
즐겁고 괴로운 개발😎

0개의 댓글