Java

Java 어노테이션

asd135 2025. 4. 6. 20:15
728x90

어노테이션을 사용하는 이유

어노테이션은 클래스, 메서드, 필드, 매개변수 등 다양한 요소에 추가 정보를 부여하여, 프로그램의 동작이나 구조를 설명하는 데 사용된다.

 

1. 코드에 메타데이터를 추가

2. 코드의 가독성을 항샹

3. 프레임워크에서는 설정을 간소화하는 기능 

 

어노테이션 정의

1. 어노테이션은 인터페이스 형태로 정의해야하며 클래스나 추상 클래스로 정의 할 수 없다.

2. 어노테이션의 속성은 메서드의 형태로 정의할 수 있지만 메서드는 구현 할 수 없다. 어노테이션은 메타데이터를 제공하는 것이기 때문에, 속성은 이름과 타입만 정의되고 실제 구현은 필요하지 않다.

3. 속성의 타입으로는 원시 타입, String, Class, enum, 다른 어노테이션, 배열 등으로 정의할 수 있다.

import java.lang.annotation.ElementType; // 어노테이션이 적용될 수 있는 대상을 정의하는 열거형
import java.lang.annotation.Retention; // 어노테이션의 유지 정책을 정의하는 어노테이션
import java.lang.annotation.RetentionPolicy; // 유지 정책을 정의하는 열거형
import java.lang.annotation.Target; // 어노테이션의 적용 대상을 지정하는 어노테이션

// 어노테이션 정의
@Retention(RetentionPolicy.RUNTIME) // 런타임 동안 어노테이션 정보를 유지
@Target({ElementType.METHOD, ElementType.TYPE}) // 메서드와 클래스에 적용 가능
public @interface MyAnnotation {
    String value(); // 속성 정의 (구현 없음)
    int count() default 1; // 기본값을 가진 속성 정의 (구현 없음)
}

소스 코드가 컴파일되면 어노테이션은 바이트코드로 변환되어 .class 파일에 저장

import java.lang.reflect.Method;

@MyAnnotation(value = "어노테이션", count = 5)
public class Main {

    @MyAnnotation(value = "Example Method", count = 111)
    public void exampleMethod() {
        System.out.println("aa");
    }

    public static void main(String[] args) {
        // 클래스에 적용된 어노테이션 정보 출력
        Class<Main> obj = Main.class;
        if (obj.isAnnotationPresent(MyAnnotation.class)) {
            MyAnnotation annotation = obj.getAnnotation(MyAnnotation.class);
            System.out.println("Class Annotation: value = " + annotation.value() + ", count = " + annotation.count());
        }
        // 메서드에 적용된 어노테이션 정보 출력
        try {
            Method method = obj.getMethod("exampleMethod");
            if (method.isAnnotationPresent(MyAnnotation.class)) {
                MyAnnotation methodAnnotation = method.getAnnotation(MyAnnotation.class);
                System.out.println("Method Annotation: value = " + methodAnnotation.value() + ", count = " + methodAnnotation.count());
            }
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
        // 메서드 호출
        Main example = new Main();
        example.exampleMethod();
    }

}