개발 무지렁이

[Java] 어노테이션과 어노테이션 적용대상 및 유지정책 본문

Backend/자바

[Java] 어노테이션과 어노테이션 적용대상 및 유지정책

Gaejirang-e 2023. 8. 12. 00:50

𐂂 어노테이션이란
클래스 OR 인터페이스컴파일하거나 실행할 때,
어떻게 처리하는지 알려주는 설정정보이다.

(1) 컴파일 시, 사용하는 정보 전달
(2) 코드를 자동으로 생성 시, 사용하는 정보 전달
(3) 특정 기능 처리 시, 사용하는 정보 전달

🦔 어노테이션의 기본 속성 value
🤡 @SampleAnnotation(value = "값");
: 어노테이션에 써준 값은 자동으로 value 속성에 대입된다.
  public @interface SampleAnnotation {
      String value();
  }
𖠃 어노테이션 적용대상
적용대상의 종류는 ElementType 열거 상수로 정의되어 있다.

@Target(value = {ElementType.TYPE, ElementType.FIELD, ElementType.Method}): 적용대상을 지정

📕 참고 자료 📕
Tistory's Card

𖠃 어노테이션 유지정책
유지정책의 종류는 RetentionPolicy 열거 상수로 정의되어 있다.

@Retention(RetentionPolicy.RUNTIME)

CLASS: 메모리 로딩할 때 유지
SOURCE: 컴파일할 때 유지
RUNTIME: 실행할 때 유지

📜. PrintAnnotation.java

  @Target(ElementType.METHOD) //적용대상 설정
  @Retention(RetentionPolicy.RUNTIME) //유지정책 설정
  public @interface PrintAnnotation {
      String value() default "-";
      int number() default 15;
  }

📜. SampleService.java

  public class SampleService {
      @PrintAnnotation
      public void method1() {
          System.out.println("실행 내용1");
      }

      @PrintAnnotation("*")
      public void method2() {
          System.out.println("실행 내용2");
      }

      @PrintAnnotation(value="#", number=20)
      public void method3() {
          System.out.println("실행 내용3");
      }
  }

📜. PrintAnnotationExample.java

  public class PrintAnnotationExample {
      public static void main(String[] args) {
      Method[] declaredMethods = SampleService.class.getDeclaredMethods();
      for(Method method : declaredMethods) {
          PrintAnnotation printAnnotation = method.getAnnotation(PrintAnnotation.class);
          printLine(printAnnotation);
          method.invoke(new SampleService); //메서드 호출
          printLine(printAnnotation);
      }
      }

      public static void printLine(PrintAnnotation printAnnotation) {
          if(printAnnotation != null) {
              int number = printAnnotation.number();
              for(int i = 0; i < number; i++) {
                String value = printAnnotation.value();
                System.out.print(value);
            }
            System.out.println();                           
          }
      }
  }
  • method.isAnnotationPresent(PrintAnnotation.class)
    • : 지정한 어노테이션이 적용되었는지 여부 리턴(boolean)
  • method.getAnnotation(PrintAnnotation.class)
    • : 어노테이션이 적용되어 있으면 어노테이션 리턴(Annotation), 안되어 있으면 null 리턴
  • method.getDeclaredAnnotations()
    • : 적용된 모든 어노테이션을 리턴(Annotation[])
  • method.invoke(new SampleService)
Comments