[Java] 자바 어노테이션 Annotation 선언과 엘리먼트 타입.

2021-02-04


자바에서 Annotation이라는 주석과 같은 형태로 사용되는 코드가 있다. 흔히 상속 간에 메서드 재정의에서 사용되는 @Override가 대표적인 어노테이션이라고 할 수 있다. 오늘은 이 어노테이션의 선언과 엘리먼트 타입을 간단히 알아보도록 하자.


  • 우선 선언하는 방법을 알아보도록 하자.

package aAnotation;

public @interface DefineAno {
	// interface 앞에 간단히 @를 붙여주면 어노테이션 인터페이스가 만들어진다.
	// anotation은 자신의 element 를 가질 수가 있다.
	
	int numEl() default 1; 
	// int 형 element를 가지고 default 값은 1이다.
	String strEl();
	// String 형 element를 가지고 있다.
	
}

 

코드와 같이 interface와 비슷한 형태를 가지고 있다. 다른 점은 어노테이션임을 알리기 위해 interface 앞에 @를 붙여준다는 점이다. 그 뒤 어노테이션의 이름을 지정해주면 되는데, 해당 어노테이션을 사용하면 '@DefineAno(엘리먼트 값)' 같은 형태로 사용이 될 것이다. 엘리먼트로는 기본 타입으로 두 가지를 선언해 주었으며, numEl의 경우에는 default 값으로 1을 가지고 있고 strEl은 단순 엘리먼트만 선언되어 있다. 


  • 실제 메소드 위에 어노테이션을 작성해보자

package aAnotation;

public class Test {

	@DefineAno(strEl = "a")
	// numEl은 default(정수 '1' ) 값이 있기 때문에 따로 매개값을 주지 않아도 된다.
	// strEl은 초기 default 값이 없어 초기값은 매개값으로 넣어주어야한다.
	// strEl의 매개값을 주지 않을 경우에는 compile시 오류가 발생한다.
	public void out1() {
		// 엘리먼트를 통해서 자바의 런타임(동작)동안 필요한 메타데이터를 얻을 수도 있다.
		// 이를 리플렉션이라고도 한다.
	}
}	

 

코드에서 보듯이 메소 드위에 기존에 만들었던 어노테이션 DefineAno를 선언해주었으며, 매개 값으로 엘리먼트 값 strEl의 초기값을 세팅해 주었다. 여기서 중요한 점은 default 값이 이미 어노테이션 내부에서 정의되어 있을 경우에는 따로 어노테이션 선언 시 초기값 세팅을 해주지 않아도 된다.(물론 필요하면 다시 초기값을 셋팅할 수 있다.)  반면 strEl은 단순 엘리먼트만 선언해주어 초기값을 세팅하지 않을 시 컴파일 오류가 발생하고 만다. ( 참고 : 엘리먼트의 기능은 자바 프로그램의 실행 또는 동작간 필요한 메타데이터의 정보를 얻는 용도로 사용한다.)


  • 엘리먼트 Value 

package aAnotation;

public @interface DefineAno2 {	
	int numEl() default 1; 
	// int 형 element를 가지고 default 값은 1이다.
	String value();
	// String 형 element를 가지고 있다.
	// 기본 엘리먼트 value;
	// 기본엘리먼트의 경우 매개값으로 줄떄 변수명은 제외하고
	// 값(데이터) 줄 수가 있다.
}

 

엘리먼트에는 특이한 형태인 기본 엘리먼트 value가 있다. 해당 엘리먼트의 특징은 어노테이션 사용시 DefineAno2 (value = ' 값 ') 의 형태가 아닌 DefineAno2(' 값 ')과 같은 형태로 초기값을 세팅해 줄 수 있다는 점이다. 아래는 그 예이다.

package aAnotation;

public class Test {

	@DefineAno2("a")
	// 단 엘리먼트의 값을 두개 이상 지정할때에는 반드시
	// 엘리먼트 value의 값을 넣어 준다는 것을 명시해 주어야한다.
	// @DefineAno2(value = "a", numEl = 10)
	// 위 처럼 작성해주어야 한다.
	public void out2() {
	}
	
}

 

다만 여기서 중요한 점은 초기화 해주어야 하는 엘리먼트가 2개 이상일 경우이다. vlaue 엘리먼트 또한 주석에 적어 작성해 두었듯이 @DefineAno2(value = "a", numEl = 10)와 같은 형태로 value 값을 명시적으로 작성해 주어야 한다. 이 경우 해당 value를 명시하지 않을 경우 역시 컴파일 상에 오류가 발생하게 된다.