Home > Java > Live-Study > 자바의 애노테이션

자바의 애노테이션
java 백기선 Live Study

목적

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

학습할 것

  1. 애노테이션 정의하는 방법
  2. @retention
  3. @target
  4. @documented
  5. 애노테이션 프로세서

1. 애노테이션 정의하는 방법


애너테이션이란

프로그램의 소스코드 안에 다른 프로그램의 위한 정보를 미리 약속된 형식으로 포함시킨 것
프로그래밍 언어에 영향을 미치지 않으면서도 다른 프로그램에게 유용한 정보를 제공하는 장점

작성법

@interface 애너테이션이름 {  
  타입요소 이름();  
 ...}  

@애너테이션이름 -> 애너테이션
애너테이션이름 -> 애너테이션 타입

애너테이션 내에 선언된 메서드를 애너테이션의 ‘요소’ 라고 하며 요소들을 통해 값을 정의할 수 있다.
요소들은 반환값이 있고 매개변수가 없는 추상 메서드 형태이며, 상속을 통해 구현하지 않아도 된다.
다만 요소들의 값은 빠짐없이 지정해줘야 한다. (default를 옆에 붙여주면 기본 값을 가질 수 있다.)

@interface TestInfo{  
 String[] testTools() default {"test1", "test2", ""}  
}  
  
@TestInfo(testTools = {"aaa", "bbb", "ccc"})  
class or method { ~~ } 

만약 이름의 요소가 value 이면 요소이름 생략 가능

java.lang.annotation.Annotation

애너테이션은 상속이 허용되지 않으므로, 명시적으로 Annotation을 조상으로 지정할 수 없다.

2. @retention


애너테이션이 유지되는 기간을 지정하는데 사용한다.

유지정책 의미      
SOURCE 소스파일에만 존재. 클래스파일에는 존재하지 않음      
CLASS 클래스파일에 존재. 실행시에 사용불가. 기본값   RUNTIME 클래스파일에 존재. 실행시에 사용가능.

컴파일러가 사용하는 애너테이션은 유지 정책이 SOURCE이다.

@Target(ElementType.METHOD)  
@Retention(RetentionPolicy.SOURCE)  
public @interface Override { ...}  
  • SOURCE : 컴파일러가 사용하는 애너테이션, 직접작성할 것 아니면 이 유지정책은 필요 없다.
  • RUNTIME : , 실행 시 리플랙션을 통해 클래스파일에 저장된 애너테이션 정보를 읽어서 처리할 수 있다.
  • CLASS : 클래스 파일에 저장할 수 있게는 하지만 클래스파일이 JVM 로딩될 때는 정보가 무시되어 애너테이션 정보를 얻을 수 없다.

3. @target


애너테이션이 적용가능한 대상을 지정하는데 사용.

대상타입 의미
ANNOTATION_TYPE 애너테이션
CONSTRUCTOR 생성자
FIELD 필드
LOCAL_VARIABLE 지역변수
METHOD 메서드
PACKAGE 패키지
PARAMETER 매개변수
TYPE 타입
TYPE_PARAMETER 타입 매개변수
TYPE_USE 타입이 사용되는 모든 곳
  • TYPE은 타입을 선언할 때 붙일 수 있고, TYPE_USE는 해당 타입의 변수를 선언할 때 붙일 수 있다.
  • FIELD는 기본형에, TYPE_USE는 참조형에 사용된다.

4. @documented


애너테이션에 대한 정보가 javadoc으로 작성한 문서에 포함되도록 한다. 자바에서 제공하는 기본 애너테이션 중, @Override, @SuppressWarnings를 제외하고는 이 메타 애너테이션이 붙어있다.

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface FunctionalInterface{}

5. 애노테이션 프로세서


어노테이션을 프로세싱 즉, 내가 보았던 것은 lombok이 대표적이며, 이 외에 이것을 어떻게 작성해야 될 지 모르겠다. 그래서 강의를 들으면서 작성하려고 한다.

Reference

남궁성. Java의 정석