꾸준한 스터디
article thumbnail
  • 비검사(unchecked) 경고란?
    • 컴파일러가 타입 안정성을 확인하는데 필요한 정보가 충분치 않을 때 발생시키는 경고
  • 할 수 있는 한 모든 비검사 경고를 제거하라.
  • 경고를 제거할 수 없지만 안전하다고 확신한다면 @SuppressWarnings("unchecked") 애노테이션을 달아 경고를 숨기자.
  • @SuppressWarnings 애노테이션은 항상 가능한 한 좁은 범위에 적용하자.
  • @SuppressWarnings("unchecked") 애노테이션을 사용할 때면 그 경고를 무시해도 안전한 이유를 항상 주석으로 남겨야 한다.

IDE 툴을 쓰다보면 빨간색으로 경고가 표시되면 컴파일 자체가 안되는 코드를 알려주고 노란색 경고가 표시되면 컴파일과 실행은 되지만 리턴받는 타입이 명확하지 않을 때나 deprecated 될 메서드 등등의 경고 메세지를 알려주는 것을 비검사 경고라고 한다. 가능한한 이러한 비검사 경고들이 있으면 어딘가 적절치 못한 코드일 수 있으니 잘 살펴보고 올바른 코드로 수정해주는 것이 좋다.

 

할 수 있는 한 비검사 경고를 제거를 해준다.

 

타입 안정성을 보장할 수 는 없지만 실질적으로 타입이 안전하면 @SuppressWarnings("unchecked") 애노테이션을 사용해서 컴파일러에게 안전한 코드임을 알려주면 비 검사 경고 알림이 사라진다.

개발자가 인지하고 있는 비검사 경고라면 @SuppressWarning 애노테이션 달아놓으면 해당 비검사 에러를 제외한 나머지 비검사 코드를 신경 쓸 수 있고 다른 개발자가 봤을 때도 명시적으로 체킹이 된 부분이란 것을 알 수 있다.

 

@SuppressWarning 애노테이션의 범위는 리턴문에 붙일 수 없기 때문에 메서드 실행 결과를 변수에 담고 해당 변수 위에 선언해준다. 메서드 단위에도 애노테이션을 붙일 수 있지만 그렇게 되면 해당 메서드 전체의 비검사 경고를 제거하게 되니 가능한 좁은 범위에 선언해준다. 그리고 애노테이션을 붙인 이유를 주석에 상세히 남겨 다른 사람들이 알아볼 수 있게 처리하는 것이 좋다.

 

 

애노테이션

자바 애노테이션을 정의하는 방법

  • @Retention : 애노테이션의 정보를 얼마나 유지할 것인가
    • Runtime, Source, Class
  • @Target : 애노테이션을 사용할 수 있는 위치
    • Type, Field, Method, Parameter ...
  • @Documented : javadoc에 해당 애노테이션을 표기할지에 대한 여부를 지정

 

@Documented : 이 애노테이션을 붙이면 자바 doc 으로 API 문서를 만들 때 해당 애노테이션에 대한 설명도 자바 doc에 포함하도록 지정해 주는 것이다.

 

@Retention : 애노테이션의 라이프 사이클 즉, 애노테이션이 언제까지 살아남아 있는지를 정하는 것으로 총 3가지가 있는데

  1. RetentionPolicy.RUNTIME : 대부분의 유지정책으로 컴파일 이후 .class 파일을 런타임시 클래스로더가 읽어들여 메모리에 올라간 상태로 어플리케이션이 중지되지 않으면 애노테이션 정보를 사용할 수 있다. 즉, Reflection API를 사용하여 애노테이션 정보를 알 수 있다. @Controller, @Service, @Autowired 등 스프링을 실행하고 올라오는 중에 컴포넌트 스캔이 가능해야하기 때문에 필요한 유지 정책이다.
  2. RetentionPolicy.CLASS : 자바 컴파일시 해당 애노테이션이 적힌 클래스 파일까지 사용할 수 있다. 런타임시 클래스 로더가 클래스를 읽어오면 애노테이션 정보는 사라진다. @NotNull 애노테이션의 경우에 RetentionPolicy.CLASS로 되어 있는데 @NotNull 애노테이션의 경우 null 값이 들어가면 비검사 경고를 알려주는 기능을 하는데 라이브러리 jar 파일에는 .java가 아닌 .class 파일이 들어가니 라이브러리 코드에도  Null값체크, 부가기능을 사용하기 위해 CLASS 단위 유지기능이 필요하다.
  3. RetentionPolicy.SOURCE : .java 소스 파일까지는 애노테이션이 남아있고 컴파일 되어 클래스 파일이 되면 애노테이션 정보는 사라진다. 롬복의 @Getter, @Setter 같은 경우가 RetentionPolicy.SOURCE로 되어 있다. 컴파일 시 해당 애노테이션은 실제 getter, setter 메소드가 만들고 @Getter, @Setter 애노테이션은 .class 파일에선 사라진다.

@Target : 애노테이션이 적용할 위치를 지정한다.

  1. ElementType.PACKAGE : 패키지
  2. ElementType.TYPE : 클래스, 인터페이스, ENUM
  3. ElementType.ANNOTATION_TYPE : 애노테이션
  4. ElementType.CONSTRUCTOR : 생성자
  5. ElementType.FIELD : 필드
  6. ElementType.LOCAL_VARIABLE : 지역 변수
  7. ElementType.METHOD : 메서드
  8. ElementType.PARAMETER : 전달인자
  9. ElementType.TYPE_PARAMETER :  전달인자 타입
  10. ElementType.TYPE_USE : 타입

 

@SuppressWarnings 애노테이션의 경우 소스레벨에만 유지하도록 설정되어 있다. 컴파일러가 비경고 검사를 알려주는 용도이니 .java 클래스에서 애노테이션이 사용되고 컴파일 이후 .class 파일이나 런타임시 사용하지 않는 애노테이션이다.

해당 애노테이션을 사용할 수 있는 곳으로 여러가지가 있지만 좁은 접근 범위인 LOCAL_VARIABLE도 선언되어 있어 지역 변수에서 선언할 수 있는 것이다.

 

 

 

 

https://jeong-pro.tistory.com/234

 

아무 관심 없던 @Retention 어노테이션 정리(RetentionPolicy SOURCE vs CLASS vs RUNTIME)

@Retention annotation 관심 갖게 된 이유 자바에서 지향하는 방법은 아니지만 필요에 의해서 커스텀 애노테이션(Annotation)을 만들어야 할 때가 있습니다. 보통 예제 샘플 코드를 보면 메타 애노테이션

jeong-pro.tistory.com

https://blog.naver.com/PostView.nhn?blogId=swoh1227&logNo=222229853664&redirect=Dlog&widgetTypeCall=true&directAccess=false 

 

온라인 자바 스터디#12- 어노테이션(@retention, @target, @documented, 어노테이션 프로세서)

유튜브를 통해 자바 스터디를 진행하는 프로그램이 있어 한번 정리해볼까 합니다. (아래는 해당 링크이니 ...

blog.naver.com

 

profile

꾸준한 스터디

@StudyRecord

포스팅이 유익하셨다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!