
어노테이션 (annotation)은 주석이나 메타데이터를 의미한다. 주로 코드에 추가적인 정보나 기능을 부여할 때 사용 한다.
다른 프로그램에게 유용한 정보를 제공하기 위해 사용되는 것으로 주석과 같은 의미를 가진다.
어노테이션의 종류는 크게 3가지로 구분된다.
표준 어노테이션은 Java에서 자주 사용되는 어노테이션들로, JDK에 기본적으로 제공되는 어노테이션이다. 주로 컴파일러에 정보 제공이나 코드 품질 개선을 위해 사용된다.
@Override
// 설명 : 부모 클래스의 메서드를 재정의 한다는 것을 명시한다.
// 용도 : 컴파일러가 해당 메서드가 부모 클래스에 존재하는지 검사하도록 도와준다.
//예시 코드
class Parent {
void display() {
System.out.println("부모 클래스 메서드");
}
}
class Child extends Parent {
@Override
void display() { // 부모의 메서드를 재정의
System.out.println("자식 클래스 메서드");
}
}
@ FunctionalInterface
// 설명 : 인터페이스가 함수형 인터페이스임을 명시한다.
// 용도 : 함수형 프로그래밍에서 람다식을 사용할 수 있도록 보장한다.
// 조건 : 단 하나의 추상 메서드만 존재해야 한다.
//예시 코드
@FunctionalInterface
interface MyFunctionalInterface {
void myMethod();
}
@Documented
// 설명 : 어노테이션이 Javadoc에 포함되도록 표시한다.
// 용도 : API 문서에 어노테이션 정보가 나타나도록 할 때 사용한다.
//예시 코드
@Documented
@interface MyAnnotation {
String value();
}
@Ingerited
// 설명 : 어노테이션이 상속될 수 있도록 명시한다.
// 용도 : 부모 클래스에 선언된 어노테이션이 자식 클래스에 자동으로 적용되도록 한다.
//예시 코드
@Inherited
@interface MyAnnotation {}
@MyAnnotation
class Parent {}
class Child extends Parent {} // 자동으로 MyAnnotation 적용
메타 어노테이션은 어노테이션을 위한 어노테이션이다. 즉, 어노테이션을 정의하거나 설정할 때 사용하는 어노테이션이다. 메타 어노테이션은 Java 표준 어노테이션 중 일부로 제공되며, 어노테이션의 동작 방식과 범위를 제어한다.
@Target
// 설명 : 어노테이션을 적용할 대상(타겟)을 지정한다.
// 용도 : 어노테이션이 클래스, 메서드, 필드 등 어디에 적용될 수 있는지 명시한다.
// 사용 가능한 대상들
//ElementType.TYPE : 클래스, 인터페이스 열거형
//ElementType.METHOD : 메서드
//ElementType.FIELD : 필드
//ElementType.PARAMETER : 파라미터
//ElementType.CONSTRUCTOR : 생성자
//ElementType.LOCAL_VARIABLE : 지역 변수
//ElementType.ANNOTATION_TYPE : 다른 어노테이션
//ElementType.PACKAGER : 패키지
//예시 코드
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
@Target({ElementType.METHOD, ElementType.FIELD})
@interface MyAnnotation {}
@Retention
// 설명 : 어노테이션의 유지 정책을 지정한다.
// 용도 : 어노테이션이 어느 시점까지 유지되는지 설정한다.
//RetentionPolicy 옵션
// SOURCE : 컴파일시 삭제됨. (컴파일러만 사용)
// CLASS : 클래스 파일에 남아있지만, 런타임에는 읽히지 않음.
// RUNTIEM : 런타임 시에도 유지되며 리플렉션을 통해 읽을 수 있음.
//예시 코드
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation {}
@Inherited
// 설명 : 어노테이션이 상속될 수 있도록 설정한다.
// 용도 : 부모클래스의 어노테이션이 자식 클래스에 자동으로 적용되도록 한다.
// 제한 : 클래스에만 적용되며 메서드나 필드에는 적용되지 않는다.
//예시 코드
import java.lang.annotation.Inherited;
@Inherited
@interface MyAnnotation {}
@MyAnnotation
class Parent {}
class Child extends Parent {}
@Documented
// 설명 : 어노테이션이 Javadoc 문서에 포함되도록 설정한다.
// 용도 : API 문서에 어노테이션 정보를 노출시키고 싶을 때 사용한다.
//예시 코드
import java.lang.annotation.Documented;
@Documented
@interface MyAnnotation {
String value();
}
@Repeatable
// 설명 : 어노테이션을 반복해서 사용할 수 있도록 설정한다.
// 용도 : 같은 어노테이션을 여러 번 작용할 수 있게 해준다.
// 주의 : 반복될 어노테이션을 담을 컨테이너 어노테이션을 따로 정의해야 한다.
//예시 코드
import java.lang.annotation.Repeatable;
@Repeatable(Schedules.class)
@interface Schedule {
String day();
}
@interface Schedules {
Schedule[] value();
}
@Schedule(day = "Monday")
@Schedule(day = "Tuesday")
class MyClass {}
사용자 어노테이션은 사용자가 직접 정의하는 것이다.