본문 바로가기

Programming/Java

[Java] 어노테이션(Annotation)

 

자바에서 어노테이션(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)
[인프런] 더 자바, 코드를 조작하는 다양한 방법 / 백기선