자바에서 어노테이션(Annotation)은 메타데이터(metadata)라고 볼 수 있다.
💡 메타데이터
애리케이션이 처리해야 할 데이터가 아닌 컴파일 과정과 실행 과정에서 코드를 어떻게 컴파일하고 처리할 것인지 알려주는 정보.
데이터를 위한 데이터. 데이터를 설명해주는 데이터
컴파일러에게 문법 에러를 체크하거나, 코드를 자동으로 생성하도록 정보를 제공하거나, 실행 시 특정 기능을 실행하는 정보를 제공, 자동으로 파일을 생성하는 용도 등으로 사용할 수 있다.
어노테이션의 대표적인 예는 @Override가 있다. 컴파일러가 정확히 오버라이드가 되지 않았다면 에러를 발생시키게 하는 것이다.
생성하기
public @interface MyAnnotation {
// 타입 엘리먼트명() [default 디폴트값];
int num() default 100;
String value();
}
@interface를 사용해 어노테이션을 정의하고 사용할 때에는 @MyAnnotation으로 사용한다.
어노테이션은 element를 멤버로 가질 수 있고, 타입(class, primitive type, enum, 배열 등...)과 이름으로 구성된다. 메소드를 선언할 때처럼 괄호()를 붙여야 하고, 만약 어노테이션을 적용하며 값을 지정하지 않았을 경우에 넣을 디폴트 값을 설정해줄 수 있다.
어노테이션의 value 엘리먼트는 특수한데, 코드에 어노테이션을 적용할 때에는 반드시 이름을 붙여야 하지만 value만 지정할 때에는 생략이 가능하다. 하지만, 다른 엘리먼트 값과 동시에 지정하고자 할 때에는 이름을 지정해주어야 한다.
@MyAnnotation("Hello") // value = "Hello"
@MyAnnotation(num = 10, value = "Hello")
유지(@Retention)
어노테이션을 생성할 때, 어노테이션을 언제까지 유지할지 지정해주어야 한다.
- SOURCE : 소스에서만 유지한다. 컴파일 시 사라지기 때문에 바이트코드에서는 존재하지 않는다. 코드를 분석할 때만 의미가 존재
- CLASS : 바이트 코드까지 유지한다. 런타임 때는 사라진다.
- RUNTIME : 바이트 코드까지 유지하며, 런타임 시에도 어노테이션의 정보를 얻을 수 있기 때문에 리플렉션을 이용해 정보를 얻을 수 있다.
적용 대상(@Target)
어노테이션을 적용할 대상을 지정할 수 있다. 만약 지정하지 않은 곳에 설정할 경우 컴파일 에러가 발생한다
- TYPE : 클래스, 인터페이스, 열거 타입
- ANNOTATION_TYPE : 어노테이션
- FIELD : 필드
- CONSTRUCTOR : 생성자
- METHOD : 메소드
- LOCAL_VARIABLE : 로컬 변수
- PACKAGE : 패키지
@Inherited
어노테이션을 적용한 슈퍼 클래스를 상속한 서브클래스도 어노테이션의 영향을 받게 된다.
📚 Reference
신용권, 『이것이 자바다』, 한빛미디어(2015)
[인프런] 더 자바, 코드를 조작하는 다양한 방법 / 백기선
'Programming > Java' 카테고리의 다른 글
[Java] Boxing, Unboxing (0) | 2021.05.05 |
---|---|
[Java] Arrays.sort(), Collections.Sort() 속도 비교 (0) | 2021.03.04 |
[Java] Java란? Java의 특징 (0) | 2021.02.16 |
[Java] Pattern, Matcher Class 사용법과 메소드 정리 (8) | 2021.01.21 |
[Java] 정규식 문법 정리(Regex) (2) | 2021.01.20 |