주석
이라는 뜻을 가지고 있다.💡 메타 데이터란?
애플리케이션이 처리해야할 데이터가 아니라 컴파일 과정과 실행 과정에서 코드를 어떻게 처리해야 하는지를 알려주기 위한 추가 정보
어노테이션은 다음 세 가지 용도로 사용된다.
@Override
@Deprecated
@SuppressWarnings
@SafeVarargs
@FunctionalInterface
커스텀 어노테이션을 만들 때 사용하는 메타 어노테이션이다.
@Retention
어노테이션의 보유 기간을 명명한다.
RetentionPolicy.Class | 바이트 코드 파일까지 어노테이션 정보 유지, 리플렉션을 이용해서 어노테이션 정보를 얻을 수 없다. |
---|---|
RetentionPolicy.Runtime | 바이트 코드 파일까지 어노테이션 정보를 유지, 리플렉션을 이용해 런타임에 어노테이션 정보를 가져올 수 있다. |
RetentionPolicy.Source | 컴파일 이후에는 삭제된다. |
@Documented
@Target
생성할 어노테이션이 적용될 수 있는 위치
ElementType.TYPE | 클래스, 인터페이스, 열거 타입 |
---|---|
ElementType.ANNOTATION_TYPE | 어노테이션 |
ElementType.FILED | 필드 |
ElementType.CONSTRUCTOR | 생성자 |
ElementType.METHOD | 메서드 |
ElementType.LOCAL_VARIABLE | 로컬 변수 |
ElementType.PACKAGE | 패키지 |
@Inherited
@Repeatable
커스텀 어노테이션을 생성하려면 @interface 어노테이션명
형태로 정의해야 한다.
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CustomAnnotation {
// 어노테이션 속성 정의
String value() default "기본값 지정";
}
타깃은 메서드로 설정하였고, 메서드를 선언하는 것처럼 어노테이션 속성을 정의할 수 있다.
public class CustomAnnotationRunner {
@CustomAnnotation(value = "커스텀 어노테이션 적용")
public static void testMethod1() {
System.out.println("CustomAnnotationRunner.testMethod1");
}
}
이렇게 만든 어노테이션은 리플렉션을 활용하여 특정 목적으로 사용할 수 있다.
public class ReflectionMain {
public static void main(String[] args) {
Method[] methods = CustomAnnotationRunner.class.getMethods();
for (Method method : methods) {
if(method.isAnnotationPresent(CustomAnnotation.class)){
CustomAnnotation annotation = method.getDeclaredAnnotation(CustomAnnotation.class);
System.out.println(annotation.value());
}
}
}
}
출력 결과
기본값 지정