정의
- 자바 애너테이션(Java Annotation)은 자바 소스 코드에 추가하여 사용할 수 있는 메타데이터의 일종
- 보통 @ 기호를 앞에 붙여 사용
- JDK 1.5 버전 이상에서 사용 가능
- 자바 애너테이션은 클래스 파일에 임베디드되어 컴파일러에 의해 생성된 후 자바 가상머신에 포함되어 작동
종류
- 표준(내장) 어노테이션 : 자바가 기본적으로 제공해주는 어노테이션
- 메타 어노테이션 : 어노테이션을 위한 어노테이션
- 사용자 정의 어노테이션 : 사용자가 직접 정의하는 어노테이션
배경
- 자바 코드는 변경돼도 설정 파일은 업데이트되지 않는 문제
- 설정과 코드가 분리되어 있어, 개발에 대한 어려움
- ➡️ 어노테이션 통해 하나의 파일에서 코드와 설정 관리 가능해짐

표준 어노테이션
- @Override
- @Deprecated
- @SuppressWarnings
@Override
- 오버라이딩을 올바르게 했는지 컴파일러가 체크
class Parent {
void parentMethod() {}
}
class Child extends Parent {
@Override
void pparentmethod() {} // compile error
}
@Deprecated
- 앞으로 사용하지 않을 것을 권장하는 필드나 메서드에 붙임
@Deprecated
public int getDate() {
return normalize().getDayOfMonth();
}
@FunctionalInterface
- 함수형 인터페이스에 붙이면, 컴파일러가 올바르게 작성했는지 체크
- 해당 어노테이션은 함수형 인터페이스의 "하나의 추상메서드만 가져야 한다는 제약"을 확인해줌
@SuppressWarnings
- 컴파일러의 경고메세지가 나타나지 않게 함
@SuppressWarnings("unchecked")
ArrayList list = new ArrayList(); // generic type missed
list.add(obj);
- 보통 경고가 많을 때, 확인된 경고는 해당 어노테이션을 붙임
- ➡️ 새로운 경고를 알아보지 못하는 것을 방지하기 위해 사용
메타 어노테이션
- 어노테이션을 위한 어노테이션
@Target
- 어노테이션 정의 시, 적용 대상을 지정하는데 사용
@Target({TYPE, FIELD, TYPE_USE})
@Retention(RetentionPolicy.SOURCE)
public @interface MyAnnotation{}
@MyAnnotation // 적용 대상 TYPE : 클래스, 인터페이스
class MyClass{
@MyAnnotation //적용 대상 FIELD
int i;
@MyAnnotation //적용 대상 TYPE_USE
MyClass mc;
}
@Retention
- 어노테이션이 유지되는 기간을 지정하는데 사용
- SOURCE : 소스 파일에만 존재
- RUNTIME : 클래스 파일에 존재. 실행 시 사용 가능
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override{}
@Documented
- javadoc 으로 작성한 문서에 포함시킬 때 해당 어노테이션 붙임
@Inherited
- 어노테이션도 상속 가능
- 어노테이션을 자손 클래스에 상속할 때, @Inherited 붙임
@Inherited
@interface SuperAnno{}
@SuperAnno
class Parent{}
// <- 여기에 @SuperAnno 가 붙은 것으로 인식
class Child extends Parent{}
@Repeatable
- 반복해서 붙일 수 있는 어노테이션을 정의할 때 사용
@Repeatable(ToDos.class)
@interface ToDo{
String value();
}
@ToDo("delete test codes.")
@ToDo("override inherited methods")
class MyClass{
~~
}
@interface ToDos{
ToDo[] value();
}
- @Repeatable 어노테이션은 위의 "ToDos"처럼 "컨테이너 어노테이션"도 정의해야 함
마커 어노테이션
- 요소가 하나도 정의되지 않은 어노테이션
- 대표적으로 "@Test" : 해당 어노테이션은 테스트 프로그램에게 테스트 대상임을 알리는 어노테이션
어노테이션 규칙
어노테이션에도 반드시 지켜주어야 하는 규칙 존재
- 요소의 타입 : 기본형, String, enum, 어노테이션, Class 만 허용
- 괄호() 안에 매개변수 선언 X
- 예외 선언 X
- 요소의 타입을 매개변수로 정의 X (<T>)
@interface AnnoConfigTest {
int id = 100; // 상수 ok
String major(int i, int j) // 매개변수 x
String minor() throws Exception; // 예외 x
ArrayList<T> list(); // 요소의 타입을 매개변수로 x
출처
'Backend > Java' 카테고리의 다른 글
| 자바 리플렉션(Reflection) (0) | 2024.07.30 |
|---|---|
| 인스턴스 생성과 정적 팩토리 메서드 (0) | 2024.03.25 |
| [Java] Exception (0) | 2023.12.05 |
| [Java] Enum (0) | 2023.12.05 |
| [Java] Pass by Value vs. Pass by Reference (0) | 2023.12.05 |
댓글