어노테이션은 우리가 종종 헷갈리지 않게 적어두는 것과 같이 주석이라는 의미를 가진다.
자바에서 어노테이션은 코드 사이에 주석처럼 쓰여 특별한 의미, 기능을 갖도록 하는 기술이다.
결과적으로 프로그램에 추가적인 정보를 제공해주는 메타데이터로 볼 수 있다.
package org.example;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Annotation {
String value() default "-";
int num() default 3;
}
어노테이션은 위처럼 사용할 수 있으며, 위에 적어둔 것처럼 사용하는 위치, 목적, 특징 등 사용 이유에 따른 많은 어노테이션이 존재한다.
@Target은 인터페이스에서 사용할 수 있으며, 어떠한 값에 어노테이션을 적용할 것인지 결정한다.
@Retention 에서는 @Target 에서 정한 값을 언제까지 유지할 것인지를 결정한다.
보통은 런타임 시에 많이 사용하여 RetentionPolicy.RUNTIME을 자주 사용한다고 한다.
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Annotation {
String value() default "아아아 집가고싶다 ~ ";
int num() default 3;
}
public class UseAnnotation {
@Annotation
public void print() {
System.out.println("UseAnnotation.print");
}
@Annotation
public void print2() {
System.out.println("UseAnnotation.print2");
}
}
public class TestMain {
public static void main(String[] args) {
Method[] method = UseAnnotation.class.getMethods();
for (Method m : method) {
if (m.isAnnotationPresent(Annotation.class)) {
System.out.println(m.getName());
Annotation annotation = m.getDeclaredAnnotation(Annotation.class);
String value = annotation.value();
int num = annotation.num();
System.out.print("value = " + value);
System.out.println("num = " + num);
}
}
}
}

@Documented는 메타데이터 어노테이션으로, 이 어노테이션을 사용하는 클래스가 java doc 과 같은 문서화 될 때 해당 어노테이션이 적용되었음을 명시하도록 한다.
어노테이션 프로세서는 컴파일 시점에 끼어들어 특정한 어노테이션이 붙어있는 소스코드를 참조해서 새로운 코드를 만들 수 있는 기능으로, @Override & Lombok이 그 예제가 될 수 있다.
Annotation Paser classes는 컴파일 시에 필요로하며, 빌드 종료시 끝나게 된다.