자바 기본 12. 애노테이션
12주차 과제: 애노테이션
📌 목표
자바의 애노테이션에 대해 학습하세요.
📌 학습할 것
- 애노테이션 정의하는 방법
- @Retention
- @Target
- @Documented
- 애노테이션 프로세서
📜 시작에 앞서
- 백기선 님의 라이브 스터디(2020년 11월부터 2021년 3월까지) 커리큘럼을 따라 진행한 학습입니다
- 뒤늦게 알게 되어 스터디 참여는 못했지만 남아있는 스터디 깃허브 주소와 유튜브 영상을 참고했습니다
✏️ 애노테이션이란?
- 애노테이션: 프로그램에게 추가적인 정보를 제공하는 메타데이터
- 메타데이터: 데이터에 대한 데이터
- 애노테이션 용도
- 컴파일러에게 정보 제공 - 주석을 이용하여 컴파일러가 에러를 체크하거나 무시하게 할 수 있다
- 컴파일 타임 및 배포 타임 처리 - 소프트웨어 개발 툴이 코드, xml파일, jar 압축 파일 등을 자동으로 생성할 수 있다
- 런타임 처리 - 일부 애노테이션은 런타임에 특정 기능을 위한 정보 제공
표준 애노테이션
- 자바에서 기본적으로 제공하는 애노테이션
애너테이션 | 설명 |
---|---|
@Override | 컴파일러에게 해당 메서드는 오버라이딩하는 것이란 정보 제공 |
@Deprecated | 클라이언트에게 사용하지 않을 것을 권한다는 정보 제공 |
@SuppressWarnings | 컴파일러에게 특정 경고메시지 나타내지 않도록 정보 제공 |
@SafeVarargs | 클라이언트에게 제네릭 타입의 가변인자 사용에 대한 정보 제공 |
@FunctionalInterface | 함수형 인터페이스 사용에 대한 정보 제공 |
@Native | native메서드에서 참조되는 상수라는 정보 제공 |
메타 애너테이션 | 설명 |
---|---|
@Target | 애너테이션이 적용가능한 대상에 대한 정보 제공 |
@Documented | 애너테이션 정보가 javaodc 문서에 포함되기 위한 정보 제공 |
@Inherited | 애너테이션이 서브 클래스에 상속되기 위한 정보 제공 |
@Retention | 애너테이션이 유지 되는 기간에 대한 정보 제공 |
@Repeatable | 애너테이션이 한 대상에 여러 번 적용될 수 있도록 정보 제공 |
📑 애노테이션 정의하는 방법
@interface
- 애노테이션 타입 선언을 위한 키워드
interface
선언과 구분하기 위해@
를 붙인다 - 애노테이션은
java.lang.annotation.Annotation
를 확장하며,Annotation
을 수동으로 확장한다고 해서 애노테이션이 되지는 않는다
@interface MyAnnotation{
...
}
애노테이션 필드
- 애노테이션 필드는 추상 메서드와 비슷한 애너테이션 요소(element)로 구성되며, 인터페이스 처럼 상수를 정의할 수도 있다
애너테이션 요소
- 추상 메서드와 형태가 같으나 추가적인 규칙이 적용된다
- 요소의 타입(리턴 타입)은 기본형, String, enum, 애너테이션, Class만 가능
- 메서드에 파라미터 받기 불가
- 예외를 선언 불가
- 요소의 타입에 타입 파라미터 사용 불가
- 애너테이션을 적용할 때 요소의 값을 모두 지정해줘야 한다
- 적용시
요소이름 = 적용값
방식 - 이때 클라이언트가 모두 직접 적용하지 않을 수 있게 요소에
default
값을 줄 수 있다타입 요소이름() default "DEFAULT"
null
은 기본값으로 불가
- 요소이름이
value
일 때 요소이름 생략하여 값 지정 가능@MyAnnotation("요소이름 생략 가능")
- 적용시
📑 @Retention
- 애노테이션이 유지(retention) 되는 기간에 대한 정보 설정
- 이를 위한 속성으로
RetentionPolicy
가 있는데, 여기에는SOURCE
CLASS
RUNTIME
이 있다
RetentionPolicy
RetentionPolicy | 유지 기간 |
---|---|
SOURCE | 소스 파일까지 유지 |
CLASS(default) | 클래스 파일까지 유지 |
RUNTIME | 런타임까지 유지 |
-
SOURCE
-
소스 파일까지 애노테이션 정보를 유지하며, 컴파일 이후 클래스 파일에는 남아있지 않다
-
주로 컴파일러에게 정보 제공
-
클래스 파일에 애노테이션 정보가 필요 없는 경우 예시
-
@Override
,@SupperessWarnings
컴파일러의 에러 체크에 대한 정보를 주는 경우 -
lombok
의@Getter
처럼 클래스 파일에 바이트코드를 생성해주고 애노테이션이 역할을 다하고 더 이상 해당 정보가 필요 없는 경우
-
-
-
CLASS
- 클래스 파일에 애노테이션 정보가 저장되지만, JVM에 로딩되지 않기 때문에 JVM에는 해당 정보가 없다
SOURCE
와 차이점은 클래스 파일에 정보가 남는 다는 것, 사용 상황 예시- 라이브러리 jar 파일(Download Sources 옵션은 논외)에는 소스 파일이 포함되지 않으므로 여기서 런타임에 영향을 미치지 않고 애노테이션 정보를 넘기고 싶을 때
-
RUNTIME
- 애노테이션 정보가 메모리까지 올라가므로, 실행 동안에도 정보를 사용할 수 있다
- Reflection API 등을 통해 애노테이션 정보를 알 수 있다는 것
- 리플렉션은 클래스로더가 읽어들인 정보 기반으로 메모리에 들어 있는 정보를 읽는 것
- 주로 클라이언트에게 정보 제공
참고: 기본기를 쌓는 정아마추어 코딩블로그: 아무 관심 없던 @Retention 어노테이션 정리(RetentionPolicy SOURCE vs CLASS vs RUNTIME)
📑 @Target
- 애노테이션이 적용가능한 대상에 대한 정보 설정
- 속성 값으로는
java.lang.annotation.ElementType
열거형에 정의된 상수 사용 가능 - 속성 값 여러개 지정할 때는
{}
사용
ElementType
상수 | 설명 |
---|---|
ANNOTATION_TYPE | 애노테이션 |
CONTRUCTOR | 생성자 |
FIELD | 필드(enum 상수 포함) |
LOCAL_VARIABLE | 지역변수 |
METHOD | 메서드 |
PACKAGE | 패키지 |
PARAMETER | 파라미터 |
TYPE | 클래스, 인터페이스(애노테이션 타입 포함), enum |
TYPE_PARAMETER | 타입 파라미터 (JDK 1.8) |
TYPE_USE | 타입이 사용되는 곳 (JDK 1.8) |
ElementType.TYPE
인 마커 애노테이션을 작성하고 있다면, 정말 애노테이션으로 구현해야 할지, 마커 인터페이스로 구현했을 시와 비교해 고민- 마커 애노테이션: 정의된 요소가 없는 애노테이션
📑 @Documented
- 애노테이션 정보가 javaodc 문서에 포함되기 위한 정보 설정
- 클래스나 메서드에 대한 애노테이션은 기본적으로 javadocs에 포함되지 않는다
package com.servlets;
import java.lang.annotation.*;
@Unfinished("Just articleware")
@Documented
public @interface Unfinished { ...
출저 : oracle: Making the Most of Java's Metadata, Part 2: Custom Annotations
- 다음과 같은 코드 작성시
@Unfinished
가 붙은 메서드나 클래스는 javadocs에@Unfinished
에 대한 정보가 포함되는 것
📑 애노테이션 프로세서
- 애노테이션 프로세서 : 컴파일 타임에 특정 애노테이션을 애너테이션이 나타내는 정보에 따라 적절히 처리하는 주체
-
아래 링크는 애너테이션 프로세서를 구현하고 사용하는 내용을 보여준다
-
애너테이션 프로세스를 통해 특정 애너테이션을 컴파일 타임에 원하는 방식으로 처리할 수 있다
- 관련 이해가 필요하거나 심심할 때 위 링크 중 하나 선택해 프로세서 만들어보기
Author And Source
이 문제에 관하여(자바 기본 12. 애노테이션), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@butterf12/자바-기본-12.-애노테이션저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)