

Annotation 정리
JAVA
2024.11.25.
1. 어노테이션이란
어노테이션은 사전적으로는 “주석”이라는 의미를 가지고 있고, 메타데이터 라고 볼 수 있다.
메타데이터란 컴파일 과정과 실행 과정에서 코드를 어떻게 컴파일하고 처리할 것인지 알려주는 정보이다.
자바에서는 @을 이용해 주석처럼 달아 특수한 의미를 부여한다.
어노테이션은 다음 세가지 용도로 사용된다.
- 컴파일러에게 코드 문법 에러를 체크하도록 정보 제공 (ex - @Override)
- 소프트웨어 개발 툴이 빌드나 배치 시 코드를 자동으로 생성할 수 있도록 정보 제공
- 실행 시 특정 기능을 실행하도록 정보 제공
2. 어노테이션 종류
- 표준 어노테이션
- 자바에서 기본으로 제공하는 어노테이션
- 메타 어노테이션
- 다른 어노테이션에서도 사용되는 어노테이션을 말하며, custom annotation생성 시 주로 사용
3. 표준 어노테이션 종류
- @Override
- @Override 어노테이션은 메서드 앞에 오는 어노테이션
- 상위클래스의 메서드를 오버라이딩한다는 것을 컴파일러에게 알리는 역할
- @Deprecated
- @Deprecate 어노테이션은 새로운 버전의 JDK가 등장하여 더 이상 사용하지 않는 필드나 메서드가 있을 경우 사용
- 해당 메서드가 하위 버전의 호환성 문제로 삭제하기 곤란하여 남겨두어야만 할 때
- @SuppressWarning
- 컴파일 경고 메시지가 나타나지 않도록 한다.
- @FunctionalInterface
- 컴파일러가 함수형 인터페이스의 선언이 바르게 선언되었는지 확인
4. 메타 어노테이션
다음과 같이 인터페이스 정의
public @interface AnnotationName
어노테이션은 엘리먼트를 멤버로 가질 수 있다.
엘리먼트는 타입과 이름으로 구성되며, 디폴트 값을 가질 수 있다.
다음과 같이 작성
public @interface AnnotationName {
String value();
String elementName1();
int elementName2() default 5;
}
어노테이션 사용 시
@AnnotationName(value = "값", elementName1 = "이름")
@AnnotationName(value = "값", elementName1 = "이름", elementName2 = "이름2")
어노테이션은 기본 엘리먼트인 value를 가진다. 다음과 같이 작성 가능하다
@AnnotationName("값")
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
다음과 같이 @Interface를 사용해 어노테이션을 정의하며, 그 뒤에 사용 할 어노테이션 이름이 온다.
어노테이션 상단에 @Target과 @Retention어노테이션이 있는데 적용 대상과 유지기간을 지정해주는 역할을 한다.
@Target 어노테이션은 적용할 대상을 지정하는 데 사용한다.
| 인자 값 | 설명 |
|---|---|
| ElementType.TYPE | 클래스, 인터페이스, enum |
| ElementType.FIELD | 필드 |
| ElementType.METHOD | 메서드 |
| ElementType.PARAMETER | 파라미터 |
| ElementType.CONSTRUCTOR | 생성자 |
| ElementType.LOCAL_VARIABLE | 지역 변수 |
| ElementType.ANNOTATION_TYPE | 어노테이션 |
| ElementType.PACKAGE | 패키지 |
@Retention 어노테이션은 어노테이션의 지속 시간을 결정하는 데 사용한다.
| 인자 값 | 설명 |
|---|---|
| SOURCE | 어노테이션은 소스 파일에서만 유지된다. 컴파일 과정 중에는 이 어노테이션 정보가 사용되지만, 컴파일된 .class 파일에는 포함되지 않으므로 주로 컴파일러에 의해 사용되는 어노테이션에 적용된다. ex): @Override, @SuppressWarnings |
| CLASS | 컴파일 시점에서 필요한 정보를 제공하고, 런타임에는 필요 없는 경우에 사용된다.(디폴트 값) |
| RUNTIME | 어노테이션은 .class 파일에 포함되며, 런타임에도 JVM에 의해 유지됩니다. 리플렉션을 통해 런타임에 어노테이션 정보를 읽을 수 있다. ex) 스프링의 @Autowired |
리플렉션이란?
- 클래스가 가지고 있는 필드가 무엇인지, 어떤 생성자를 가지고 있는지, 어떤 메소드를 가지고 있는지, 적용된 어노테이션은 무엇인지 알아내는 것