프로그래밍 언어/JAVA

[개요] 자바 Annotation 이해

투칼론 2016. 3. 2. 18:50
반응형

1. Annotation 정의 및 특징

  • Java 5부터 지원하는 기능
  • 소스코드에서 비즈니스 로직에는 영향을 주지 않지만, 해당 타겟에 영향을 주거나 소스코드의 구조를 변경할 수 있음
  • 소스코드에 메타데이터를 삽입하는 것이기 때문에 가독성 뿐만 아니라, 전체적인 소스코드 구성하는데 도움 
  • Annotation 메타데이터를 프로그램 구성요소(클래스, 인터페이스, 메소드 등)과 연결 방법 제시
  • 코드 라인 수를 줄이고, 선언으로 해결 함
  • Annotation은 @을 앞에 붙이고, 자바에서 기본적으로 제공하는 @Deprecated, @Override, @SuppressWarnings 등이 있고, 개발자가 직접 정의하여 사용할 수 있음
 
2. 사전 정의된 Annotation 
  • 사전 정의된 Annotation에는 자바언어에 의해 사용되는 Annotation과 다른 Annotation에 영향을 주는 Annotation이 있음
  • 자바언어에서 사용되는 Annotation
 Annotation 설명 
 @Override  메소드 선언하며 지정한 메소드가 부모클래스로부터 오버라이드 된 메소드임을 명시
 @Deprecated  클래스, 메소드, 필드 등에 선언하며 지정한 요소가 더이상 사용되지 않음을 의미함
 @SuppressWarning  클래스, 메소드, 필드 등에 선언하며 선언한 영역에서 발생한 컴파일러의 경고를 제거함

그외에, @SafeVarargs, @FunctionalInterface 등이 있음

 

  • 다른 Annotation에 영향을 주는 Annotation
 Annotation 설명
 @Target  Annotation을 적용할 대상을 지정함
 value값으로는 ElementType에 enum 상수인 다음의 값들을 사용할수있음
  • ElementType.ANNOTATION_TYPE : annotation에 적용 
  • ElementType.CONSTRUCTOR : 생성자에 적용
  • ElementType.FIELD : 필드 또는 프로퍼티에 적용
  • ElementType.LOCAL_VARIABLE : 지역 변수에 적용
  • ElementType.METHOD : 메소드 레벨 annotation에 적용
  • ElementType.PACKAGE : 패키지 선언에 적용
  • ElementType.PARAMETER : 메소드의 파라미터에 적용
  • ElementType.TYPE : 클래스의 요소에 적용
 @Retention  Annotation 정보가 언제까지 유지될지를 지정함
 value값으로는 RententionPolicy에 enum상수인 다음의 값들을 사용할수있음
  • RententionPolicy.SOURCE : 소스에서만 사용됨
  • RententionPolicy.CLASS : 소스와 클래스에서 사용됨
  • RententionPolicy.RUNTIME : 소스, 클래스, 실행시에 사용됨
 @Documented  Annotation을 JavaDoc에 포함함
 @inherited  부모 Annotation을 상속받음

 

3. Custom Annotation 예제

[Maker.java]  

  • Maker라는 Custom Annotation을 정의하는 소스 파일
  • interface앞에 @ 문자가 있음
package anotest;
import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME) 
public @interface Maker {
    int num() default 1;
    String name();
    String date() default "2016-03-10";
}

[AnnTest.java]  

  • @Maker Annotation을 테스트 하는 소스 파일
  • num과 name만 설정됨 (date는 설정되지 않았으므로 default값이 표시됨)
package anotest;import java.lang.annotation.Annotation;
@Maker(num = 9, name = "james")
public class AnnTest {
   public static void main(String[] args) {

Class<AnnTest> obj = AnnTest.class;
Maker maker = (Maker) obj.getAnnotation(Maker.class);
System.out.println("num  : " + maker.num());
        System.out.println("name : " + maker.name());

        System.out.println("date : " + maker.date());

   }
}
위에서 AnnTest.java를 컴파일하여 실행하면, 아래와 같이 출력된다. date 값은 default 값이 출력됨을 확인할 수 있다.
 
num  : 9
name : james
date : 2016-03-10

상세한 내용은 아래 URL을 참조할 것

https://docs.oracle.com/javase/tutorial/java/annotations/index.html