Java : 사용자 정의 어노테이션 만들기
- 프로그래밍 언어/JAVA
- 2022. 2. 24.
어노테이션 만들기
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Retry {
int maxRetryCount() default 3;
int maxAbc() default 10;
}
- @interface로 어노테이션 클래스를 선언한다
- @Retention을 통해 어느 시점에 적용할지를 설정한다.
- @Target을 통해 어떤 곳에 적용할지를 설정한다. (클래스, 메서드, 변수 등등)
- 어노테이션은 내부적으로 값을 가질 수 있고, 여기에 값을 주면 옵션으로 값을 설정할 수 있다.
- 타입 + 이름 + () + default형태로 선언한다
어노테이션 사용하기
@Retry(maxRetryCount = 10, maxAbc = 111)
public String save(String itemId) {
seq ++;
if (seq % 2 == 0) {
throw new IllegalStateException("예외 발생");
}
return "ok";
}
- 다음과 같이 만든 어노테이션을 적용할 수 있다.
- 어노테이션 내부에 설정했던 값은 옵션 값을 넣을 때 사용할 수 있게 된다.
메타 어노테이션
어노테이션을 정의할 때, 이 어노테이션이 어떤 어노테이션이 알려줘야한다. 메타 어노테이션은 여러가지가 있지만 주로 사용하는 것은 @Retention과 @Target이다.
@Retenetion
@Retetion 어노테이션은 이 어노테이션이 사용되는 시점을 설정한다. 실제 동작 시점은 다음과 같다.
유지 정책 | 의미 |
SOURCE | 소스 파일에만 존재. 클래스 파일에는 존재 X |
CLASS | 클래스 파일에 존재. 실행 시점에 사용 불가. 기본값 |
RUNTIME | 클래스 파일에 존재. 실행시에 사용 가능. |
SOURCE는 거의 사용하지 않는다. CLASS는 클래스에 어노테이션 정보를 포함한다. 그렇지만 클래스 파일이 JVM에 로딩될 때 어노테이션 정보가 무시 된다. 따라서 실행 시점에 어노테이션의 정보를 얻지 못하기 때문에 거의 사용되지 않는다. RUNTIME은 실행 시에 리플렉션을 통해 클래스에 저장된 어노테이션 정보를 처리할 수 있게 도와준다. 따라서 @Retetion 전략은 대부분 RUNTIME을 사용한다.
@Target
@Target 어노테이션은 이 어노테이션이 적용가능한 대상을 지정하는데 사용된다. 아래에 어떤 어노테이션이 어디에 적용될 수 있는지를 표로 정리했다.
대상 타입 | 의미 |
ANNOTATION_TYPE | 어노테이션 지정 |
CONSTRUCTOR | 생성자 지정 |
FIELD | 필드 지정(멤버 변수, enum 상수) → 로컬변수 X |
LOCAL_VARIABLE | 지역변수 |
METHOD | 메서드 |
PACKAGE | 패키지 |
PARAMETER | 매개변수 |
TYPE | 타입(클래스, 인터페이스, ENUM) |
TYPE_PARAMETER | 타입 매개변수 |
TYPE_USE | 타입이 사용되는 모든 곳 |
TYPE과 TYPE_USE의 차이는 아래에서 확인할 수 있다.
@MyAnnotation // 적용대상이 TYPE인 경우
class MyClass{
@MyAnnotation // 적용대상이 TYPE_USE인 경우
MyClass mc;
}
'프로그래밍 언어 > JAVA' 카테고리의 다른 글
Java Stream과 Stream 활용한 예시 (0) | 2022.02.25 |
---|---|
멀티 쓰레드 관련 공부 (0) | 2022.02.25 |
람다식 (0) | 2022.02.24 |
참조 변수, 메모리 간단 정리 (0) | 2021.11.09 |
Java 예외처리 (0) | 2021.10.25 |