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 |
댓글