Notice
Recent Posts
Recent Comments
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

충분히 쌓여가는

메타 애너테이션 본문

Java/JAVA3

메타 애너테이션

빌드이너프 2023. 8. 1. 09:26

메타 애너테이션

애너테이션을 위한 애너테이션

java.lang.annotation 패키지에 포함

애너테이션 설명
@Target 애너테이션이 적용가능한 대상을 지정하는데 사용한다
@Documented 애너테이션 정보가 javadoc으로 작성된 문서에 포함되게 한다
@Inherited 애너테이션이 자손 클래스에 상속되도록 한다
@Retention 애너테이션이 유지되는 범위를 지정하는데 사용한다
@Repeatable 애너테이션을 반복해서 적용할 수 있게 한다

 

@Target

애너테이션을 정의할 때, 적용대상 지정에 사용

@Target ({ TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE } )
@Retention(RetentionPolicy.SOURCE)
public @Interface SuppressWarnings {
    String[] value();
}
대상 타입 의미
ANOOTATION_TYPE 애너테이션
CONSTRUCTOR 생성자
FIELD 필드(멤버변수, enum 상수)
LOCAL_VARIABLE 지역변수
METHOD 메서드
PACKAGE 패키지
PARAMETER 매개변수
TYPE 타입(클래스, 인터페이스, enum)
TYPE_PARAMETER 타입 매개변수
TYPE_USE 타입이 사용되는 모든 곳

 

코드

import static java.lang.annotation.ElementType.*;

@Target({FIELD, TYPE, TYPE_USE}) // 적용대상이 FIELD, TYPE, TYPE_USE
public @interface MyAnnotation { } // MyAnnotation을 정의

@MyAnnotation // 적용대상이 TYPE인 경우
class MyClass {
    @MyAnnotation // 적용대상이 FIELD인 경우
    int i;
    
    @MyAnnotation // 적용대상이 TYPE_USE인 경우
    MyClass mc;
}

 

 

@Retention

애너테이션이 유지(retention)되는 기간을 지정하는데 사용

유지 정책 의미
SOURCE 소스 파일에만 존재, 클래스 파일에는 존재하지 않음
CLASS 클래스 파일에 존재, 실행 시에 사용불가, 기본값
RUNTIME 클래스 파일에 존재, 실행 시에 사용가능

 

컴파일러에 의해 사용되는 애너테이션의 유지 정책은 SOURCE

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {}

 

실행 시에 사용 가능한 애너테이션의 정책은 RUNTIME

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface FunctionalInterface {}

 

 

@Documented

javadoc으로 작성한 문서에 포함시키려면 @Documented를 붙인다

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface FunctionalInterface {}

 

 

@Inherited

애너테이션을 자손 클래스에 상속하고자 할 때, @Inherited를 붙인다

@Inherited  // @SuperAnno가 자손까지 영향 미치게
@interface SuperAnno {}

@SuperAnno
class Parent{}

class Child extends Parent {} // Child에 애너테이션이 붙은 것으로 인식

 

 

@Repeatable

반복해서 붙일 수 있는 애터네이션을 정의할 때 사용

@Repeatable(ToDos.class) // ToDo 애너테이션을 여러 번 반복해서 쓸 수 있게 한다
@interface ToDo {
    String value();
}

 

@Repeatable이 붙은 애너테이션은 반복해서 붙일 수 있다

@ToDo("delete test codes.")
@ToDo("override inherited methods")
class MyClass {
    ...
}

 

@Repeatable인 @ToDo를 하나로 묶을 컨테이너 애너테이션도 정의해야 함

@interface ToDos { // 여러 개의 ToDo 애너테이션을 담을 컨테이너 애너테이션 ToDos
    ToDo[] value(); // ToDo 애너테이션 배열타입의 요소를 선언, 이름이 반드시 value이어야 함
}

 

'Java > JAVA3' 카테고리의 다른 글

thread 쓰레드  (0) 2023.08.02
애너테이션 타입 정의하기, 애너테이션의 요소  (0) 2023.08.01
Annotation(애너테이션) @  (0) 2023.07.31
열거형에 멤버 추가하기  (0) 2023.07.31
열거형(enum)  (0) 2023.07.30