노션으로 다시 돌아갔습니다 😅

메타 애너테이션(meta-annotation)

by mignon25

메타 애너테이션(meta-annotation)이란?

애너테이션을 정의하는 데에 사용되는 애너테이션.
애너테이션의 적용대상 및 유지 기간을 지정하는 데에 사용된다. 

 

 

@Target

애너테이션을 적용할 "대상"을 지정하는 데 사용

< java.lang.annotation.ElementType 이라는 열거형에 정의되어 있는 지정 가능한 대상 타입들 >

대상 타입 적용 범위
ANNOTATION_TYPE 애너테이션
CONSTRUCTOR 생성자
FIELD 필드(멤버변수, 열거형 상수)
LOCAL_VARIABLE 지역변수
METHOD 메서드
PACKAGE 패키지
PARAMETER 매개변수
TYPE 타입(클래스, 인터페이스, 열거형)
TYPE_PARAMETER 타입 매개변수
TYPE_USE 타입이 사용되는 모든 대상

 

Example.

import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.*;
// import 문을 이용하여 ElementType.TYPE 대신 TYPE 과 같이 간단히 작성할 수 있다.

@Target({FIELD, TYPE, TYPE_USE}) // 적용 대상이 FIELD, TYPE
public @interface MignonAnotation { } // 커스텀 어노테이션 @MignonAnotation 정의

@MignonAnotation // 적용 대상이 TYPE 인 경우
public class MetaAnnotationTest {
    
    @MignonAnotation  // 적용 대상이 FIELD 인 경우
    String mignonAnnotation = "미뇽이어노테이션";
}

 

 

@Documented

애너테이션에 대한 정보가 javadoc으로 작성한 문서에 포함되도록 하는 애너테이션 설정

자바에서 제공하는 표준 애너테이션과 메타 애너테이션 중 @Override@SuppressWarnings 를 제외하고는 모두 @Documented 가 적용되어 있다. 

 

 

 

@Inherited

하위 클래스가 애너테이션을 상속받도록 한다. 
  • @Inherited 애너테이션을 상위 클래스에 붙이면, 하위 클래스도 상위클래스에 붙은 애너테이션들이 동일하게 적용된다. 
  • @Inherited 애너테이션을 애너테이션 정의할 때 적용하면 해당 애너테이션에 대해서만 적용된다. 
@Inherited  // @MyAnnotation 이 하위 클래스까지 적용
@Target({TYPE, TYPE_USE})
public @interface MyAnnotation { } 

@MyAnnotation
class Parent {}

class Child extends Parent {} 
// @MyAnnotation 이 붙은 것으로 인식, MyAnnotation 에 정의된 내용 적용

 

 

@Retention

특정 애너테이션의 지속 시간을 결정하는 데 사용

= 애너테이션 유지 정책(retention policy) =

유지 정책 설명
SOURCE 소스 파일에 존재, 클래스 파일에는 존재하지 않음
CLASS 클래스 파일에 존재, 실행시 사용 불가, 기본값
RUNTIME 클래스 파일에 존재, 실행시 사용 가능
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
// 오버라이딩이 제대로 되었는지 컴파일러가 확인하는 용도
// 클래스 파일에 남길 킬요 없이 컴파일시에만 확인하고 사라짐
public @interface Override() { }

 

 

@Repeatable

애너테이션을 여러 번 붙일 수 있도록 허용한다는 의미
public @interface Works { // 컨테이너 어노테이션 필요!
    Work[] value();
}

@Repeatable(Works.class)  // @Repeatable 사용 + 컨테이너 어노테이션 지정
public @interface Work {
    String value();
}

@Work("코딩하기")
@Work("연습하기")
@Work("블로깅하기")
@Work("또 연습하기")
public class RepeatableTest { // @Work 어노테이션 여러 번 사용하기!
}

 

블로그의 정보

Mignon'S Dev Log

mignon25

활동하기