JAVA/Effective Java

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

꾸준함. 2024. 2. 16. 10:39

비검사 경고 (unchecked warning)

비검사 경고란 컴파일러가 타입 안전성을 확인하는데 필요한 정보가 충분치 않을 때 발생시키는 경고입니다.

비검사 경고가 발생했다고 해서 컴파일이 안되거나 코드가 동작하는데 문제가 생기는 것은 아니지만 개선 포인트가 존재하기 때문에 비검사 경고가 발생하면 조치를 취하여 비검사 경고를 제거하는 것을 권장합니다.

아이템 26에서 다루었던 로 타입을 사용할 경우에도 비검사 경고가 발생하는데 경고 메시지를 읽어보면 제네릭 타입 사용을 권장하는 것을 확인할 수 있습니다.

 

로 타입을 사용할 때 발생하는 비검사 경고

 

@SuppressWarnings

만약 비검사 경고를 제거할 수 없을 경우 @SuppressWarnings("unchecked") 어노테이션을 달아 경고를 숨기는 것을 권장합니다.

인지하고 있는 경고고 안전하다고 판단된다면 해당 어노테이션을 사용하여 최대한 제거하는 것을 권장하고 이러한 행위는 컴파일러에 의해 생성된 경고 목록을 보다 유의미하게 확인할 수 있도록 도움이 됩니다.

warning 목록이 너무 많아질 경우, 개발자들이 인지하고 있는 경고인지 인지하지 못한 경고인지 분간하기 어렵기 때문에 경고를 모르고 지나칠 가능성이 커집니다.

추가적으로 @SuppressWarnings 어노테이션을 너무 넓은 범위에 선언하면 인지하지 못한 비검사 경고가 목록에 안 뜰 확률이 높아지므로 항상 가능한 한 좁은 범위에 적용하는 것을 권장합니다.

ArrayList의 toArray 메서드를 예시로 들자면 @SuppressWarnings 어노테이션을 if 문 내 선언하지 않고 메서드 상단에 선언할 경우 해당 메서드에서 발생하는 또 다른 비검사 경고를 모르고 지나칠 가능성이 생깁니다.

 

Collection 라이브러리 (메서드 상단에 @SuppressWarnings)

 

 

Best Practice (if문 내 @SuppressWarnings)

 

 

마지막으로 @SuppressWarnings 어노테이션을 사용할 때 해당 경고를 무시해도 안전한 이유를 항상 주석으로 남기는 것을 권장합니다.협업 시 다른 사람이 코드를 이해하는데 도움이 되며 더 중요하게는 다른 사람이 해당 코드를 잘 못 수정하여 타입 안전성을 잃는 상황을 줄여주기 때문입니다.

 

비고

Checked, Unchecked Exception과는 별개의 개념입니다.

 

참고

이펙티브 자바
이펙티브 자바 완벽 공략 2부 - 백기선 강사님

반응형