ABOUT ME

코딩 복습하고 공부하는 기록

Today
Yesterday
Total
  • 메타 애너테이션
    공부/Java 2024. 5. 2. 11:35

    메타 애너테이션

     

    - 메타 애너테이션은 '애너테이션을 위한 애너테이션'이다.

    - 애너테이션을 만들 때 사용한다.

    - 메타 애너테이션은 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
Designed by Tistory.