Java 어노테이션의 개념과 커스텀 어노테이션 정의 방법

Java 프로그래밍을 하다 보면 메서드 상단이나 클래스 선언부에 @Override와 같은 표식을 자주 접하게 됩니다. 이를 어노테이션(Annotation)이라고 하며, 프로그램 코드의 일부로 간주되지는 않지만 컴파일러나 런타임 환경에 중요한 정보를 전달하는 역할을 합니다.

1. 어노테이션의 정의와 특징

어노테이션은 Java 5.0부터 도입된 메타데이터 메커니즘입니다. 일반적인 주석(Comment)이 개발자에게 정보를 전달하기 위한 목적이라면, 어노테이션은 개발자뿐만 아니라 프로그램(컴파일러, 프레임워크 등)이 읽고 해석할 수 있는 표식입니다.

  • 소스 코드의 구조를 변경하지 않으면서도 부가적인 정보를 제공합니다.
  • 컴파일 시점, 클래스 로딩 시점 또는 실행 시점(Runtime)에 리플렉션을 통해 읽힐 수 있습니다.
  • 코드의 가독성을 높이고 설정 파일(XML 등)의 의존도를 낮추는 데 기여합니다.
// 컴파일러에게 해당 메서드가 상위 클래스의 메서드를 재정의함을 알림
@Override
public String getDescription() {
    return "Custom Description";
}

만약 위 코드에서 메서드 이름을 getDescrptn()과 같이 잘못 작성하면, 컴파일러는 어노테이션 정보를 바탕으로 즉시 에러를 발생시켜 실수를 방지해 줍니다.

2. Java 표준 내장 어노테이션

Java JDK는 기본적으로 몇 가지 중요한 어노테이션을 제공합니다.

  • @Override: 메서드 재정의가 올바르게 이루어졌는지 검사합니다.
  • @Deprecated: 해당 요소가 더 이상 사용되지 않음을 나타냅니다. 사용 시 컴파일러가 경고를 발생시킵니다.
  • @SuppressWarnings: 컴파일러의 특정 경고 메시지가 나타나지 않도록 억제합니다. (예: @SuppressWarnings("unchecked"))

3. 메타 어노테이션 (Meta-Annotation)

메타 어노테이션은 '어노테이션을 위한 어노테이션'으로, 커스텀 어노테이션을 정의할 때 그 성격과 범위를 지정하기 위해 사용합니다.

  • @Target: 어노테이션이 적용될 대상(메서드, 클래스, 필드 등)을 정의합니다.
  • @Retention: 어노테이션의 유지 범위를 결정합니다.
    • SOURCE: 소스 코드까지만 유지 (컴파일 후 제거)
    • CLASS: 클래스 파일까지 유지 (런타임에는 미유지)
    • RUNTIME: 실행 시점까지 유지되어 리플렉션으로 접근 가능
  • @Documented: 해당 어노테이션 정보가 Javadoc 문서에 포함되도록 설정합니다.
  • @Inherited: 자식 클래스가 부모 클래스의 어노테이션을 상속받도록 설정합니다.

4. 커스텀 어노테이션 작성하기

어노테이션을 직접 정의할 때는 @interface 키워드를 사용합니다. 내부의 메서드들은 어노테이션의 파라미터 역할을 하며, 기본값을 설정할 수도 있습니다.

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

// 클래스와 메서드에 적용 가능하며 런타임까지 유지되도록 설정
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface DeveloperInfo {
    // 속성 정의: 타입 이름() [default 값];
    String author();
    int version() default 1;
    String[] tags() default {"Java", "Backend"};
    String lastModified() default "2023-10-27";
}

// 실제 적용 사례
@DeveloperInfo(author = "Alice", version = 2, tags = "Framework")
class DataService {
    @DeveloperInfo(author = "Bob")
    public void process() {
        // 비즈니스 로직
    }
}

커스텀 어노테이션 정의 시 주의사항은 다음과 같습니다.

  • 반환 타입은 기본 자료형, String, Class, Enum, 어노테이션 및 이들의 배열만 가능합니다.
  • 파라미터의 이름이 value 하나만 존재할 경우, 어노테이션 사용 시 이름을 생략하고 값만 전달할 수 있습니다.
  • 모든 요소에는 값이 할당되어야 하므로, default 값을 적극적으로 활용하는 것이 편리합니다.

태그: java Annotation Reflect metadata Programming-Concepts

6월 11일 22:00에 게시됨