Java : 사용자 정의 어노테이션 만들기

     


    어노테이션 만들기

    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    public @interface Retry {
        int maxRetryCount() default 3;
        int maxAbc() default 10;
    }
    1. @interface로 어노테이션 클래스를 선언한다
    2. @Retention을 통해 어느 시점에 적용할지를 설정한다.
    3. @Target을 통해 어떤 곳에 적용할지를 설정한다. (클래스, 메서드, 변수 등등)
    4. 어노테이션은 내부적으로 값을 가질 수 있고, 여기에 값을 주면 옵션으로 값을 설정할 수 있다. 
      • 타입 + 이름 + () + default형태로 선언한다

     

    어노테이션 사용하기

    @Retry(maxRetryCount = 10, maxAbc = 111)
    public String save(String itemId) {
        seq ++;
        if (seq % 2 == 0) {
            throw new IllegalStateException("예외 발생");
        }
        return "ok";
    }
    • 다음과 같이 만든 어노테이션을 적용할 수 있다.
    • 어노테이션 내부에 설정했던 값은 옵션 값을 넣을 때 사용할 수 있게 된다. 

     


    메타 어노테이션

    어노테이션을 정의할 때, 이 어노테이션이 어떤 어노테이션이 알려줘야한다. 메타 어노테이션은 여러가지가 있지만 주로 사용하는 것은 @Retention과 @Target이다.

     

    @Retenetion

    @Retetion 어노테이션은 이 어노테이션이 사용되는 시점을 설정한다. 실제 동작 시점은 다음과 같다.

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

    SOURCE는 거의 사용하지 않는다. CLASS는 클래스에 어노테이션 정보를 포함한다. 그렇지만 클래스 파일이 JVM에 로딩될 때 어노테이션 정보가 무시 된다. 따라서 실행 시점에 어노테이션의 정보를 얻지 못하기 때문에 거의 사용되지 않는다. RUNTIME은 실행 시에 리플렉션을 통해 클래스에 저장된 어노테이션 정보를 처리할 수 있게 도와준다. 따라서 @Retetion 전략은 대부분 RUNTIME을 사용한다. 

     

    @Target

    @Target 어노테이션은 이 어노테이션이 적용가능한 대상을 지정하는데 사용된다. 아래에 어떤 어노테이션이 어디에 적용될 수 있는지를 표로 정리했다. 

    대상 타입 의미
    ANNOTATION_TYPE 어노테이션 지정
    CONSTRUCTOR 생성자 지정
    FIELD 필드 지정(멤버 변수, enum 상수) → 로컬변수 X
    LOCAL_VARIABLE 지역변수
    METHOD 메서드
    PACKAGE 패키지
    PARAMETER 매개변수
    TYPE 타입(클래스, 인터페이스, ENUM)
    TYPE_PARAMETER 타입 매개변수
    TYPE_USE 타입이 사용되는 모든 곳

    TYPE과 TYPE_USE의 차이는 아래에서 확인할 수 있다. 

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

     

    '프로그래밍 언어 > JAVA' 카테고리의 다른 글

    Java Stream과 Stream 활용한 예시  (0) 2022.02.25
    멀티 쓰레드 관련 공부  (0) 2022.02.25
    람다식  (0) 2022.02.24
    참조 변수, 메모리 간단 정리  (0) 2021.11.09
    Java 예외처리  (0) 2021.10.25

    댓글

    Designed by JB FACTORY