자바의 애노테이션에 대해 학습하세요.
애너테이션 | 설명 |
---|---|
@Override | 컴파일러에게 해당 메서드는 오버라이딩하는 것이란 정보 제공 |
@Deprecated | 클라이언트에게 사용하지 않을 것을 권한다는 정보 제공 |
@SuppressWarnings | 컴파일러에게 특정 경고메시지 나타내지 않도록 정보 제공 |
@SafeVarargs | 클라이언트에게 제네릭 타입의 가변인자 사용에 대한 정보 제공 |
@FunctionalInterface | 함수형 인터페이스 사용에 대한 정보 제공 |
@Native | native메서드에서 참조되는 상수라는 정보 제공 |
메타 애너테이션 | 설명 |
---|---|
@Target | 애너테이션이 적용가능한 대상에 대한 정보 제공 |
@Documented | 애너테이션 정보가 javaodc 문서에 포함되기 위한 정보 제공 |
@Inherited | 애너테이션이 서브 클래스에 상속되기 위한 정보 제공 |
@Retention | 애너테이션이 유지 되는 기간에 대한 정보 제공 |
@Repeatable | 애너테이션이 한 대상에 여러 번 적용될 수 있도록 정보 제공 |
interface
선언과 구분하기 위해 @
를 붙인다java.lang.annotation.Annotation
를 확장하며, Annotation
을 수동으로 확장한다고 해서 애노테이션이 되지는 않는다@interface MyAnnotation{
...
}
요소이름 = 적용값
방식default
값을 줄 수 있다타입 요소이름() default "DEFAULT"
null
은 기본값으로 불가value
일 때 요소이름 생략하여 값 지정 가능@MyAnnotation("요소이름 생략 가능")
RetentionPolicy
가 있는데, 여기에는 SOURCE
CLASS
RUNTIME
이 있다RetentionPolicy | 유지 기간 |
---|---|
SOURCE | 소스 파일까지 유지 |
CLASS(default) | 클래스 파일까지 유지 |
RUNTIME | 런타임까지 유지 |
SOURCE
소스 파일까지 애노테이션 정보를 유지하며, 컴파일 이후 클래스 파일에는 남아있지 않다
주로 컴파일러에게 정보 제공
클래스 파일에 애노테이션 정보가 필요 없는 경우 예시
@Override
, @SupperessWarnings
컴파일러의 에러 체크에 대한 정보를 주는 경우
lombok
의 @Getter
처럼 클래스 파일에 바이트코드를 생성해주고 애노테이션이 역할을 다하고 더 이상 해당 정보가 필요 없는 경우
CLASS
SOURCE
와 차이점은 클래스 파일에 정보가 남는 다는 것, 사용 상황 예시RUNTIME
참고: 기본기를 쌓는 정아마추어 코딩블로그: 아무 관심 없던 @Retention 어노테이션 정리(RetentionPolicy SOURCE vs CLASS vs RUNTIME)
java.lang.annotation.ElementType
열거형에 정의된 상수 사용 가능{}
사용상수 | 설명 |
---|---|
ANNOTATION_TYPE | 애노테이션 |
CONTRUCTOR | 생성자 |
FIELD | 필드(enum 상수 포함) |
LOCAL_VARIABLE | 지역변수 |
METHOD | 메서드 |
PACKAGE | 패키지 |
PARAMETER | 파라미터 |
TYPE | 클래스, 인터페이스(애노테이션 타입 포함), enum |
TYPE_PARAMETER | 타입 파라미터 (JDK 1.8) |
TYPE_USE | 타입이 사용되는 곳 (JDK 1.8) |
ElementType.TYPE
인 마커 애노테이션을 작성하고 있다면, 정말 애노테이션으로 구현해야 할지, 마커 인터페이스로 구현했을 시와 비교해 고민package com.servlets;
import java.lang.annotation.*;
@Unfinished("Just articleware")
@Documented
public @interface Unfinished { ...
출저 : oracle: Making the Most of Java's Metadata, Part 2: Custom Annotations
@Unfinished
가 붙은 메서드나 클래스는 javadocs에 @Unfinished
에 대한 정보가 포함되는 것아래 링크는 애너테이션 프로세서를 구현하고 사용하는 내용을 보여준다
애너테이션 프로세스를 통해 특정 애너테이션을 컴파일 타임에 원하는 방식으로 처리할 수 있다