Java annotation(1) - 어노테이션이란?
목차
Annotation?
자바 어노테이션은 자바 코드에 메타 데이터를 제공하기 위해 사용됩니다.
@ 문자와 어노테이션 이름으로 구성이 되며, 컴파일러에서는 @ 문자로 시작이 되면 어노테이션으로 판단을 합니다.
어노테이션은 값을 저장할 수 있는 엘레멘트를 가지며, 어노테이션 이름 다음에 괄호 안에 엘레멘트를 정의합니다.
@Entity(name = "table")
위의 어노테이션은 Entity라는 이름의 어노테이션이고 name이라는 엘레멘트를 가지며 name 엘레멘트의 값은 table입니다.
어노테이션은 클래스, 인터페이스, 메소드, 메소드 파라메터, 필드, 지역 변수 위에 위치할 수 있습니다.
@Entity
public class Animal {
}
Built-in Java Annotations
Java의 내장형 어노테이션에 대해 알아보겠습니다.
@Deprecated
클래스, 메소드, 필드가 deprecated 되었음을 알릴 때 사용합니다.
deprecated code를 사용하면 컴파일러에서는 warning을 표시합니다.
어노테이션을 사용할 때, @deprecated JavaDoc symbol을 사용하여, 왜 deprecated 되었는지
대신에 무엇을 사용해야 하는지 작성하는 것이 좋습니다.
@Deprecated
/**
@deprecated Use MyNewComponent instead.
*/
public class MyComponent {
}
@Override
부모 클래스의 메소드를 오버라이드 할 때 사용합니다.
오버라이드 할 때, 필수로 어노테이션을 사용해야 하는 것은 아니지만, 오버라이드 하고 있다는 것을 알려주기에 사용합니다.
@SuppressWarnings
메소드에 사용하며, 사용한 메소드에 워닝을 컴파일러에서 표시하지 않도록 합니다.
deprecated 된 코드를 사용할 때 워닝이 생기지 않게 사용할 수 있습니다.
외에도 @SafeVarargs, @FunctionalInterface, @Naitve 내장형 어노테이션이 있습니다.
Meta-Annotation
다른 어노테이션에 적용을 할 수 있는 어노테이션을 메타 어노테이션이라고 합니다.
@Inherited
자식 클래스에 부모 클래스의 어노테이션을 가지도록 하기 위해(propagate) 사용하는 어노테이션입니다.
DerivedClass는 BaseClass에 선언된 @InheritedAnnotation이 적용됩니다.
@Inherited
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface InheritedAnnotation {
}
@InheritedAnnotation
public class BaseClass {
}
public class DerivedClass extends BaseClass {
}
@Documented
Javadocs에 어노테이션의 사용을 문서화해주게 하는 어노테이션입니다.
( Javadocs은 Default로 사용하는 어노테이션에 대해서는 문서화해주지 않습니다. )
아래처럼 ExcelCell이라는 어노테이션에 @Documented를 선언하면,
Javadocs에 Exployee 클래스에서 ExcelCell이라는 어노테이션을 사용한다고 문서화해줍니다.
@Documented
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ExcelCell {
int value();
}
public class Employee {
@ExcelCell(0)
public String name;
}
@Repeatable
엘레멘트에 어노테이션을 반속 사용할 때 사용하는 어노테이션입니다.
어노테이션 엘레멘트에 Schedules 클래스를 지정하고, Schedules 클래스에는 컨테이너를 선언해두면
Schedule 어노테이션은 Schedules 어노테이션의 배열 엘레멘트에 저장이 가능해 Schedule 어노테이션의 반복 사용이 가능해집니다.
public @interface Schedules {
Schedule[] value();
}
@Repeatable(Schedules.class)
public @interface Schedule {
String time() default "09:00";
}
@Schedule
@Schedule(time = "15:05")
@Schedule(time = "23:00")
void scheduledAlarm() {
}
이 외에 @Target, @Retention 메타 어노테이션도 있는데 이 어노테이션은 커스텀 어노테이션 관련 글에서 설명을 하겠습니다.