2021-02-05
어노테이션의 선언 중 @Target이라는 기능이 있다. 이는 해당 사용자가 만든 어노테이션이 부착될 수 있는 타입을 지정하는 것이다. (타입이란? -> 클래스 / 생성자 / 메서드 등등...) 오늘은 이 @Target을 지정하는 방법을 알아보도록 하자.
- 어노테이션 선언코드
package aAnotation.Target;
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
@Target({ElementType.TYPE, ElementType.CONSTRUCTOR, //})
ElementType.METHOD, ElementType.FIELD})
// Target의 기능은 어노테이션을 붙일 수 있는 대상을 지정하는 것이다.
// 위의 매개 변수로 TYPE / CONSTRUCTOR / METHOD / FIELD
// 주었다. CONSTRUCTOR / METHOD / FIELD 3 가지는 이름 그대로
// 생성자와 메소드 필드에 어노테이션을 붙일 수 있다는 의미이며,
// TYPE 는 클래스,인터페이스,열거타입에 어노테이션을 붙일 수 있다는 의미이다.
public @interface DefineAno {
// interface 앞에 간단히 @를 붙여주면 어노테이션 인터페이스가 만들어진다.
// anotation은 자신의 element 를 가질 수가 있다.
int numEl() default 1;
// int 형 element를 가지고 default 값은 1이다.
String strEl();
// String 형 element를 가지고 있다.
}
DefineAno라는 예제 어노테이션에 @Target을 지정하는 코드이다. 소괄호 안에 중괄호가 다시 들어가는 것을 확인할 수 있으며, 그 안에 매개변수로 어노테이션을 부착할 수 있는 타입들을 적어주면 된다. 선언 방법은 아래와 같다.
@Target({ElementType.XXXX, ElementType.XXXX,....}) 이와 같이 XXXX 부분에 자신의 어노테이션의 부착을 원하는 타입을 지정해 주면 된다.
여기서 CONSCONSTRUCTOR / METHOD / FIELD는 말 그대로 생성자 / 메서드 / 필드에 어노테이션을 부착할 수 있게 하겠다는 의미이며, TYPE의 경우 조금 생소할 수 있느데, 이는 클래스 / 인터페이스 / 열거 타입(enum)을 뜻한다.
그 외에 @Target의 매개변수로는 아래와 같은 것들이 있다.
- ANNOTATION_TYPE : 어노테이션
- LOCAL_VARIABLE : 지역(로컬) 변수
- PACKAGE : 패키지
- 어노테이션이 적용된 코드
package aAnotation.Target;
@DefineAno(strEl = "클래스")
public class TestTarget {
@DefineAno(strEl = "필드")
int num;
@DefineAno(strEl = "생성자")
public TestTarget() {
}
@DefineAno(strEl = "메소드")
public void out() {
System.out.println("Method");
}
// 위의 코드와 같이 타겟에 선언된 유형에는 어노테이션을
// 부착할 수 있다.
}
위의 코드와 같이 @Target에 지정된 각 타입에는 사용자가 정의한 어노테이션을 부착할 수 있는 것을 확인할 수 있다.
- Target에 없는 타입
package aAnotation.Target;
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
@Target({ElementType.TYPE, ElementType.CONSTRUCTOR, })
// ElementType.METHOD, ElementType.FIELD})
// 여기서 타겟 ElementType.METHOD, ElementType.FIELD 두가지를 주석처리하고
// 다시 TestTarget 클래스를 살펴보자.
public @interface DefineAno {
// interface 앞에 간단히 @를 붙여주면 어노테이션 인터페이스가 만들어진다.
// anotation은 자신의 element 를 가질 수가 있다.
int numEl() default 1;
// int 형 element를 가지고 default 값은 1이다.
String strEl();
// String 형 element를 가지고 있다.
}
코드와 같이 기존 @Target으로 지정된 METHOD / FIELD를 주석 처리한 후 다시 어노테이션이 적용된 코드를 살펴보자.
결과적으로 이미지상의 코드 중 필드와 메서드 영역에 'The annotation @DefineAno is disallowed for this location' 이라는 컴파일 오류가 나타나는 것을 확인할 수 있다. 이는 @Target으로 해당 타입(영역)은 정의되지 않아서 어노테이션이 접근할 수 없다는 의미이다.