Overview

애노테이션(Annotation)은 Java5부터 등장한 기능으로 사전적인 의미는 "주석"이라고 나오지만, 자바언어에서는 일반 주석(//,/**/)과는 달리 주석의 형태로 소스코드에 메타데이터(실제테이터가 아닌 데이터를 위한 데이터)를 삽입하는 것을 의미한다.
애노테이션이 설정된 자바 소스코드는 컴파일시나 런타임시에 소스코드에 메타데이터가 삽입되어 비즈니스 로직에는 영향을 주지 않으면서 소스코드에 대한 정보 추가, 소스코드의 구조를 변경, 오류제어,환경설정정보 추가 등을 할 수 있다.(애노테이션은 컴파일시에 처리될 수도 있고 자바의 리플렉션을 거쳐서 런타임시에 처리될 수도 있다.
※ 리플렉션(reflection) : 보통은 클래스를 통해 객체를 설명하지만, 클래스가 아닌 메모리에 만들어진 객체를 통해 클래스의 정보를 분석하는 기법


 1. 자바언어의 애노테이션

메타데이터를 클래스, 인터페이스, 메서드, 필드 등에 연결하여 해당 타켓에 메타데이터를 추가


2. 자바언어에서 기본적으로 제공하는 애노테이션 사용

  • @Override : 이 어노테이션은 메서드가 부모클래스로부터 오버라이드 된 메서드임을 명시한다. 부모클래스에 메서드가 없으면 컴파일 에러가 발생한다.
  • @Deprecated : 이 어노테이션은 가급적 사용을 자제해달라는 의미로 사용된다. 예를 들어 메서드 앞에 @Deprecated가 붙으면, 이 메소드를 사용하거나 오버라이드 할 경우, 컴파일 할 때 경고가 뜬다.
  • @SupperssWarning : 이 어노테이션 역시 컴파일러의 경고와 관련된 어노테이션이다. @SuppressWarnings의 의미는 이 부분에 대해서 경고문을 출력하지 말라는 의미이다. 자바에서 주로 등장하는 경고문의 종류에는 deprecation과 unchecked가 있다. 이 둘둥 하나를 @SuprpressWarnings옆의 괄호에 넣어야 한다.
ex)
  1. public class Test extends SuperClass{
  2.     @Override
  3.     public void exe(){
  4.         // 부모클래스에 exe()메서드가 없으면 컴파일 에러!
  5.     }
  6. }


3. 사용자 정의 애노테이션 만들기

사용자 정의 애노테이션은 다음 4개의 애노테이션을 사용하여 만든다.

① @Target : 애노테이션을 적용할 대상을 지정한다.

value값은 enum타입 ElementType의 상수값을 사용(enum타입은 다음을 참조 http://cafe.naver.com/jjdev/440)
  • ElementType.CONSTRUCTOR : 생성자에 적용
  • ElementType.FIELD : 필드에 적용 
  • ElementType.LOCAL_VARIABLE : 지역변수에 적용 
  • ElementType.METHOD : 메서드에 적용
  • ElementType.PACKAGE : 패키지에 적용
  • ElementType.PARAMETER : 매개변수에 적용
  • ElementType.TYPE : class, interface, enum 에 적용

② @Retention : 해당 애노테이션의 적용scope를 지정한다.

value값은 enum타입 RetentionType의 상수값을 사용
  • RetentionType.SOURCE : 소스파일에만 적용됨. 컴파일부터는 적용되지않음. 클래스 파일은 애노테이션을 가지지 않음
  • RetentionType.CLASS : 클래스 파일에 적용됨. 실행시에는 사용하지 못함. 
  • RetentionType.RUNTIME : 소스파일과 클래스파일, 실행시 적용됨

③ @Documented : 해당 애노테이션의 API Documentation을 만든다.

④ @Inherited : 해당 애노테이션이 상속을 가능하게 한다(기본적으로 애노테이션은 상속이 되지 않는다) 


ex) 필드에 값을 애노테이션을 사용하여 설정하는 예제

[step1] 애노테이션 만들기

  1. import java.lang.annotation.ElementType;
  2. import java.lang.annotation.Retention;
  3. import java.lang.annotation.RetentionPolicy;
  4. import java.lang.annotation.Target;
  5.  
  6.  
  7. public @interface MyAnnotation {
  8.     String value();
  9. }

[step2] 애노테이션 타켓 설정

  1. public class User {
  2.     @MyAnnotation(value="guest")
  3.     private String name;
  4. }

[step3] 애노테이션 타켓 실행(리플렉션 클래스 사용)

  1. import java.lang.reflect.Field;
  2.  
  3. public class MainTest {
  4.     public static void main(String[] args){
  5.         Class<User> user = User.class;
  6.         try{
  7.             Field field = user.getDeclaredField("name");
  8.             System.out.println("user name :"+field.getAnnotation(MyAnnotation.class).value());
  9.         }catch(Exception e){
  10.             e.printStackTrace();
  11.         }
  12.     }
  13. }


다른 카테고리의 글 목록

서버측 언어/JAVA 카테고리의 포스트를 톺아봅니다