관리 메뉴

너와 나의 스토리

[Java] 어노테이션(Annotation) 만들고 적용하는 방법 본문

Programming Language/Java

[Java] 어노테이션(Annotation) 만들고 적용하는 방법

노는게제일좋아! 2021. 4. 7. 23:18
반응형

어노테이션(Annotation)이란?

  • 어노테이션은 메타데이터(metadata)라고 볼 수 있다.
    • 메타데이터: 애플리케이션이 처리해야 할 데이터가 아니라, 컴파일 과정과 실행 과정에서 코드를 어떻게 컴파일하고 처리할 것인지를 알려주는 정보.
  • 어노테이션의 세 가지 용도
    • 컴파일러에게 코드 문법 에러를 체크하도록 정보를 제공
      • 예: @Override
    • 소프트웨어 개발 툴이 빌드나 배치 시 코드를 자동으로 생성할 수 있도록 정보를 제공
    • 실행 시(런타임 시) 특정 기능을 실행하도록 정보를 제공

 

 

어노테이션을 정의하고 적용해보기

  • 정의:
    • @interface를 사용해서 정의
public @interface AnnotationName {
}
  • 이렇게 정의한 어노테이션은 다른 곳에서 '@AnnotationName' 형태로 사용할 수 있다.
  • 어노테이션은 element를 멤버로 가질 수 있다.
    • element 이름 뒤에 '()'를 붙여줘야 한다.
    • default 명령어를 이용해 값을 초기화해줄 수 있다.
public @interface AnnotationName {
	String elementName1();
	int elementName2() default 5;
}
  • 위에서 정의한 AnnotationName적용하는 방법
    • @AnnotationName(elementName1="값", elementName2=3);
    • @AnnotationName(elementName1="값");
  • elementName1은 디폴트 값이 없기 때문에 반드시 값을 기술해야 하고, elementName2는 디폴트 값이 있기 때문에 생략할 수 있다.
  • 어노테이션의 기본 element: value
public @interface AnnotationName {
	String value();
	int elementName() default 5;
}
  • value element를 가지는 어노테이션은 코드에서 적용할 때 다음과 같이 값만 기술할 수 있다.
    • @AnnotationName("값");
  • 하지만 다른 element도 같이 사용하는 경우에는 이름을 정의해줘야 한다.
    • @AnnotationName(value="값', elementName=3);

 

 

어노테이션 적용 대상

  • 어노테이션을 적용할 대상을 지정할 수 있다.
  • 'java.lang.annotation.ElementType'으로 설정
ElementType 적용 대상
TYPE Class, Interface, Enum
ANNOTATION_TYPE Annotation
FIELD Field
CONSTRUCTOR Constructor
METHOD Method
LOCAL_VARIABLE Local variable
PACKAGE Package
  • @Target 어노테이션을 사용해 정의한 어노테이션이 적용될 대상을 지정할 수 있다.
  • 예:
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})
public @interface AnnotationName {
	String value();
	int elementName() default 5;
}
@AnnotationName // 적용 가능 (TYPE)
public class ClassName{
    @AnnotationName // 적용 가능 (FIELD)
    private String fieldName; 

    @AnnotationName // 적용 불가
    public ClassName() {}

    @AnnotationName // 적용 가능 (METHOD)
    public void methodName() {}
}

 

 

어노테이션 유지 정책

  • 어노테이션을 어느 범위까지 유지할 것인지 지정해야 한다.
    • 소스상에서만 유지할 것인가? 컴파일된 클래스까지 유지할 것인가? 런타임 시에도 유지할 것인가?
  • 'java.lang.annotation.RetentionPolicy'으로 설정
RetentionPolicy 설명
SOURCE 소스상에서만 유지. 소스 코드를 분석할 때만 의미가 있다.
CLASS 바이트 코드 파일까지 유지. 리플렉션 이용해서 어노테이션 정보 얻을 수 없다.
RUNTIME 바이트 코드 파일까지 유지하면서 리플랙션을 이용해서 런타임 시에 어노테이션 정보 얻을 수 있다.
  • 리플렉션(Reflection): 런타임 시에 클래스의 메타 정보를 얻는 기능
    • 예를 들어, 클래스가 가지고 있는 필드가 무엇인지, 적용된 어노테이션은 무엇인지 알아내는 것.
  • 보통 어노테이션은 런타임 시점에서 사용하기 위해 만든다.
  • 사용 방법: @Retention 어노테이션 이용
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnotationName {
	String value();
	int elementName() default 5;
}

 

 

 

 

 

출처:

- [이것이 자바다]

반응형
Comments