[STUDY HALLE] 12주차 과제: 애노테이션

2 minute read

학습 목표

자바의 애노테이션에 대해 학습하세요.

  • 애노테이션 정의하는 방법
  • @retention
  • @target
  • @documented
  • 애노테이션 프로세서

Deadline: ~2021/02/06 13:00

Annotation

어노테이션(Annotation)의 사전적 의미는 ‘주석’으로, 프로그램의 메타데이터를 나타낸다. 오라클 자바 문서에서는 어노테이션을 사용하는 이유를 다음 세가지로 정리한다.

  • Information for the compiler : 컴파일러에게 정보를 제공하여 에러 감지
  • Compile-time And deployment-time processing : Annotation 정보를 통해 XML, 코드를 생성
  • Runtime processing : 런타임에 별도의 처리

java.lang 패키지에 정의된 어노테이션을 예시로 들면,

  • @Override : 선언한 메서드가 오버라이드 되었다는 것을 나타내고, 부모클래스나 인터페이스에서 해당 메서드를 찾을 수 없으면 컴파일 에러
  • @Deprecated : 해당 메서드가 더 이상 사용되지 않음을 표시하고, 사용되면 컴파일 에러
  • @SuppressWarnings : 컴파일 경고를 무시

선언은 다음과 같이 할 수 있다.

package week12;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    String text() default "-";
    int num() default 27;
}

어노테이션은 element를 가질 수 있고, default값을 설정해 줄 수 있다. 어노테이션을 붙일 때 원하는 값을 다시 지정해줄 수 있다.

@MyAnnotation(num = 10)
  public void sample1(){
}

어노테이션은 데이터의 정보를 나타내는 데이터인 ‘메타데이터’이다. 그리고 어노테이션의 정보를 나타내는 ‘메타 어노테이션’이 있는데, 위에서 어노테이션을 선언할 때 사용한 @Target, @Retention이 여기에 해당한다.

@Target

@Target은 어노테이션을 적용하는 대상을 지정할 수 있고, 배열 형식으로 나열하여 여러 가지를 적용할 수도 있다.

@Target({ElementType.METHOD, ElementType.FIELD})

@Target의 인자로 넣을 수 있는, 즉 어노테이션을 적용하는 대상이 되는 값은 다음과 같다.

요소 타입 대상
CONSTRUCTOR 생성자
METHOD 메소드
FIELD enum 상수를 포함한 필드값
LOCAL_VARIABLE 지역변수
PACKAGE 패키지
PARAMETER 매개변수
TYPE 클래스, 인터페이스, enum

@Retention

@Retention은 어노테이션이 유지(retention)되는 기간을 지정하는데 사용된다.

요소 타입 기간
SOURCE 소스 파일에만 존재하고 클래스 파일에는 없음
CLASS 클래스 파일에 존재하고 실행 시에는 사용 불가능. default값
RUNTIME 클래스 파일에 존재하고 실행 시 사용 가능

CLASS의 경우 바이트 코드 파일까지 정보를 유지한다. 하지만 리플렉션을 이용하여 어노테이션 정보를 얻을 수 있다.
리플렉션이란 구체적인 클래스 타입을 알지 못해도 그 클래스의 메소드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API를 말한다. 즉, 런타임에도 클래스 이름만 알고 있다면 해당 클래스에 대한 정보를 가져올 수 있다는 것이다. 모든 클래스 파일은 클래스 로더에 의해 메모리에 올라갈 때, 클래스에 대한 정보가 담긴 객체인 클래스 객체를 생성한다. 이 클래스는

클래스이름.class

의 형식으로 참조할 수 있으며, 클래스의 필드, 생성자, 메소드에 대한 정보를 얻을 수 있다.

@Documented

@Documented는 해당 어노테이션에 대한 정보가 Javadocs(API)문서에 포함된다는 것을 선언하는 것이다.

어노테이션 프로세서

어노테이션 프로세서란 자바 컴파일러 플러그인의 일종으로, 어노테이션에 대한 코드베이스를 검사, 수정, 생성하는 역할을 한다. 대표적으로 많이 사용되는 어노테이션 프로세서인 롬복의 Getter, Setter 어노테이션을 구현하는 과정을 친절하게 주석까지 달아서 github에 올려주신 분이 계시다(하단 링크 참조). 꽤나 낯선 내용이 대거 등장하여 아직 완전히 이해하지는 못 했다. 해당 코드와 주석을 읽으며 공부를 더 해야할 것 같다.

참고문헌

https://sujl95.tistory.com/67
https://www.notion.so/12-7b346e0e1fdd41a0ad19461ed08abb47
https://github.com/lee-maru/fakeLombok

Leave a comment