반응형

목표

자바의 애노테이션에 대해 학습하세요.

 

학습할 것

  • 애노테이션 정의하는 방법
  • @Retention
  • @Target
  • @documented
  • 애노테이션 프로세서

Annotation이란?

애노테이션은 주석이라는 뜻을 가지고 있다.

보통 주석은 코드를 보는 사람에게 정보를 제공해 주기 위해서 사용한다. 하지만 오늘 정리할 Annotation은 성격이 다르다. 사람에게 정보를 주는 용도로 사용하지만 컴파일러를 위해서 작성하는 주석이기도 하다.

Annotation은 빌드 시 코드를 생성한다거나 런타임 시 참고해서 특정 동착을 하도록 할 때 사용한다.

 

Annotation 특징

  • java 5부터 추가된 기능이다.
  • 클래스, 메소드, 변수등에 붙여서 사용된다.
  • 애노테이션은 interface앞에 @기호를 붙여서 생성할 수 있다.
  • 메타데이터라고 불린다.
  • 부가적인 표현뿐만 아니라 리플렉션(reflection)을 이용하여 원하는 클래스를 주입이 가능하다.

기본 제공되는 Annotation (built-in Annotation)

  • @Override - 메소드가 오버라이드 됐는지 검증한다. 만약 부모 클래스 또는 구현해야할 인터페이스에서 해당 메소드를 찾을 수 없다면 컴파일 오류가 발생
  • @Deprecated - 메소드를 사용하지 말도록 유도한다. 만약 사용한다면 컴파일 경고 발생
  • @SuppressWarnings - 컴파일 경고를 무시하도록 한다.
  • @SafeVarargs - 제너릭 같은 가변인자 매개변수를 사용할 때 경고를 무시한다.
  • @FunctionalInterface - 람다 함수등을 위한 인터페이스를 지정한다. 메소드가 없거나 두개 이상 되면 컴파일 오류발생

Annotation 정의하는 방법

 

@Retention

Retention은 해당 애노테이션이 언제까지 유효한지를 정해줄 수 있는 옵션이다.

SOURCE, CLASS, RUNTIME 세가지 한다.

 

SOURCE

SOURCE는 compiler에 의해서 사라지는 애노테이션이다.

 

CLASS

CLASS는 compiler에 의해 class 파일에 저장은 되지만,  jvm에 의해 실행시에는 유지될 필요 없는 경우 사용한다.

즉, RUNTIME시에는 존재하지 않는다. (리플렉션을 이용해서 Annotation 정보를 가져올 수 없다.)

RUNTIME

jvm에 의해 class 파일이 실행될 시점인 RUNTIME에도 주석이 유효하도록 한다. (리플렉션을 이용해서 Annotation 정보를 가져올 수 있다.)

 

아래와 같이 SOURCE 일 때는 바이트 코드에서 해당 Annotation이 사라지지만 RUNTIME에서는 Annotation을 확인할 수 있다.



 

@Target

애노테이션이 부여될 위치를 지정할 수 있는 애노테이션이다.

MyAnnotation에 Target을 메소드로 만들어보았다.

위치를 메소드 범위로 주었기 때문에 Field에서는 사용할 수 없다고 경고 메시지를 보여주고 있다.

 

 

 

 

그 외 다양한 범위를 지정할 수 있다.

타입 대상
TYPE 클래스, 인터페이스, enum 선언시
CONTRUCTOR 생성자 선언시
PACKAGE 패키지 선언시
METHOD 메소드 선언시
FIELD 필드 선언시
LOCAL_VARIABLE 지역 변수 선언시
PARAMETER 매개 변수 선언시

 

@documented

문서에도 애노테이션 정보가 표현된다. javadoc 과 같이 도구에 의해 내가 작성한 내용이 문서화 될 수 있도록 한다.

 

intellij에서 javadoc 만드는 방법은 간단하다.

 

1. Tools 탭에서 Generate JavaDoc 클릭

 

 

2.

Locale : ko_KR

Other Command line arguments : -encoding UTF-8 -charset UTF-8 -docencoding UTF-8

작성 후 ok 클릭하면 JavaDoc이 생성된다.

 

 

@Documented 애노테이션을 안붙인 JavaDoc과 붙인 JavaDoc을 비교해보겠다.

 

@Documented 애노테이션 안붙인 JavaDoc

 

@Documented 애노테이션 붙인 JavaDoc

 

Annotation 프로세서

자바의 Annotation 프로세서는 컴파일 타임에 애노테이션 정보를 참고하여 코드를 분석하고 생성하는 등의 작업을 할 수 있는 기능이다. 대표적으로 롬복(lomboc) 라이브러리가 있다.

 

롬복(lomboc) 라이브러리를 사용해보겠다.

MyLombok.java 파일

 

컴파일 된 MyLombok.class 파일

 

 

ServiceLoader

인터페이스만 제공하고 해당 구현제는 모르지만 구현제를 지정하지 않고 Jar 파일만 바꿔끼면 동작하도록 만들 수 있다.

 

 

728x90
반응형

+ Recent posts