본문 바로가기
Programming/Java

[whiteship 온라인 스터디] 12주차 과제: 애노테이션

by 읽고 쓰는 개발자 2021. 2. 25.

github.com/whiteship/live-study/issues/12

 

12주차 과제: 애노테이션 · Issue #12 · whiteship/live-study

목표 자바의 애노테이션에 대해 학습하세요. 학습할 것 (필수) 애노테이션 정의하는 방법 @retention @target @documented 애노테이션 프로세서 마감일시 2021년 2월 6일 토요일 오후 1시까지.

github.com

목표

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

학습할 것 (필수)

0. 애노테이션의 용도

  • 컴파일러에게 코드 문법 에러를 체크하도록 정보 제공 ex) @Override
  • 소프트웨어 개발 툴이 빌드나 배치 시 코드를 자동으로 생성하도록 정보를 제공 
  • 실행 시(런타임 시) 특정 기능을 실행하도록 정보를 제공 

1. 애노테이션 정의하는 방법

인터페이스 정의와 유사 

public @interface AnnotationName {

}

어노테이션은 element를 멤버로 가질 수 있다. 기본 element인 value 선언도 가능

public @interface AnnotationName {
	타입 Value();		// 기본 엘리먼트 선언
	타입 elementName() [default 값] ; 	//엘리먼트 선언
}

정의한 어노테이션을 코드에서 적용할 때

@AnnotaionName(elementName1 = "값");

@AnnotationName("값");	//기본 element인 value에 값을 줄 때 name 생략 가능

출처 :https://www.javatpoint.com/java-annotation

2. @retention

@retention : 애노테이션 유지 정책 정의하는 애노테이션

애노테이션 유지 정책은 아래와 같다.

RetentionPolicy 열거 상수 설명
SOURCE 소스상에서만 정보를 유지한다. 바이트 코드 파일에는 정보 남지 않는다.
CLASS 바이트 코드 파일까지 정보를 유지한다. 리플렉션을 이용해서(런타임 시)는 정보를 얻을 수 없다. 
RUNTIME 런타임까지 정보 얻을 수 있다.

 

3. @target 

@target : 애노테이션 적용 대상 정의하는 애노테이션 

애노테이션 적용 대상은 java.lang.annotation.ElementType에 열거 상수로 정의되어있다.

적용 대상 지정 : @Target 사용한다.

ElementType 열거 상수 적용 대상
TYPE 클래스, 인터페이스, 열거타입
ANNOTATION_TYPE 어노테이션
FIELD 필드
CONSTRUCTOR 생성자
METHOD 메소드
LOCAL_VARIABLE 로컬 변수 
PACKAGE 패키지

4. @documented

형태를 가지는 어노테이션이 javadoc 및 같은 툴에 의해 디폴트로 문서화 되는 것. @documented 애노테이션이 붙었다면, 공개 API 일부가 된다.

출처 : cris.joongbu.ac.kr/course/java/api/java/lang/annotation/Documented.html

 

5. 애노테이션 프로세서

애노테이션 프로세서 : 소스코드 레벨에서 소스코드에 있는 애노테이션 정보를 읽어서 컴파일러가 컴파일 중에 새로운 소스코드를 생성하는 것. 컴파일러가 컴파일 중에 새로운 소스코드를 생성 / 기존의 코드를 변경할 수 있는 강력한 기능이다. ByteCode, resource file까지 생성이 가능하다. 

  • 사용 예 : lombok library , @Override(java5. 오버라이드 가능하지 않은 메소드라면 컴파일러가 에러 알림)
  • 장점 : 런타임 비용이 없다.
  • 단점 : 기존 클래스 코드를 변경할 때 hack이 필요하다. (현재까지 공식적인 API가 없다. public한 기술은 아님)

출처 : 이것이 자바다 (신용권 저), 더 자바, 코드를 조작하는 다양한 방법 (인프런 강의, 백기선 강사)