[스터디할래 12] 애노테이션
이 글은 ‘백기선’ 개발자님과 함께하는 온라인 자바 스터디에 참여하여 준비/학습한 내용을 정리하는 글입니다.📚
- 12주차 : https://github.com/whiteship/live-study/issues/12
- 목표 : 자바의 애노테이션에 대해 학습하세요.
정리는 Java Tutorials - Annotation를 기반으로 하였습니다.
애노테이션
- 메타데이터의 형태. 프로그램을 실행하는 데에는 영향이 없지만, 프로그램에 대한 정보를 제공해주는 데에 사용됨.
- 사용목적은
- 컴파일러에게 정보 제공 : 컴파일러가 에러를 감지하거나, suppress warning 하도록 함.
- 컴파일/디플로이 시점 가공 : 컴파일러가 애노테이션을 통해 코드를 생성할 수 있도록 함.
- 런타임 가공 : 런타임 시점에 시행될 수도 있다.
애노테이션 사용하는 방법
@
문자로 컴파일러에게 애노테이션임을 알린다.- 애노테이션은 elements를 포함할 수 있다. 예)
@SuppressWarnings(value = "unchecked")
- 여러 애노테이션을 동일한 선언에 같이 사용할 수 있다.
- 같은 타입의 애노테이션을 사용할 수도 있다.(Repeating Annotation)
- 단, repeating annotation을 사용하려면 애노태에션에
@Repeatable
이 명시되어 있어야 한다.// RepeatingAnnotation을 통해 조건 두 개를 입력할 수 있다. @Schedule(dayOfMonth="last") @Schedule(dayOfWeek="Fri", hour="23") public void doPeriodicCleanup() { ... }
- 단, repeating annotation을 사용하려면 애노태에션에
애노테이션 정의하는 방법
- 애노테이션도 타입이다. 아래 코드와 같이 정의한다.
@
는 AnnotationType(AT)를 의미한다.@
뒤에는 interface키워드를 붙인다.- 즉, 애노테이션 타입은 인터페이스 형식의 일종이다.
@interface ClassPreamble { String author(); String date(); int currentRevision() default 1; String lastModified() default "N/A"; String lastModifiedBy() default "N/A"; // Note use of array String[] reviewers(); }
- 이렇게 정의한 뒤에, 애노테이션을 사용하는 곳에서는 아래와 같이 사용한다.
@ClassPreamble ( author = "John Doe", date = "3/17/2002", currentRevision = 6, lastModified = "4/12/2004", lastModifiedBy = "Jane Doe", reviewers = {"Alice", "Bob", "Cindy"} ) public class Generation3List extends Generation2List { // class code goes here }
(Codes from https://docs.oracle.com/javase/tutorial/java/annotations/declaring.html)
Predifined Anotations
Java API에서는 미리 정의한 애노테이션을 제공한다. 특히, 미리 정의되어 다른 애노테이션을 도와주는 meta-annotations이라 한다. meta-annotations들은 다른 annotation type 정의에 함께 사용된다.
@Retention
annotation type을 정의할 때 애노테이션 코드를 어떻게 보관할 것인가를 정의한다.
RetentionPolicy.SOURCE
: 애노테이션이 소스 레벨에서만 동작하고, 컴파일러는 무시한다.RetentionPolicy.CLASS
: 컴파일 시점까지 존재하지만, JVM은 무시한다. (default)RetentionPolicy.RUNTIME
: 컴파일 시점, JVM 동작 시점까지 유지되어 런타임 환경에서 사용된다.
@Target
정의한 annotion type이 어떤 때에 사용될 수 있는지 명시한다. @Target
을 따로 명시하지 않은 애노테이션은 type parameter 선언을 제외하고는 모든 곳에 사용될 수 있다. 컴파일 후 ElementType
enum으로 코드에 정의된다. 아래와 같은 타입으로 정의할 수 있다.
ElementType.ANNOTATION_TYPE
ElementType.CONSTRUCTOR
ElementType.FIELD
ElementType.LOCAL_VARIABLE
ElementType.METHOD
ElementType.PACKAGE
ElementType.PARAMETER
ElementType.TYPE
@Documented
Annotation type이 javadoc이나 다른 툴에 의해 문서화할 것인지를 표시한다. 클라이언트에게 애노테이션을 노출하는 public API의 경우에 문서화를 명시하는 것이 바람직하다.
애노테이션 프로세서
(애노테이션 프로세서는 자바 문서보다 개발자 블로그가 더 이해하기에 편하여 https://medium.com/@jason_kim/annotation-processing-101-%EB%B2%88%EC%97%AD-be333c7b913를 참고하였다.)
- 애노테이션 프로세싱은 컴파일 시점에 애노테이션을 스캔해서 적절히 코드를 생성해주는 javac의 빌드 툴이다. 이 프로세싱을 할 때에 특정 어노테이션들을 처리하는 과정을 별도로 명시하는 프로세서를 만들어서 등록할 수 있다.
public interface Processor
를 구현한다.