ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 어노테이션
    언어/JAVA 2023. 7. 8. 23:13

     

    1. 어노테이션

     

    - 코드에서 @으로 작성되는 요소를 어노테이션이라고 한다. 

    - 어노테이션은 클래스 또는 인터페이스를 컴파일하거나 실행할 때 어떻게 처리해야 할 것인지를 알려주는 설정 정보이다.

    - 어노테이션의 컴파일 시 사용하는 정보 전달, 빌드 툴이 코드를 자동으로 생성할 때 사용하는 정보 전달, 실행 시 특정 기능을 처리할 때 사용하는 정보 전달.

     

     

    2. 표준 애너테이션

     

    자바에서 제공하는 기본 어노테이션이다. 

    출처: https://velog.io/@gkskaks1004/%EC%96%B4%EB%85%B8%ED%85%8C%EC%9D%B4%EC%85%98

     

     

    3. 메타 어노테이션

     

    어노테이션을 정의하기 위한 어노테이션이다.

     

    3.1 @Target : 어노테이션이 적용가능한 대상을 지정하는데 사용된다. 

                          - 적용범위는 기본속성 value로 ElementType 열거 상수 배열을 값으로 가짐 

                          

    Target 적용범위

    3.2 Retention : 어노테이션 유지되는 기간을 지정하는데 사용한다.

                             - 유지기간 값은 RetentionPolicy 열거 상수로 정의되어 있다.

                             - SOURCE : 컴파일시 적용, 소스파일에만 존재

                             - CLASS: 메모리로 로딩시 적용, 클래스 파일에 존재

                             -RUNTIME: runtime에서 적용,클래스 파일에 존재

     

    * 직접 컴파일러를 작성할 것이 아니면, SOURCE는 딱히 필요없음

       CLASS가 어노테이션 유지기간의 기본 값이지만 잘 사용안된다.

       RUNMTIME 리플렉션을 통해 클래스 파일에 저장된 애너테이션 정보를 읽어서 처리할 수 있다.

     

    - @Inherited : 어노테이션이 자손 클래스에 상솓된다. 

    - @Repeatable : 하나의 대상에 한 종류의 어노테이션 붙이는게 일반적임. 

                               어노테이션을 붙여서 어노테이션을 정의하면, 특정 클래스에 해당 어노테이션을 여러번 사용할 수 있다.

    -@ Native: 네이티브 메서드에 의해 참조되는 상수 필드에 붙이는 어노테이션임

     

     

    4. 어노테이션 정의하기

     

    4.1 @Interface

     - 어노테이션을 정의하는 것은 인터페이스를 정의하는 것과 비슷하다.

     - @interface 뒤에 사용할 어노테이션 이름이 온다. 

    public @interface AnonotationName{
    
    }

    4.2 속성

    - 어노테이션을 속성을 가질 수 있다.

    - 모양은 추상메서드와 똑같다.

     

    public @interface AnonotationName{
    
      String prop1();
      int prop2() default 1;
    
    }
    
    @AnonotationName(prop1="val")
    @AnonotationName(prop1="val",prop2=3)

     - prop1은 String타입을 값으로 가지는 속성이다.

     - prop2는 int를 값으로가지며, 기본값은 1이다. 

     - 기본속성이 1개이고 이름이 value인 경우에만 속성명을 생략할 수 있다.

     

    public @interface AnonotationName{
    
      String value();
      int prop2() default 1;
    
    }
    
    @AnonotationName("값")

     

    4.3 메타정보

     

    @Target({Element.TYPE, ElementType.FIELD})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface AnonotationName{
    
      String value();
      int prop2() default 1;
    
    }

    - 위와 어노테이션에 대한 메타정보를 설정할 수 있다.

     

     

     

    4.4 리플렉션을 통한 어노테이션 활용

     

     - RUNTIME으로 설정된 어노테이션은 리플렉션을 통해 어노테이션을 활용할 수 있다.

    boolean isAnnotationPresent(AnnotationName.class) 지정한 어노테이션 적용되었는지 여부
    Annotation getAnnotation(AnnotationName.class) 지정한 어노테이션이 적용되어 있으면, 어노테이션 리턴 아니면 null
    Annotation[]  getDeclaredAnnotaions() 적용된 모든 어노테이션 리턴

     

     

    @Target({ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface PrintAnnotation{
    	String value() default "-";
        int number() default 15;
    }

    어노테이션 정의

     

    public class Service{
    
      @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);
       }
    
    
    }

    어노테이션 사용

     

     

    public class Ex{
    
    public static void main(String[] args) throws Exception{
       
       Method[] declaredMethod = Service.class.getDeclaredMethods();
       
       for(Method method : declaredMethods){
          //printAnnotation 얻기
          PrintAnnotation printAnnotation = method.getAnnotation(PrintAnnotation.class);
          
          //설정 정보를 이용해서 선 출력 
          printLine(prinyAnnotation);
          
          //메소드 호출
          method.invoke(new Servie());
          
          //설정 정보를 이용해서 선 출력 
          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();
           
           }
         }
       
      }
    }

    '언어 > JAVA' 카테고리의 다른 글

    컬렉션 예시들  (0) 2023.07.09
    컬렉션  (0) 2023.07.09
    중첩 선언과 익명 객체  (0) 2023.07.07
    상속,동적생성  (0) 2023.07.06
    클래스,인스턴스 메서드 메모리 저장,싱글톤,접근제한자  (0) 2023.07.06
Designed by Tistory.