[자바/Java] 애노테이션(annotation)이란?
resilient
·2021. 2. 17. 01:41
github.com/whiteship/live-study/issues/12
목표
자바의 애노테이션에 대해 학습하세요.
학습할 것 (필수)
- 애노테이션 정의하는 방법
- @retention
- @target
- @documented
- 애노테이션 프로세서
#애노테이션이란?
자바를 개발 할때 소스코드에 대한 문서를 따로 만들기보다 소스코드와 문서를 하나의 파일로 관리하는 것이 낫다고 생각한 개발자들이 소스코드의 주석에 소스코드에 대한 정보를 저장하고 소스코드의 주석으로부터 HTML문서를 생성해내는 프로그램 ( javadoc.exe) 를 만들어서 사용하였다.
이 기능을 응용하여, 프로그램의 소스코드 안에 다른 프로그램을 위한 정보를 미리 약속된 형식으로 포함시킨 것이 바로 애노테이션이다.
애노테이션은 주석처럼 프로그래밍 언어에 영향을 미치지 않으면서 다른 프로그램에게 유용한 정보를 제공할 수 있다는 장점이 있다.
JDK에서 제공하는 표준 애노테이션은 주로 컴파일러를 위한 것으로 컴파일러에게 유용한 정보를 제공한다. 그리고 새로운 애노테이션을 저의할 때 사용하는 메타 애노테이션을 제공한다.
# 표준 애노테이션 & 메타애노테이션
표준 애노테이션은 자바에서 기본적으로 제공하는 애노테이션이다.
이 중 일부는 메타 애노테이션으로 애노테이션을 정의하는데 사용되는 애노테이션의 애노테이션이라고 할 수 있다.
표준 애노테이션
@Override | 컴파일러에게 오바라이딩하는 메소드임을 알린다 |
@Deprecated | 앞으로 사용하지 않을 것을 권장하는 대상에 붙인다 |
@SuppressWarnings | 컴파일러의 특정 경고메시지가 나타나지 않게 해준다 |
@SafeVarargs | 지네릭스타입의 가변인자에 사용한다 |
@FunctionalInterface | 함수형 인터페이스라는 것을 알린다 |
@Native | native메소드에서 참조되는 상수 앞에 붙인다 |
@Target | 애노테이션이 적용가능한 대상을 지정하는데 사용한다 |
@Documented | 애노테이션 정보가 javadoc으로 작성된 문서에 포함되게한다. |
@Inherited | 애노테이션이 자손클래스에 상속되도록한다. |
@Retention | 애노테이션이 유지되는 범위를 지정하는데 사용한다 |
@Repeatable | 애노테이션을 반복해서 적용할 수 있게 한다. |
이 중 Target, Documented, Inherited, Retention, Repeatable 은 메타 애노테이션이다.
# @Retention
애노테이션이 유지(retention)되는 기간을 지정하는데 사용된다. 애노테이션의 유지정책 종류는 3개가 있다.
SOURCE - 소스 파일에만 존재. 클래스파일에는 존재하지 않음
CLASS - 클래스 파일에 존재, 실행시에 사용불가 기본값을 가짐
RUNTIME - 클래스 파일에 존재, 실행시에 사용가능
@Override 처럼 컴파일러가 사용하는 애노테이션은 유지 정책이 SOURCE 이다. 컴파일러를 직접 작성할 것이 아니면, 이 유지정책은 필요없다.
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override{}
유지정책을 RUNTIME 으로 하면, 실행시에 리플렉션을 통해 클래스 파일에 저장된 애노테이션의 정보를 읽어서 처리해 줄 수 있다. 예를 들면 @FunctionalInterface가 있다.
@Documented
@Retentnion(RetentionPolicy.RUNTUME)
@Target(ElementType.TYPE)
public @interface FunctionalInterface {}
# @Target
애노테이션이 적용가능한 대상을 지정하는데 사용된다.
@Target으로 지정할 수 있는 애노테이션 적용대상의 종류는 여러가지가 있다.
ANNOTATION_TYPE | 애노테이션 |
CONSTRUCTOR | 생성자 |
FIELD | 필드(멤버변수,enum상수) |
LOCAL_VARIABLE | 지역변수 |
METHOD | 메소드 |
PACKAGE | 패키지 |
PARAMETER | 매개변수 |
TYPE | 타입 |
TYPE_PARAMETER | 타입매개변수 |
TYPE_USE | 타입이사용되는곳 |
#@Documented
애노테이션 정보가 javadoc으로 작성한 문서에 포함되도록 한다.
자바에서 제공하는 기본 애노테이션 중에 @Override와 @SuppressWarnings를 제외하고모두 이 메타 애노테이션이 붙어 있다.
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface FunctionalInterface{}
'Language > Java & Kotlin' 카테고리의 다른 글
[자바/Java] 제네릭이란? (0) | 2021.02.27 |
---|---|
[자바/Java] I/O(Input/Output)이란? (0) | 2021.02.22 |
[자바/Java] 열거형(enum) 이란? (0) | 2021.01.30 |
[자바/Java] 예외처리란? (0) | 2021.01.15 |
[자바/Java] 인터페이스(Interface)란? (0) | 2021.01.08 |