Java @interface 고유한 어노테이션 정의

@interface, 메타 어노테이션, 어노테이션 속성

고유한 주석 정의 – @interface 명령어

@intarface name {
    definiton
}
  name: 어노테이션 이름
  definition: 어노테이션 정의

@interface 명령어를 사용하여 어노테이션을 직접 정의할 수도 있다. 예를 들어, 다음은 Version 어노테이션을 정의하는 예제이다.

Version.java

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Inherited
public @interface Version {
    double value();
}

메타 어노테이션

어노테이션 정의에서는 어노테이션 자체에 대한 정보를 정의하기 위한 어노테이션 부여할 수 있다. 그런 어노테이션을 메타 어노테이션(Meta annotation)이라고 한다.

메타 어노테이션의 종류는 아래와 같다.

  • @Retention
  • @Target
  • @Inherited

@Retention

어노테이션 정보가 유지되는 범위

어노테이션 개요
@Retention(SOURCE) 어노테이션이 소스 코드에만 이용 가능하며 컴파일 후에는 사라짐
@Retention(CLASS) 어노테이션이 .class 파일에 존재하지만 런타임 시에는 사라짐
@Retention(RUMTIME) 어노테이션이 컴파일러와 런타임에 사용 가능

@Target

어노테이션을 부여할 수 있는 대상을 지정한다.

어노테이션 개요
@Target(ElementType.TYPE) 클래스의 어떤 요소에나 적용 가능, 기본값
@Target(ElementType.FIELD) 클래스의 특정 필드
@Target(ElementType.METHOD) 클래스의 메서드
@Target(ElementType.PARAMETER) 메서드의 파라미터
@Target(ElementType.CONSTRUCTOR) 생성자
@Target(ElementType.LOCAL_VARIABLE) 로컬 변수
@Target(ElementType.ANNOTATION_TYPE) 어노테이션 타입

@Inherited

어노테이션 정보가 서브 클래스에도 상속가능 여부

어노테이션 속성

@interface 명령어 아래에는 어노테이션에서 사용할 수 있는 속성을 지정한다. 속성은 추상 메소드와 같이 형태와 이름 세트로 나타낸다.

이와 같이 정의된 속성은 일반적으로 @어노테이션명(속성명=값, ...)의 형식으로 지정할 수 있다. 다만, 속성명이 value일 때는 이름을 생략하여 @어노테이션명(값)과 같이 작성할 수도 있다.

예를 들어, 다음은 Version 어노테이션을 지정하는 annotationTest 메소드의 예제이다.

AnnotationSample.java

package com.example.mynavi.object;
 
public class AnnotationSample {
    @Version(1.0)
    public void annotationTest() {
        System.out.println("Released");
    }
}


최종 수정 : 2023-01-07