스터디할래 - 12주차 과제: 애노테이션

 https://github.com/whiteship/live-study

 

👍목표

 

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

 

📖학습할 것 (필수)

 

📌 애노테이션 정의하는 방법

 


📌 @Retention

 

 

📌 @Target

 

 

📌 @Documented

 

 

📌 애노테이션 프로세서

 


💡 애노테이션 정의하는 방법

 

 어노테이션이란 애플리케이션이 처리해야 할 데이터가 아니라, 컴파일 과정 실행 과정에서 코드를 어떻게 컴파일하고

 

처리할 지 알려주는 정보인 메타 데이터라 할 수 있다. 

 

 

어노테이션의 용도는 다음과 같다.

 

 

1. 컴파일러에게 코드 문법 에러를 체크하도록 정보 제공한다.

 

2.  소프트웨어 개발도구가 빌드나 배치 시에 코드를 자동으로 생성할 수 있도록 제공한다.

 

3. 런타임 시 특정 기능을 실행하도록 정보를 제공한다.

 

 

어노테이션을 정의하는 방법은 인터페이스를 정의하는 방법과 유사하다. interface 키워드 왼쪽에 @를 추가적으로 작성

 

하면 인터페이스 대신 어노테이션을 적용할 수 있다.

 

public @interface AnnotationName {
}

 

사용 방법은 

@AnnotationName

 

정의한 어노테이션의 이름에 @를 붙여 사용할 수 있다.

 

어노테이션은 element를 멤버로 가질 수 있으며, 디폴트 값을 가질 수 있다.

 

public @interface AnnotationSample {
	type elementName() [default 값];
}

 

 

💡 @Retention

 

어노테이션 정의 시 추가적으로 작성해야 하는 어노테이션이 필요하다. 어노테이션을 어느 범위까지 유지할 것인지 지정해야 하며 어노테이션 유지 정책은 java.lang.anootation.RetentionPolicy enum 상수로 정의되어 있다.

 

RetentionPolicy 설명
SOURCE 소스 코드 상에서만 어노테이션의 정보를 유지하며 소스 코드를 분석할 때에만 의미가 있다. 바이트코드에는 정보가 남지 않는다.
CLASS 바이트코드까지 어노테이션의 정보를 유지하지만 리플렉션을 이용해서 어노테이션의 정보를 얻는 것은 불가능하다.
RUNTIME 바이트코드까지 어노테이션 정보를 유지하면서 리플렉션을 이용해서 런타임 시에 어노테이션 정보를 얻을 수 있다.

 

리플렉션이란? 런타임 시에 클래스의 메타데이터를 얻는 기능을 말한다.

 

@Target({ElementType.FIELD, ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnotationSample {

}

 

 

💡 @Target

 

@Target은 어노테이션이 적용될 대상을 지정할 때 사용하며 @Target의 기본 엘리먼트인 value는 enum 타입의 ElementType 배열을 값으로 가진다.

 

@Target(ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})
public @interface AnnotationSample {
}

 

@Target의 적용이 되는 대상은 다음과 같다.

 

ElementType 종류 적용 대상
TYPE 클래스, 인터페이스, enum
ANNOTATION_TYPE 어노테이션
FIELD 필드
CONSTRUCTOR 생성자
METHOD 메서드
LOCAL_VARIABLE 지역 변수
PACKAGE 패키지

 

 

@Target({ElementType.FIELD, ElementType.TYPE, ElementType.METHOD})
public @interface AnnotationSample {

}


@AnnotationSample
public class ClassSample {
    @AnnotationSample
    private String field;

    // @AnnotationSample -> 불가능 @Target에 CONSTRUCTOR 선언 하지 않아 불가능
    public ClassSample(){

    }
    @AnnotationSample
    public void method() {

    }
}

 

💡 @Documented

 

 

@Documented 어노테이션은 자바 1.5에 추가되었으며 어노테이션 정의 시 @Target, @Retention과 같이 사용되며, 

 

javadoc으로 api 문서를 만들 때 어노테이션에 대한 설명도 포함되도록 지정하는 어노테이션이다. 

 

@Target({ElementType.FIELD, ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface AnnotationSample {

}

 

 

💡 애노테이션 프로세서

 

Annotation Processor란 자바 컴파일러의 컴파일 단계에서 정의한 어노테이션의 소스 코드를 분석하고 처리하기 위해

 

사용하는 훅이라고 한다. Annotation Processor의 대표적인 플러그인으로는 Lombok이 있고 Lombok의 @Getter,

 

@Setter, @Data 등의 어노테이션을 사용하여 보일러 플레이트 코드를 줄일 수 있다는 장점이 있다.

 

=====

 

어노테이션과 어노테이션 프로세서에 대한 추가적인 학습이 이뤄지면 내용 추가할 예정!

 

 

References

이것이 자바다(신용권 저)
kkambi.tistory.com/84(어노테이션 프로세서)
blog.sunimos.me/12(@Documented)
TCP School