슬기로운 개발생활

온라인 자바 스터디 #12 - 어노테이션(Annotation)

by coco3o
반응형

목표

자바의 어노테이션에 대해 학습하세요.

학습할 것 (필수)

  • 어노테이션 정의하는 방법
  • @target
  • @retention
  • @documented
  • 어노테이션 프로세서

어노테이션 정의하는 방법

어노테이션이란?

-  인터페이스를 기반으로 한 문법이다.

-  @를 이용한 주석, 자바코드에 주석을 달아 특별한 의미를 부여한 것

-  프로그램에게 추가적인 정보를 제공 해주는 메타데이터(meta data : 데이터를 위한 데이터)라고 볼 수 있다.

-  어노테이션은 다음 세가지 용도로 사용된다.

  • 컴파일러에게 코드 문법 에러를 체크하도록 정보를 제공
  • 소프트웨어 개발 툴이 빌드나 배치 시 코드를 자동으로 생성할 수 있도록 정보를 제공
  • 실행 시(런타임 시) 특정 기능을 실행하도록 정보를 제공

 

 JDK에서 제공하는 기본 어노테이션
  • @Override  :  해당  메소드는  부모  클래스에  있는  메소드를  재정의했다는  것을  명시적으로  선언
  • @Deprecated  :  더이상  사용되지  않는  클래스나  메소드  앞에  추가
  • @SuppressWarnings  :  예를들어  어떤  코드가  경고메세지를  수천개씩  쏟아내는데,  그게  보기싫을때  컴파일러  입막음  시켜버림
어노테이션 정의
public @interface MyAnnotation { }

 

이렇게 정의한 어노테이션은 다음과 같이 사용한다.

@MyAnnotation

어노테이션은 클래스의 필드처럼 엘리먼트를 멤버로 가질 수 있다.

각 엘리먼트는 타입과 이름으로 구성되며,디폴트 값을 가질 수 있다. 엘리먼트 타입으로는 int나 double과 같은 원시 타입이나 String, Class 타입, 그리고 이들의 배열 타입을 사용할 수 있다.

public @interface MyAnnotation {
    /* 엘리먼트 선언 */
    String value();
    int number() default 10;
}

이렇게 정의한 어노테이션을 코드에서 적용할 때는 다음과 같이 기술한다.

@MyAnnotation(value = "coco")
public class AnnotationTest { }
@MyAnnotation(value = "coco", number = 1)
public class AnnotationTest { }

value()은 디폴트 값이 없기 때문에 반드시 값을 기술해야하고,  number()는 디폴트 값이 있기 때문에 생략이 가능하다.


@Target,  @Retention

어노테이션을 적용할 때는 어노테이션이 어디에 적용되며 언제까지 어노테이션 소스가 유지될 것인가를 설정해야 하는데 소스코드에는 다음과 같이 어노테이션을 정의해 주면 된다.

@Target({ElementType.[적용대상]})
@Retention(RetentionPolicy.[정보유지되는 대상])
public @interface [어노테이션명] {
         public 타입 elementName() [default 값]
         ...
}

@Target에는 어떠한 값(ex  :  클래스,  필드,  메소드  ...)에만  자신이  만든  어노테이션을  사용하게  할것인지  나타낼  수  있는데  넣을  수  있는  값은  다음  표와  같다.

ElementType 열거 상수 적용 대상
TYPE 클래스, 인터페이스, 열거 타입
ANNOTATION_TYPE 어노테이션
FIELD 필드
CONSTRUCTOR 생성자
METHOD 메소드
LOCAL_VARIABLE 로컬 변수
PACKAGE 패키지

위처럼 만들면 메소드에서만 사용가능한 어노테이션을 정의할 수 있다.

아래와 같이 타겟을 정할 수 있다. 여러 개 정의가 가능하고 @Target을 생략시 아무대서나 사용 가능


@Retention에는  어노테이션  정보를  언제까지  유지할  것인지  값을  설정하는데  각  값이  가지는  의미는  다음  표와  같다.

보통  어노테이션은  Runtime시에  많이  사용하므로  대부분의  어노테이션의  Retention  값은  RUNTIME으로  되어있다.

RetentionPolicy 열거 상수 설명
SOURCE 소스상에서만 어노테이션 정보를 유지한다. 소스 코드를 분석할
때만 의미가 있으며, 바이트 코드 파일에는 정보가 남지 않는다.
CLASS 바이트 코드 파일까지 어노테이션 정보를 유지한다. 하지만 리플렉션을
이용해서 어노테이션 정보를 얻을 수는 없다.
RUNTIME 바이트 코드 파일까지 어노테이션 정보를 유지하면서 리플렉션을 이용해서
런타임에 어노테이션 정보를 얻을 수 있다.

 


@Inherited,  @Documented

@Inherited 어노테이션은 이 어노테이션을 사용한 슈퍼클래스를 상속한 서브클래스에서도 해당 어노테이션을 갖도록 한다.

java.lang.annotation.Inherited

@Inherited
public @interface MyAnnotation {
}

 

@MyAnnotation
public class SuperClass { . . . }

 

public class SubClass extends SuperClass { . . . }

SubClass 클래스는 @MyAnnotation 을 상속한다.


 

@Documented 어노테이션의 정보가 JavaDoc의 문서에 포함되도록 하는 어노테이션이다.

java.lang.annotation.Documented

@Documented
public @interface MyAnnotation {
}

 

@MyAnnotation
public class SuperClass { . . . }

어노테이션  프로세서

annotation processor는 자바 컴파일러 플러그인의 일종으로, 어노테이션에 대한 코드베이스를 검사, 수정, 생성하는 역할이다.

어노테이션을 사용하기 위해서는 어노테이션 프로세서가 필요하다.

 

동작 구조

1. 어노테이션 프로세서를 사용한다는 것을 자바 컴파일러가 알고 있는 상태에서 컴파일을 수행

2. 어노테이션 프로세서들이 각자의 역할에 맞게 구현되어 있는 상태에서 실행되지 않은 어노테이션 프로세서를 실행

3. 어노테이션 프로세서 내부에서 어노테이션에 대한 처리

4. 자바 컴파일러가 모든 어노테이션 프로세서가 실행 되었는지 검사하고, 모든 어노테이션 프로세서가 실행되지 않았다면 반복


references :

webcoding-start.tistory.com/17

honeyinfo7.tistory.com/56

hamait.tistory.com/314?category=79137

cris.joongbu.ac.kr/course/java/api/java/lang/annotation/Documented.html

im-recording-of-sw-studies.tistory.com/37

반응형

블로그의 정보

슬기로운 개발생활

coco3o

활동하기