애노테이션에 대해 알아보자
목표
자바의 애노테이션에 대해 학습하세요.
학습할 것 (필수)
- 애노테이션 정의하는 방법
- @retention
- @target
- @documented
- 애노테이션 프로세서
Annotation 이란?
개발을 하다보면 클래스, 메서드, 변수 앞에 붙은 @ 표시를 많이 보았을 것이다
어노테이션이라 부르며, 자바5부터 추가된 요소다
사전적 의미는 "주석"이며 의미대로 자바 코드에 달아 특수한 의미를 부여한다.
이 특별한 의미는 컴파일 타임 또는 런타임에 해석될 수 있다.
Annotation 사용방법은 크게 문서화, 컴파일러 체크, 코드 분석을 위한 용도로 사용된다.
문법적으론 @기호가 붙은 심볼을 사용하며 패키지, 클래스, 메소드, 프로퍼티, 변수에 명시할 수 있다.
컴파일 타임에 에러를 발생시켜 위험요소를 경고하거나 확인해주는 목적으로 사용된다.
가장 큰 비중을 갖는 방법은 코드 분석 또는 "메타데이터" 용도다. 메타데이터란 데이터를 위한 데이터, 즉 데이터에 대해 설명하는 데이터를 의미한다. 메타데이터로 annotation의 효용을 가장 잘 느낄 수 있는 부분이 JEE 설정과 유효성 검사부분이다.
annotation 은 클래스처럼 멤버를 가질 수 있다. 이 멤버의 개수에 따라 다음과 같이 분류된다
- Marker annotaion : 멤버 변수가 없으며, 단순 표식으로 사용된다. 컴파일러에게 어떤 의미를 전달한다
- Single-value annotation : 멤버로 단일변수만 갖는다. 단일변수 밖에 없기에 값만을 명시하여 데이터를 전달한다
- Full annotaion : 멤버를 둘 이상 갖는다. 데이터를 key=value 의 형태로 전달한다
빌트인(Built-in) 어노테이션
자바에서 기본적으로 제공하는 annotation 이 존재하는데 이를 빌트인(Built-in) 어노테이션이라 한다
- @Override : 메소드가 오버라이드 됐는지 검증한다. 부모 클래스 또는 구현해야할 인터페이스에서 해당 메소드를 찾을 수 없다면 컴파일 오류가 발생한다.
- @Deprecated : 메소드 사용을 비권장한다. 만약 사용하면 컴파일 경고를 일으킨다.
public class SampleService {
@Deprecated
public void walkingLunge() {
System.out.println("워킹런지하면 후폭풍 엄청납니다");
}
}
public class AnnotationMain {
public static void main(String[] args) {
SampleService service = new SampleService();
service.walkingLunge();
}
}
- @Supresswarning : 컴파일 경고를 무시한다
- @SafeVarargs : 제너릭 같은 가변인자 매개변수 사용 경고를 무시한다 (자바7 이상)
- @FuntionalInterface : 람다 함수등을 위한 인터페이스 지정, 메소드가 없거나 2개 이상되면 컴파일 에러 발생 (자바 8이상)
메타 어노테이션
어노테이션에 적용하는 어노테이션이다
커스텀 어노테이션을 만들 때 주로 사용한다
@Retention
어노테이션의 라이프 타임을 설정한다
public enum RetentionPolicy {
/**
* Annotations are to be discarded by the compiler.
*/
SOURCE,
/**
* Annotations are to be recorded in the class file by the compiler
* but need not be retained by the VM at run time. This is the default
* behavior.
*/
CLASS,
/**
* Annotations are to be recorded in the class file by the compiler and
* retained by the VM at run time, so they may be read reflectively.
*
* @see java.lang.reflect.AnnotatedElement
*/
RUNTIME
}
- SOURCE : 컴파일 전까지만 유효하고 컴파일 이후엔 사라진다, @Override 같이 주석처럼 사용된다
- CLASS : 디폴트값이며, 컴파일러가 클래스를 참조할 때까지만 유효한다.
- RUNTIME : 컴파일 이후에도 JVM에 의해 계속 참조가 가능하다.
@Target
어노테이션이 적용할 위치를 정한다
public enum ElementType {
/** Class, interface (including annotation type), or enum declaration */
TYPE,
/** Field declaration (includes enum constants) */
FIELD,
/** Method declaration */
METHOD,
/** Formal parameter declaration */
PARAMETER,
/** Constructor declaration */
CONSTRUCTOR,
/** Local variable declaration */
LOCAL_VARIABLE,
/** Annotation type declaration */
ANNOTATION_TYPE,
/** Package declaration */
PACKAGE,
/**
* Type parameter declaration
*
* @since 1.8
*/
TYPE_PARAMETER,
/**
* Use of a type
*
* @since 1.8
*/
TYPE_USE,
/**
* Module declaration.
*
* @since 9
*/
MODULE
}
- TYPE : 타입 선언
- FIELD : 멤버변수 선언
- METHOD : 메소드 선언
- PARAMETER : 매개변수 선언
- CONSTRUCTOR : 생성자 선언
- LOCAL_VARIABLE : 지역변수 선언
- ANNOTAION_TYPE : 어노테이션 타입 선언
- PACKAGE : 패키지 선언
- TYPE_PARAMETER : 전달인자 타입 선언
- TYPE_USE : 타입 선언
- MODULE : 모듈 선언
@Documented
어노테이션 정보를 javadoc 문서에 포함시키는 메타 어노테이션이다.
@Inherited
부모를 상속받은 자식 클래스까지 어노테이션 상속이 되게 해준다
@Repeatable
어노테이션을 반복적으로 선언할 수 있게 해준다
Annotation 정의하는 방법
custom annotation 을 사용하고 싶으면 다음과 같이 선언하여 사용한다
public @interface MyName {}
@interface 를 이용하여 선언한다.
어노테이션 프로세서
자바 컴파일러 플러그인의 일종이며, 어노테이션에 대한 코드베이스를 검사, 수정, 생성하는 기능이다
컴파일 시점에 조작하기 때문에 런타임 비용은 제로지만
기존 클래스 코드를 변경할 때는 약간의 hack이 필요하다
참고자료
https://hiddenviewer.tistory.com/88
https://jktech.tistory.com/28
https://jdm.kr/blog/216
www.inflearn.com/course/the-java-code-manipulation/dashboard
'개발 & 방법론 > Java' 카테고리의 다른 글
11주차 과제 : enum (0) | 2021.02.18 |
---|---|
10주차 과제 : 멀티쓰레드 프로그래밍 (0) | 2021.02.18 |
9주차 : 예외처리 (0) | 2021.02.14 |
자바 8주차 : 인터페이스 (0) | 2021.02.13 |
7주차 : 패키지 (0) | 2021.01.01 |