반응형
개요
annotation이란 컴파일러, JVM, 프레임워크 등이 보는 주석이다.
소스코드에 메타 데이터를 삽입하는 형태로 나타낸다.
코드에 대한 정보를 추가하여 소스 코드의 구조 변경, 환경 설정 정보 추가 등의 작업을 진행한다.
🔍 자바 어노테이션(Annotation)이란?
- 어노테이션은 코드에 추가적인 메타데이터를 제공하는 데 사용
- 컴파일러에게 정보 제공, 런타임 처리, 코드 분석 도구 및 프레임워크에서 활용
- 주석처럼 사용하지만, 프로그램 동작에 직접적인 영향을 미칠 수 있음
주요 자바 내장 어노테이션
어노테이션 | 설명 | 사용 대상 |
@Override | 메서드가 상위 클래스의 메서드를 오버라이드함을 명시 | 메서드 |
@Deprecated | 해당 메서드/클래스가 더 이상 사용되지 않음을 알림 | 클래스, 메서드 |
@SuppressWarnings | 컴파일 경고를 무시함 | 클래스, 메서드 |
@SafeVarargs | 가변 인자에서의 타입 안정성 보장 | 생성자, 메서드 |
@FunctionalInterface | 해당 인터페이스가 함수형 인터페이스임을 명시 | 인터페이스 |
@Retention | 어노테이션의 유지 정책 설정 | 어노테이션 |
@Target | 어노테이션의 적용 위치 설정 | 어노테이션 |
@Inherited | 상위 클래스의 어노테이션을 하위 클래스에 상속 | 클래스 |
@Documented | Javadoc 문서에 어노테이션 정보 포함 | 어노테이션 |
어노테이션 기본 사용법
이전에 오버라이딩 관련하여 다룬 자료를 보면 @Override 라고 명시해 준 적이 있을 것이다.
이와 같이 마치 사용자가 주석을 쓰듯 컴파일러에게 알리듯 주석처럼 사용해 주면 된다.
1. @Override 사용 예시
@Override
public String toString() {
return "Hello";
}
@Override : 메서드가 상위 클래스의 메서드를 오버라이드했음을 명시
2. @Deprecated 사용 예시
class OldAPI {
@Deprecated
public void oldMethod() {
System.out.println("This method is deprecated.");
}
}
- oldMethod()는 더 이상 사용되지 않음을 나타낸다.
- IDE에서 경고를 표시한다.
3. @SuppressWarnings 사용 예시
@SuppressWarnings("unchecked")
public void uncheckedMethod() {
ArrayList list = new ArrayList();
list.add("Hello");
}
비검사 형변환 관련 경고를 무시한다.
메타 어노테이션
메타 어노테이션은 어노테이션을 정의하는 어노테이션이다.
어노테이션 자체를 구성할 때 사용되며, 이를 통해 커스텀 어노테이션을 생성할 수 있다.
어노테이션 | 설명 |
@Retention | 어노테이션의 유지 기간 설정 (CLASS, RUNTIME, SOURCE) |
@Target | 어노테이션의 적용 대상 설정 |
@Inherited | 상속 가능한 어노테이션을 정의 |
@Documented | Javadoc 문서에 어노테이션 정보 포함 |
🔄 Retention 정책 종류
정책 | 설명 |
SOURCE | 컴파일 시 제거, 바이트코드에 포함되지 않음 |
CLASS | 컴파일러가 클래스 파일에 유지, 런타임에는 사라짐 |
RUNTIME | 런타임까지 유지, 리플렉션으로 조회 가능 |
커스텀 어노테이션 만들기
import java.lang.annotation.*;
import java.lang.reflect.Method;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@interface MyAnnotation {
String value();
int count() default 1;
}
class Example {
@MyAnnotation(value = "Hello", count = 3)
public void myMethod() {
System.out.println("My Method");
}
}
public class Main {
public static void main(String[] args) throws Exception {
Method method = Example.class.getMethod("myMethod");
if (method.isAnnotationPresent(MyAnnotation.class)) {
MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
System.out.println("Value: " + annotation.value());
System.out.println("Count: " + annotation.count());
}
}
}
- @Retention(RetentionPolicy.RUNTIME) : 런타임까지 어노테이션이 유지됨.
- @Target(ElementType.METHOD) : 메서드에만 적용 가능.
- 런타임에 리플렉션(Reflection)을 통해 어노테이션 정보를 읽을 수 있다.
- isAnnotationPresent()를 통해 어노테이션 존재 여부를 확인한다.
- getAnnotation()을 통해 어노테이션 객체를 가져온다.
- 어노테이션 값(value, count)을 읽어 출력한다.
728x90
반응형
'웹(WEB) > 자바(Java)' 카테고리의 다른 글
[Java] 자바 람다 Lambda (0) | 2024.12.31 |
---|---|
[Java] 자바 자료구조, Collection (0) | 2024.12.31 |
[Java] 자바 Enum (0) | 2024.12.31 |
[Java] 자바 Generics (0) | 2024.12.30 |
[Java] 자바 인터페이스 (0) | 2024.12.30 |