[Java] Custom Annotation 만들기

Ceing·2024년 6월 23일

Java

목록 보기
2/8
post-thumbnail

개념

  • 간단하게 말하면 일종의 메타 데이터를 의미
  • ① 해당 데이터를 바탕으로 자동으로 메서드를 생성하기도 하고(lombok) 또는 ② 컴파일러에게 문법 체크를 강요시킬 수 있을 뿐더러 값을 바인딩해올 수 있다(@ModelAttribute , @RequestParam , … )

어노테이션 기본 형식

@Target(${value})
@Retention(${value})
public @interface HelloAnnotation{
	int value() default 0;
	String required() default “”;
}

어노테이션이름 , @Target , @Retention이 기본 형태이자 필수로 할당되어야함


@Target

개념

  • 어디에 해당 어노테이션을 선언할 수 있는지 타겟을 정할 수 있음
  • enum 형태로 여러 개의 타겟을 지정할 수 있음

지정할 수 있는 타겟 종류

  • TYPE : class , interface , enum 선언부에 지정 가능
  • CONSTRUCTOR : 생성자에 선언 가능
  • FIELD : 필드에 선언 가능
  • METHOD : 메서드에 선언 가능
  • PARAMETER : 매개변수에 선언 가능
  • ANNNOTATION_TYPE : 어노테이션에 선언 가능

@Retention

  • 해당 어노테이션이 어디까지 동작할 것인지에 대한 정보
  • @Target과는 다르게 enum값 하나만 넣을 수 있음
  • CLASS , RUNTIME , SOURCE가 있는데, RUNTIME이 .class 파일에도 유지되고 JVM 실행 시에도 유지되므로 주로 RUNTIME만 쓰임
  • CLASS , SOURCE에 대해 부연설명을 하자면 CLASS는 .class파일까지는 유지되고 JVM 실행 시에는 삭제됨 , SOURCE는 java파일 자체에서만 유지되고 컴파일 시 제거됨

어노테이션 내부 메서드 선언

int value() default 0;
String required();
  • 이런 식으로 어노테이션 내부에 메서드를 선언할 수 있음
  • 생각해보면 어노테이션을 지정할 때 파라메터로 특정 값을 넘겼는데 이러한 메서드들이 어노테이션 내부에 선언되어있었기 때문에 가능했던 것
  • 목적에 맞게 메서드를 선언하여 외부로부터 값을 바인딩할 수 있음
  • default 예약어를 통해 디폴트 값을 세팅해놓을 수 있음
  • 즉 위의 예제로 작성해놓은 @HelloAnnotation를 쓴다면 다음과 같이 사용 가능
@HelloAnnotation(20 , “abcd”)
profile
이유에 대해 끊임없이 생각하고 고민하는 개발자

0개의 댓글