메타 애너테이션(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 어노테이션 여러 번 사용하기!
}
'Java' 카테고리의 다른 글
| Thread 생성 및 실행 (1) | 2023.03.10 |
|---|---|
| 익명 클래스...? 익명 객체...? (0) | 2023.03.09 |
| [Collection FrameWork] ArrayList, LinkedList (0) | 2023.03.08 |
| [Collection FrameWork] Collection, List, Iterator (Methods) (0) | 2023.03.07 |
| [Collection Framework] Map<K, V> (0) | 2023.03.06 |
블로그의 정보
Mignon'S Dev Log
mignon25