[자바/Java] 애노테이션(annotation)이란?

resilient

·

2021. 2. 17. 01:41

728x90
반응형

github.com/whiteship/live-study/issues/12

 

12주차 과제: 애노테이션 · Issue #12 · whiteship/live-study

목표 자바의 애노테이션에 대해 학습하세요. 학습할 것 (필수) 애노테이션 정의하는 방법 @retention @target @documented 애노테이션 프로세서 마감일시 2021년 2월 6일 토요일 오후 1시까지.

github.com

목표

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

학습할 것 (필수)


#애노테이션이란?

 

자바를 개발 할때 소스코드에 대한 문서를 따로 만들기보다 소스코드와 문서를 하나의 파일로 관리하는 것이 낫다고 생각한 개발자들이 소스코드의 주석에 소스코드에 대한 정보를 저장하고 소스코드의 주석으로부터 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{}

 

반응형