본문 바로가기
JAVA

애노테이션

by e-pd 2021. 2. 5.

https://github.com/whiteship/live-study/issues/12

 

어노테이션이란?

메타데이터로서 프로그램에 추가적인 정보를 제공해준다. Java5에서 추가됨.

자바 애너테이션은 컴파일러에 의해 생성된 후 자바 가상머신에 포함되어 작동한다.

 

컴파일러에게 정보 제공 - 어노테이션은 컴파일러에게 에러나 suppress warnings를 알림

Compile-time and deployment-time processing - 소프트웨어 툴에서 코드 , XML 파일등을 생성하는데 사용될 수 있음

Runtime processing - 런타임에서 일부 어노테이션을 사용할 수 있음

 

 

에노테이션 정의하는 방법

클래스나 메서드위에 붙음.  클래스가 컴파일되거나 실행될 때 어노테이션을 통해 클래스가 다르게 실행이 가능.

 

자바가 제공하는 기본 어노테이션

docs.oracle.com/javase/tutorial/java/annotations/predefined.html

 

Predefined Annotation Types (The Java™ Tutorials > Learning the Java Language > Annotations)

The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available. See Java Language Changes for a summary of updated

docs.oracle.com

 

@Deprecated

Deprecated가 붙은 대상은 deprecate (중요도가 떨어져 더 이상 사용되지 않고 앞으로는 사라지게 될 ) 되어 더 이상 쓰이지 않음을 알림

 

 // Javadoc comment follows
    /**
     * @deprecated
     * explanation of why it was deprecated
     */
    @Deprecated
    static void deprecatedMethod() { }

 

 

@Override

Override가 붙은 대상은 superclass를 override를 했음을 알림

 

 // mark method as a superclass method
   // that has been overridden
   @Override 
   int overriddenMethod() { }

 

@SuppressWarning

컴파일러에게 발생할 수 있는 경고를 제한하는 역할을 한다

// use a deprecated method and tell 
   // compiler not to generate a warning
   @SuppressWarnings("deprecation")
    void useDeprecatedMethod() {
        // deprecation warning
        // - suppressed
        objectOne.deprecatedMethod();
    }

 

커스텀 어노테이션 만들기

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Study {
    public String name();
}


public class MyStudy {
    @Study(name = "Java")
    public void joinWhiteShip(){
        System.out.println("study, halle?");
    }
}


public class Main {

    public static void main(String[] args) throws NoSuchMethodException {
        final Method method = MyStudy.class.getMethod("joinWhiteShip");
        if (method.isAnnotationPresent(Study.class)) {
            final Annotation annotation = method.getAnnotation(Study.class);
            final Study study = (Study) annotation;
            System.out.println(study.name()); // Prints Java
        }
        MyStudy myStudy = new MyStudy();
        try {
            method.invoke(myStudy);     //study, halle?
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        myStudy.joinWhiteShip();        // study, halle?
    }
}

 

@Retention

Annotation으로 명시된 대상이 얼마나 유지되는지 알림

  • RetentionPolicy.SOURCE – 소스 단계에서 유지되며, 컴파일러에 결정
  • RetentionPolicy.CLASS – compile time에서 유지되며 , Java Virtual Machine (JVM)에 결정
  • RetentionPolicy.RUNTIME – JVM에서 유지되며 runtime 환경에 결정

@Target 어떤 종류의 자바 대상에 적용할 것인지를 알림

  • ElementType.ANNOTATION_TYPE - 어노테이션 타입에 적용
  • ElementType.CONSTRUCTOR - 생성자에 적용
  • ElementType.FIELD - 변수에 적용
  • ElementType.LOCAL_VARIABLE - 지역변수에 적용
  • ElementType.METHOD - 메서드에 적용
  • ElementType.PACKAGE - 패키지에 적용
  • ElementType.PARAMETER - 메서드 파라미터에 적용
  • ElementType.TYPE - 클래스 내 아무 대상이나 적용

@Document

Document 가 붙은 어노테이션이 Javadoc 에 문서화되는 것을 알림

 

어노테이션 프로세서

어노테이션에 대한 컴파일 타임에 어노테이션을 스캔하고 처리하기 위한 도구

어노테이션만으로도 여러 모델 클래스들을 만들어낼 수 있는 팩토리를 구성할 수 있다.

'JAVA' 카테고리의 다른 글

제너릭  (0) 2021.02.25
I/O  (0) 2021.02.15
enum  (0) 2021.01.25
멀티쓰레드 프로그래밍  (0) 2021.01.16
예외처리  (0) 2021.01.10