본문 바로가기

JAVA 스터디

[JAVA] 어노테이션(Annotation)

어노테이션(Annotatio)이란

어노테이션은 사전적 의미로 주석을 뜻합니다.

자바에서 사용될 때의 어노테이션은 코드 사이에서 주석처럼 쓰여 특별한 의미, 기능을 수행하는 기술입니다.

즉, 어노테이션이란 자바 소스 코드에 추가하여 사용할 수 있는 메타데이터의 일종입니다.

보통 @ 기호를 앞에 붙여서 사용하고, JDK 1.5 버전 이상에서 사용 가능합니다.

 

메타데이터(meta data)
데이터에 관한 구조화된 데이터로, 다른 데이터를 설명해주는 데이터

 

어노테이션은 아래와 같은 용도로 사용됩니다.

  • 컴파일러에게 코드 문법 에러를 체크하도록 정보를 제공합니다.
  • 소프트웨어 개발툴이 빌드나 배치시 코드를 자동으로 생성할 수 있도록 정보를 제공합니다.
  • 실행 시(run time) 특정 기능을 실행하도록 정보를 제공합니다.

Java에서 기본적으로 제공하는 어노테이션들을 사용해도 되고, 개발자가 직접 정의해서 사용해도 됩니다.

 

Built-in Annotations

어노테이션 설명
@Override 컴파일러에게 오버라이딩 되는 메소드임을 알려줍니다.
@Deprecated 효율성 측면에서 해당 메소드를 더 이상 사용하지 않음을 의미합니다.
사용할 수는 있지만, 사용할 경우 컴파일 경고를 발생시킵니다.
@SupperessWarnings 선언한 곳의 컴파일 경고를 무시합니다.
- "deprecation" : @Deprecated 된 대상 사용 시에 발생하는 경고 무시
- "unchecked" : 제너릭 타입을 지정하지 않았을 때 발생하는 경고 무시
- "rawtypes" : raw 타입을 사용해서 발생하는 경고 무시
- "varargs" : 가변인자의 타입이 제너릭인 경우 발생하는 경고 무시(가변인자는 배열로 변환됩니다.)
대괄호([ ])로 여러개 지정할 수도 있습니다.
@SafeVarargs 메소드에 선언된 가변인자의 타입이 non-reifiable 타입인 경우 해당 메소드를 사용하는 코드에서 "unchecked"경고가 발생하는데 이를 무시합니다.(JDK1.7)
@FunctionalInterface 함수형 인터페이스를 선언할 때, 컴파일러가 이 인터페이스가 함수형 인터페이스로 선언가능한지 체크합니다.(추상메서드가 하나만 존재해야 한다는 제약)(JDK1.8)

 

Meta Annotations

어노테이션 설명
@Target 어노테이션이 적용될 위치를 선택합니다.
@Documented 어노테이션 정보가 javadoc으로 작성된 문서에 포함되도록 합니다.
@Inherited 어노테이션이 자손 클래스에 상속되도록 합니다.
@Retention 어노테이션이 유지되는 범위를 지정하는데 사용합니다.
@Repeatable 어노테이션을 반복해서 적용할 수 있게 합니다.(JDK1.8)

 

 

어노테이션 정의하는 방법

어노테이션을 정의해서 사용하는 일반적인 순서는 다음과 같습니다.

  1. 어노테이션 정의
  2. 클래스에 어노테이션을 배치
  3. 코드가 실행되는 중에 Reflection을 이용하여 추가정보를 획득하여 기능실시

어노테이션을 정의하는 기본형태는 다음과 같습니다.

 

@interface annotation이름 {
    Type 요소이름();
    ....
}

 

@기호를 사용하는 것만 제외하면 인터페이스를 정의하는 것과 동일합니다.

 

어노테이션의 요소

Java에서 어노테이션은 값을 세팅할 수 있는 요소들을 가질 수 있는데

속성이나 파라미터 정도로 이해하면 되겠습니다.

 

요소로는 기본형, String, 배열, Enum, 다른 어노테이션, 클래스 등이 사용될 수 있습니다.

 

반환값이 있고, 매개변수가 없는 추상 메소드의 형태로 작성하면 됩니다.

매개변수는 받을 수 없습니다.

 

기본값을 Type 속성명() default <기본값> 형태로 지정할 수 있으며,

어노테이션을 사용할 때 값이 지정되지 않은 경우 기본값이 사용됩니다.

 

어노테이션 요소가 하나뿐이고 이름이 value인 경우 어노테이션을 적용할 때,

value를 생략하고 값만 적어도 무방합니다.

 

배열타입 요소는 {} 를 사용해서 여러 개의 값을 전달해주면 됩니다.

어노테이션에는 예외를 선언할 수 없고, 제너릭 사용은 불가능합니다.

 

@Retention

@Retention은 어노테이션이 유지되는 기간을 지정하는 데에 사용됩니다.

  • RetentionPolicy.SOURCE : 소스코드까지만 유지(즉, 컴파일 과정에서 어노테이션 정보는 삭제)
  • RetentionPolicy.CLASS : 클래스파일까지만 유지(런타임시 해당 정보 삭제)
  • RetentionPolicy.RUNTIME : 런타임 중에도 JVM에 의해 계속 참조가 가능(리플렉션 이용)

SOURCE 유지정책은 컴파일러를 직접 작성하는 것이 아니면 사용할 일은 없습니다.

보통 @Override, @SuppressWarnings 같은 컴파일 시점에 컴파일러에 전달하는 정보의 경우 사용합니다.

@Target

Target은 어노테이션이 적용가능한 대상을 지정하는데 사용합니다.

적용가능한 대상은 다음과 같습니다.

 

대상 타입 의미
ANNOTATION_TYPE 애너테이션
CONSTRUCTOR 생성자
FIELD 필드(멤버변수, enum 상수)
LOCAL_VARIABLE 지역변수
METHOD 메소드
PACKAGE 패키지
PARAMETER 매개변수
TYPE 타입(클래스, 인터페이스, enum)
TYPE_PARAMETER 타입 매개변수(JDK1.8)
TYPE_USE 타입이 사용되는 모든 곳(JDK1.8)
@Target({FIELD, TYPE, TYPE_USE})
public @interface MyAnnotation {
    ...
}

 

위와 같은 식으로 정의해줄 수 있습니다.

 

@documented

어노테이션에 대한 정보가 javadoc 문서에 포함되도록 합니다.

아래는 그 예제입니다.

 

java.lang.annotation.Documented

@Documented
public @interface MyAnnotation {
    ...
}
@MyAnnotation
public class MySuperClass {
    ...
}

 

어노테이션 프로세서

'JAVA 스터디' 카테고리의 다른 글

[JAVA] I/O (Input/Output)  (0) 2021.08.12
[JAVA] 람다식(Lambda)  (0) 2021.08.06
[JAVA] Enum(열거형)  (0) 2021.07.09
[JAVA] 멀티쓰레드 프로그래밍(Multi Thread Programming)  (0) 2021.06.30
[JAVA] 예외처리(Exception)  (0) 2021.06.26