[JAVA] Annotation

Annotation 정의하는 방법

Annotaion을 적용할 때는 Annotation이 어디에 적용되며 언제까지 Annotaion 소스가 유지될 것인지를 설정하여야 한다.

아래와 같이 Annotation을 정의한다.

@Target({ElementType.[적용대상]})
@Retention(RetentionPolicy.[정보유지되는 대상])
public @interface [어노테이션명]{
	public 타입 elementName() [default 값]
    ...
}

@Retention

@Retention에는 어노테이션 값들을 언제까지 유지할 것인지 값을 입력하는데 각 값이 가지는의미는 다음 표와 같다. 보통 어노테이션은 Runtime시에 많이 사용하므로 대부분의 어노테이션의 Retention값은 RUNTIME으로 되어있다.

RetentionPolicy 열거 상수 설명
SOURCE 소스 상에서만 어노테이션 정보를 유지한다. 소스 코드를 분석할 때만 의미 있으며, 바이트 코드 파일에는 정보가 남지 않는다.
CLASS 바이트 코드 파일까지 어노테이션 정보를 유지한다. 하지만 리플렉션을 이용해 어노테이션 정보를 얻을 수는 없다.
RUNTIME 바이트 코드 파일까지 어노테이션 정보를 유지하면서 리플렉션을 이용해 런타임에 어노테이션 정보를 얻을 수 있다.

@target

@Target에는 어떠한 값(ex. 클래스, 필드, 메소드 등)에 Annotaion을 적용할 것인지 나타낼 수 있는데 넣을 수 있는 값은 다음 표와 같다.

ElementType 열거 상수 적용대상
TYPE 클래스, 인터페이스, 열거 타입
ANNOTATION_TYPE 어노테이션
FIELD 필드
CONSTRUCTOR 생성자
METHOD 메소드
LOCAL_VARIABLE 로컬 변수
PACKAGE 패키지

@documented

@Documented 어노테이션이 지정된 대상의 JavaDoc에 이 어노테이션의 존재를 표기하도록 지정

java.lang.annotation.Documented
@Documented
public @interface MyAnnotation { 

}

@MyAnnotation 
public class MySuperClass { ... }

Annotation 프로세서

롬복이란?

@Getter, @Setter, @Builder 등의 애노테이션과 애토네이션 프로세서를 제공하여 표준적으로 사용하는 라이브러리

반복적이고 공통적인 코드 작성을 애노테이션을 통해 자동화해주는 라이브러리고도 할 수 있음

Annotation 프로세서란?

컴파일 시점에 끼어들어 특정한 애노테이션이 붙어있는 소스코드를 참조해서 새로운 소스 코드를 만들어 낼 수 있는 기능.

이때 생성되는 소스 코드는 자바일 수도 있고 다른 어떤 코드일 수도 있다.

Annotation 프로세서 사용 예시

  • 롬복(Lombok)
  • AutoService : java.util.ServiceLoader 용 파일 생성 유틸리티
  • @Override
  • Dagger2: 컴파일 타임 DI 제공
  • 안드로이드 라이브러리
    • ButterKinfe: @BindView(뷰 아이디와 애노테이션 붙인 빌드 바인딩)
    • DeepLinkDispatch: 특정 URI 링크를 Activity로 연결할 때 사용

Annotation 프로세서 장점

- 런타임 비용이 제로

Annotation 프로세서 단점

- 기존 클래스 코드를 변경할 때는 약간의 hack이 필요하다(ex: Lombok)

 

ref {

  https://honeyinfo7.tistory.com/56

  https://hamait.tistory.com/314

  https://catsbi.oopy.io/78cee801-bb9c-44af-ad1f-dffc5a541101

}

'Programming > Java' 카테고리의 다른 글

[JAVA] 제네릭  (0) 2022.04.11
[JAVA] I/O  (0) 2022.04.05
[JAVA] ENUM  (0) 2022.03.21
[JAVA]멀티쓰레드 프로그래밍  (0) 2022.03.14
[JAVA] 예외 처리  (0) 2022.03.04

댓글