애너테이션 (Annotation)
애너테이션(Annotation)은 프로그램의 소스 코드 안에 다른 프로그램을 위한 정보를 미리 약속된 형식으로 포함시킨 것입니다. 보통 프로그램 실행에 영향을 주지 않고, 컴파일러나 특정 프레임워크가 코드를 분석하거나 런타임에 처리할 수 있도록 힌트를 제공합니다.
기본적으로 주석(// 또는 /* */)과 동일하게 동작하지만, 애너테이션은 기계(컴파일러 등)도 읽고 처리할 수 있다는 차이점이 있습니다.
1. 표준 애너테이션
자바에서 기본적으로 제공하는 대표적인 표준 애너테이션은 다음과 같습니다:
@Override: 컴파일러에게 오버라이딩하는 메서드라는 것을 알립니다. 오타가 있거나 부모 클래스에 동일한 서명의 메서드가 없다면 컴파일 에러를 발생시킵니다.@Deprecated: 앞으로 사용하지 않을 것을 권장하는 필드나 메서드에 붙입니다. 이를 사용할 경우 컴파일러가 경고를 발생시킵니다.@SuppressWarnings: 컴파일러의 특정 경고 메시지가 나타나지 않게 억제합니다.
class Parent {
public void printMessage() {
System.out.println("Hello");
}
}
class Child extends Parent {
@Override // 컴파일러에게 오버라이딩 메서드임을 명시
public void printMessage() {
System.out.println("Hello, Child!");
}
@Deprecated // 이제 더 이상 이 메서드의 사용을 권장하지 않음
public void oldMethod() {
System.out.println("Old method");
}
}
2. 메타 애너테이션 (Meta Annotations)
메타 애너테이션은 애너테이션을 위한 애너테이션 으로, 커스텀 애너테이션을 정의할 때 그 애너테이션의 적용 대상이나 유지 기간 등을 지정하는 데 사용됩니다.
@Target: 애너테이션이 적용될 수 있는 대상(클래스, 메서드, 필드 등)을 지정합니다.@Retention: 애너테이션이 유지되는 기간을 지정합니다 (SOURCE,CLASS,RUNTIME).@Documented: 애너테이션에 대한 정보가 javadoc으로 작성된 문서에 포함되도록 합니다.@Inherited: 애너테이션이 자손 클래스에 상속되도록 합니다.
3. 커스텀 애너테이션 만들기
개발자가 직접 애너테이션을 만들어 프레임워크(예: Spring 등)나 Reflection API와 결합해 특정한 동작을 하도록 만들 수 있습니다.
import java.lang.annotation.*;
@Target({ElementType.METHOD, ElementType.TYPE}) // 클래스와 메서드에 적용 가능
@Retention(RetentionPolicy.RUNTIME) // 런타임까지 애너테이션 유지
public @interface MyCustomAnnotation {
String value() default "Default Value"; // 기본값을 갖는 요소
int count() default 1;
}
애너테이션의 활용법 (리플렉션)
이렇게 만든 애너테이션은 리플렉션(Reflection)을 통해 런타임에 정보를 읽어올 수 있습니다.
@MyCustomAnnotation(value = "테스트 클래스", count = 5)
public class AnnotationTest {
public static void main(String[] args) {
// AnnotationTest 클래스에 적용된 MyCustomAnnotation 정보를 가져옴
MyCustomAnnotation anno = AnnotationTest.class.getAnnotation(MyCustomAnnotation.class);
System.out.println("Value: " + anno.value()); // 테스트 클래스
System.out.println("Count: " + anno.count()); // 5
}
}
스프링 프레임워크나 JPA 등 현대 자바 기술 스택의 핵심 기반이 바로 이 애너테이션 기능입니다!