🍎 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
    1. SOURCE (=그냥 주석)
      소스파일에만 존재하는 어노테이션. 컴파일 타임에 컴파일러에 의해 삭제 됨.
    2. CLASS
      클래스파일에는 존재하지만, 실질적으로 런타임까지 유지되진 않음.
    3. RUNTIME
      클래스 파일에 존재하며, 런타임의 종료 시점까지 메모리가 유지 됨.
  • @Documented
    • 어노테이션에 대한 정보가 javadoc으로 작성한 문서에 포함 되도록 할 때 사용하는 어노테이션. Built-in Annotation  @Override와 @SuppressWarnings를 제외하고는 모두 이 어노테이션이 붙어있다.
  • @Inherited
    • 어노테이션을 자식 클래스에게도 붙이기 위해(상속) 사용하는 어노테이션. 이 어노테이션을 수퍼클래스에 붙이면 서브 클래스에서도 이 어노테이션이 붙은 것과 같이 인식된다.
  • @Native
    • 네이티브 메소드에 의해 참조되는 상수 필드에 붙이는 어노테이션.