🍎 Backend/JAVA
[JAVA] 어노테이션(Annotation)
밈98
2025. 1. 9. 21:08
📚 어노테이션이란?
코드에서 @로 작성되는 요소를 어노테이션(Annotation)이라고 한다. 어노테이션은 클래스 또는 인터페이스를 컴파일하거나 실행할때 어떻게 처리해야하는 지를 알려주는 설정 정보이다.
어노테이션은 코드에 추가적인 메타데이터를 제공하여, 개발자가 명시적으로 로직을 정의하지 않아도 프레임워크나 라이브러리가 이 메타데이터를 기반으로 동작을 수행할 수 있도록 한다.
또한, 어노테이션은 직접적으로 실행되는 코드가 아니기 때문에, 이를 기반으로 동작을 수행하려면 리플렉션을 통해 어노테이션 정보를 읽어와야 한다.
- 리플랙션이란?
- 자바의 런타임에 클래스, 메서드, 필드, 어노테이션의 정보를 동적으로 조회하고 조작할 수 있는 기술이다.
@Retention(RetentionPolicy.RUNTIME) // 런타임에 어노테이션 유지
public @interface MyAnnotation {
String value();
}
// 어노테이션 사용
@MyAnnotation("Reflection Example")
public class MyClass {
// 클래스에 어노테이션 적용
}
이처럼 정의한 어노테이션의 정보를 읽어오려면 리플랙션 기술이 필요하다.
밑의 코드는 리플랙션으로 MyClass의 어노테이션 정보를 읽는 코드이다.
import java.lang.annotation.Annotation;
public class AnnotationReflectionExample {
public static void main(String[] args) {
// 클래스 객체 가져오기
Class<MyClass> clazz = MyClass.class;
// 클래스에 선언된 어노테이션 확인
if (clazz.isAnnotationPresent(MyAnnotation.class)) {
// 어노테이션 가져오기
MyAnnotation annotation = clazz.getAnnotation(MyAnnotation.class);
// 어노테이션 값 출력
System.out.println("Annotation value: " + annotation.value());
} else {
System.out.println("No MyAnnotation present.");
}
}
}
출력결과 :
Annotation value: Reflection Example
📚 표준 어노테이션
자바에서 기본적으로 제공하는 어노테이션이다.
- @Override
- 컴파일러에게 메서드를 오버라이딩하는 것이라고 알린다.
- @Deprecated
- 앞으로 사용하지 않을 대상임을 알린다.
- @FunctionalInterface
- 함수형 인터페이스라는 것을 알린다.
- @SuppressWarning
- 컴파일러가 경고 메시지를 나타내지 않는다.
- @SafeVaragrs
- 제네릭과 같은 가변 인자의 매개변수를 사용할 때의 경고를 나타내지 않는다.
📚 메타 어노테이션이란?
어노테이션의 어노테이션으로 어노테이션을 정의할 때 어노테이션의 적용대상(target)이나 유지기간(retension)을 지정하는데 사용한다
- @Target
- 어노테이션이 적용 가능한 대상을 지정하는데 사용. 여러 대상을 지정해야 할 때 { }로 묶어서 사용.
- @Retention
- SOURCE
(=그냥 주석)
소스파일에만 존재하는 어노테이션. 컴파일 타임에 컴파일러에 의해 삭제 됨. - CLASS
클래스파일에는 존재하지만, 실질적으로 런타임까지 유지되진 않음. - RUNTIME
클래스 파일에 존재하며, 런타임의 종료 시점까지 메모리가 유지 됨.
- SOURCE
- @Documented
- 어노테이션에 대한 정보가 javadoc으로 작성한 문서에 포함 되도록 할 때 사용하는 어노테이션. Built-in Annotation 중 @Override와 @SuppressWarnings를 제외하고는 모두 이 어노테이션이 붙어있다.
- @Inherited
- 어노테이션을 자식 클래스에게도 붙이기 위해(상속) 사용하는 어노테이션. 이 어노테이션을 수퍼클래스에 붙이면 서브 클래스에서도 이 어노테이션이 붙은 것과 같이 인식된다.
- @Native
- 네이티브 메소드에 의해 참조되는 상수 필드에 붙이는 어노테이션.