어노테이션
어노테이션(Annotation)은 자바 소스 코드에 메타 데이터(Metadata)를 추가하는 기능이다. 즉 코드 자체의 의미를 설명하는 정보를 말한다.
-
본질: 코드의 실행 로직에는 영향을 주지 않으면서, JVM이 해당 코드를 어떻게 처리해야 하는지에 대한 부가 정보를 제공한다.
-
표기:
@기호를 사용하여 클래스, 메소드, 필드, 매개 변수 등에 부착한다.
어노테이션 목적 및 기능
어노테이션은 과거 XML 설정 파일로 관리되던 부가 정보를 코드 내부로 가져와 선언형 프로그래밍을 가능하게 한다.
-
컴파일러 경고 제어:
@Override나@SuppressWarnings처럼 컴파일러에게 특정 코드의 오버라이딩 여부를 확인하게 하거나, 특정 경고를 무시하도록 지원한다. -
빌드 및 배포 정보:
@Deprecated와 같이 문서화 도구(Javadoc)가 코드를 인식하고 문서를 생성하는데 필요한 정보를 제공한다. -
런타임 처리: 실행 시점에 리플렉션(Reflection) 기능을 이용하여 어노테이션 정보를 추출하고, 그 정보를 바탕으로 프레임워크가 동적으로 동작을 결정하게 한다.
표준 어노테이션
표준 어노테이션(Built-In Annotation)은자바에서 기본으로 제공하는 어노테이션으로, 주로 컴파일러의 동작을 제어한다.
| 어노테이션 | 대상 | 목적 |
|---|---|---|
| @Override | 메소드 | 상위 클래스나 인터페이스의 메소드를 재정의했음을 컴파일러에게 알린다. |
| @Deprecated | 클래스, 메소드, 필드 | 해당 요소가 더 이상 사용되지 않음을 표시하고, 사용 시 컴파일러 경고를 발생시켜 사용자에게 대체 수단을 알린다. |
| @SupressWarnings | 모든 선언부 | 컴파일러에 특정 경고를 무시하도록 지시한다. |
| @FunctionalInterface | 인터페이스 | 인터페이스가 함수형 인터페이스 조건을 만족하는지 확인한다. |
메타 어노테이션
메타 어노테이션(Meta Annotations)은 사용자 어노테이션을 정의할 때 사용되는 어노테이션으로, 정의된 어노테이션이 언제(When), 어디서(Where), 어떻게(How) 동작할 지 설명한다.
| 어노테이션 | 대상 | 목적 |
|---|---|---|
| @Target | 어노테이션 | 어노테이션이 적용될 수 있는 위치를 지정한다. |
| @Retention | 어노테이션 | 어노테이션의 유지 시점을 지정한다. - SOURCE: 컴파일 시 버려진다. - CLASS: .class 파일에 남지만 런타임에는 사용이 불가능하다. - RUNTIME: .class 파일에 남아 런타임에 리플렉션으로 정보에 접근이 가능하다. |
| @Documented | 어노테이션 | 해당 어노테이션 정보가 Javadoc 문서에 포함되도록 지정한다. |
| @Inherited | 어노테이션 | 해당 어노테이션이 상속될 수 있도록 지정한다. |
사용자 정의 어노테이션
사용자가 직접 어노테이션을 정의할 때는 interface 키워드 앞에 @ 기호를 붙여 선언하며, 요소들은 메소드 형태로 정의한다.
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyCustomAnnotation {
String value() default "기본값"; // 어노테이션 요소 (String 타입, 기본값 설정)
int count() default 1; // 요소 추가
}
위의 예시처럼 @MyCustomAnnotation 어노테이션을 정의하면, 개발자는 원하는 메소드에 부착하여 런타임에 처리할 수 있다.
public class MyService {
@MyCustomAnnotation(value = "로그인 체크", count = 5)
public void checkUser() {
...
}
}