어노테이션(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) |
어노테이션 정의하는 방법
어노테이션을 정의해서 사용하는 일반적인 순서는 다음과 같습니다.
- 어노테이션 정의
- 클래스에 어노테이션을 배치
- 코드가 실행되는 중에 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 |