[Java] 자바 어노테이션 Annotation @Target 알아보기.

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으로 해당 타입(영역)은 정의되지 않아서 어노테이션이 접근할 수 없다는 의미이다.