-
메타 애너테이션
- 메타 애너테이션은 '애너테이션을 위한 애너테이션'이다.
- 애너테이션을 만들 때 사용한다.
- 메타 애너테이션은 java.lang.annotation 패키지에 포함된다.
애너테이션 설명 @Target 애너테이션이 적용가능한 대상을 지정하는데 사용한다. @Documented 애너테이션 정보가 javadoc으로 작성된 문서에 포함되게 한다. @Inherited 애너테이션이 저손 클래스에 상속되도록 한다. @Retention 애너테이션이 유지되는 범위를 지정하는데 사용한다. @Repeatable 애너테이션을 반복해서 적용할 수 있게 한다. (JDK1.8) @Target
- 애너테이션을 정의할 때, 적용대상 지정에 사용한다.
- 여러 개의 값을 지정할 때는 @Target({대상 타입, 대상 타입, ...}) 괄호 형태를 띈다.
- @Target으로 지정할 수 있는 애너테이션 적용대상의 종류는 아래와 같다.
대상 타입 의미 ANNOTATION_TYPE 애너테이션 CONSTRUCTOR 생성자 FIELD 필드(멤버변수, enum 상수) LOCAL_VARIABLE 지역변수 METHOD 메서드 PACKAGE 패키지 TYPE 타입 (클래스, 인터페이스, enum) TYPE_PARAMETER 타입 매개변수 (JDK1.8) TYPE_USE 타입이 사용되는 모든 곳 (JDK1.8) 사용 예제
@Target({FIELD, TYPE, TYPE_USE}) // 적용 대상 지정 public @interface MyAnnotation{} // MyAnnotation 정의 @MyAnnotation // 적용 대상이 TYPE class MyClass{ @MyAnnotation // 적용 대상이 FIELD int i; @MyAnnotation // 적용 대상이 TYPE_USE MyClass mc; }
위 예제는 @MyAnnotation을 정의한 것이다.
@Target으로 지정한 적용 대상에만 @MyAnnotation을 사용할 수 있다.
@Retention
- 애너테이션이 유지(retention) 되는 기간을 지정하는데 사용한다.
유지 정책 의미 SOURCE 소스 파일에만 존재하며, 컴파일 후 클래스 파일에는 존재하지 않는다. CLASS 클래스 파일에 존재하며, 실행 시 사용 불가능하다.
※ 기본값이며, 잘 사용되지 않는다.RUNTIME 클래스 파일에 존재하며, 실행 시 사용 가능하다. - 컴파일러에 의해 사용되는 애너테이션의 유지 정책은 SOURCE이다.
- 실행 시 사용 가능한 애너테이션의 정책은 RUNTIME이다.
@Documented @Retention(RetentionPolic.RUNTIME) @Target(ElementType.TYPE) public @interface FunctionalInterface{}
※ 클래스 파일에 존재하기 때문에, RUNTIME까지 존재한다.
@Documented
- javadoc으로 작성한 문서(*.html)에 포함시키려면 @Documented를 붙인다.
@Inherited
- 애너테이션을 자손 클래스에 상속하고자 할 때 붙인다.
@Inherited // SuperAnno가 자손까지 영향을 미치게 한다. @interface SuperAnno{} @SuperAnno class Parent{} class Child extends Perent{} // Child에도 애너테이션이 붙은 것으로 인식된다.
@Repeatable
- 반복해서 붙일 수 있는 애너테이션을 정의할 때 사용한다.
@Repeatable(ToDos.class) // ToDo애너테이션을 여러 번 반복해서 쓸 수 있게 한다. @interface ToDo { String value(); }
- @Repeatable이 붙은 애너테이션은 반복해서 붙일 수 있다.
@ToDo("delete test coded.") @ToDo("override inherited methods") class MyClass{ ... }
- @Repeatable인 애너테이션을 하나로 묶을 컨테이너 애너테이션도 정의해야 한다.
@interface ToDos { // 여러 개의 ToDo애너테이션을 담을 컨테이너 애너테이션 ToDos ToDo[] value(); // ToDo애너테이션 배열 타입의 요소를 선언. 이름은 value여야만 함 }
'공부 > Java' 카테고리의 다른 글
프로세스와 쓰레드 (0) 2024.05.04 애너테이션 타입 정의하기 (0) 2024.05.03 표준 애너테이션 (0) 2024.05.02 열거형에 멤버 추가하기 (0) 2024.04.30 열거형(enum) (0) 2024.04.29