JAVA (18) - 애노테이션 기초
JAVA (18) - 애노테이션 기초
1. 개요
애노테이션(Annotation)은 자바 5부터 도입된 기능으로, 코드에 대한 추가적인 정보(메타데이터, Metadata)를 제공하는 주석 형태의 표식이다. 기존의 주석이 사람을 위한 설명이었다면, 애노테이션은 컴파일러나 런타임 프레임워크가 코드를 어떻게 처리할지 알려주는 역할을 한다. 비즈니스 로직에 직접 영향을 주지는 않지만, 코드의 가독성을 높이고 반복되는 설정을 획기적으로 줄여 준다.
2. 애노테이션의 개념과 역할
애노테이션은 @ 기호를 사용하여 클래스, 메서드, 필드, 매개변수 등에 붙여 작성한다. 주요 역할은 크게 세 가지로 나뉜다.
- 컴파일러 정보 제공: 에러를 체크하거나 경고를 억제하는 등 컴파일 시점에 정보를 활용한다. (예:
@Override) - 빌드 및 배포 시 자동 생성: 개발 도구가 코드, XML 파일, 도큐먼트 등을 자동으로 생성하도록 돕는다.
- 런타임 처리: 런타임 시점에 리플렉션(Reflection)을 통해 애노테이션 정보를 읽어와 해당 코드에 맞는 동작을 수행한다. (예: Spring Framework의
@Autowired,@Controller등)
3. 자바 표준 애노테이션
자바 언어 자체에서 기본으로 제공하는 대표적인 표준 애노테이션은 다음과 같다.
@Override: 메서드가 상위 클래스나 인터페이스의 메서드를 오버라이딩했음을 컴파일러에게 명시한다. 오타나 매개변수 불일치 등의 실수를 컴파일 시점에 잡아준다.@Deprecated: 더 이상 사용을 권장하지 않는 대상에 붙인다. 사용 시 컴파일 경고가 발생한다.@SuppressWarnings: 컴파일러의 특정 경고 메시지를 나타나지 않도록 억제한다. (예:@SuppressWarnings("unchecked"))@FunctionalInterface: 함수형 인터페이스임을 컴파일러에게 검증받는다. 추상 메서드가 1개가 아닐 경우 컴파일 에러를 발생시킨다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Parent {
public void print() {
System.out.println("Parent");
}
}
public class Child extends Parent {
@Override // 상위 메서드 재정의 검증
public void print() {
System.out.println("Child");
}
@Deprecated // 더 이상 사용을 권장하지 않음
public void oldMethod() {
System.out.println("Old version");
}
}
4. 메타 애노테이션 (Meta-Annotation)
메타 애노테이션은 애노테이션을 정의할 때 사용하는 애노테이션으로, 적용 대상이나 유효 기간 등을 지정할 때 쓰인다.
@Target: 애노테이션이 적용될 위치(클래스, 메서드, 필드, 매개변수 등)를 지정한다.@Retention: 애노테이션의 유효 범위(생명주기)를 결정한다.SOURCE: 소스 코드에만 존재하고 컴파일 시 클래스 파일에서 제거된다.CLASS: 클래스 파일까지 남아있지만 런타임에는 참조할 수 없다. (기본값)RUNTIME: 런타임까지 유지되어 리플렉션을 통해 애노테이션 정보를 읽을 수 있다.@Documented: Javadoc 문서에 해당 애노테이션 정보가 포함되도록 한다.@Inherited: 자식 클래스가 부모 클래스의 애노테이션을 상속받도록 설정한다.
5. 커스텀 애노테이션 정의
개발자가 직접 필요한 애노테이션을 선언하여 사용할 수 있다. @interface 키워드를 사용하여 정의한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
// 적용 대상: 메서드, 유효 기간: 런타임
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String value() default "기본값"; // 속성 정의 (기본값 지정 가능)
int number() default 1;
}
이렇게 정의된 사용자 정의 애노테이션은 런타임 시점에 리플렉션 API를 활용하여 적용 유무를 판별하고 원하는 로직을 실행하도록 구현할 수 있다.
6. 정리
애노테이션은 코드에 메타데이터를 부여하여 컴파일러 검증부터 런타임 프레임워크 동작까지 다양하게 활용되는 자바의 핵심 요소다. 표준 애노테이션을 통해 코딩 실수를 줄이고, 메타 애노테이션과 사용자 정의 애노테이션을 조합하여 프레임워크 수준의 유연한 구조를 설계할 수 있다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.