JAVA/JAVA

어노테이션 Annotation (@)

호두밥 2021. 9. 26. 12:12

어노테이션

컴파일 및 실행 과정에서 코드를 어떻게 컴파일하고 처리할 지를 알려주는 메타데이터 정보 

@Annotation

어노테이션의 용도

  • 컴파일러에게 코드 문법 에러를 체크하도록 정보를 제공
  • 소프트웨어 개발 툴이 빌드나 배치 시 코드를 자동으로 생성할 수 있도록 정보를 제공
  • 실행 시(런타임 시) 특정 기능을 실행하도록 정보를 제공

어노테이션 정의와 사용

어노테이션은 element를 가질 수 있음. 

element는 타입과 이름으로 구성되어 있고, default값을 가질 수 있음.

public @interface AnnotationName{
	String elementName1();
    	String elementName2() default "Manta.Ray";    
}

 

public class AnnotationTest {

	@AnnotationName(elementName1 = "Study")
	public class test1{
		
	}
	@AnnotationName(elementName1 = "Study", elementName2 = "Manta")
	public class test2{
		
	}
}

* elementName2는 default 값이 있기 때문에 생략 가능함.

 

어노테이션은 기본 element인 value를 가질 수 있음.

public @interface AnnotationName2 {	
	String value();
}
@AnnotationName2("Manta")
public void test3(){
   
}

어노테이션 적용 대상


java.lang.annotation.ElementType에 정의되어 있음.

@Target을 이용해 정의함.

 

ElementType Enum 적용 대상
TYPE Class, interface (including annotation type), enum, or record
FIELD Field
METHOD Method
PARAMETER Formal parameter
CONSTRUCTOR Constructor
LOCAL_VARIABLE Local variable
ANNOTATION_TYPE Annotation type
PACKAGE Package
TYPE_PARAMETER Type parameter
TYPE_USE Use of a type
MODULE Module
@Target({ElementType.ANNOTATION_TYPE, ElementType.METHOD})
public @interface AnnotationName{
	String elementName1();
   	String elementName2() default "Manta.Ray";    
}

어노테이션 유지정책

어노테이션을 소스 상에서만 유지할 것인지, 컴파일된 클래스까지 유지할 것인지, 런타임 시에도 유지할 것인지를 지정하는 기능

java.lang.annotation.RetentionPolicy에 정의되어 있음.

@Retention을 이용해 정의함.

RetentionPolicy Enum 설명
SOURCE 소스 상에서만 어노테이션 정보를 유지한다.
CLASS 컴파일된 클래스 파일까지 어노테이션 정보를 유지한다.
RUNTIME 런타임 시에도 어노테이션 정보를 유지한다.
리플랙션을 통해 런타임 시에 클래스의 메타정보를 읽을 수 있다.
@Target({ElementType.ANNOTATION_TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnotationName{
	String elementName1();
    	String elementName2() default "Manta.Ray";    
}

리플랙션

필드, 생성자, 메소드 등에 적용된 어노테이션 정보를 얻을 수 있는 패키지.

java.lang.reflect

① java.lang.Class를 이용해 Field, Constructor, Method 타입의 배열을 얻는다.

② 각  Field, Constructor, Method 가 갖고 있는 getAnnotation 메소드를 호출해서 어노테이션 정보를 얻는다.

java.lang.Class Method Name Return Type 설명
getFields() Field[] 필드 객체를 배열로 리턴
getConstructors() Constructor[] 생성자 객체를 배열로 리턴
getDeclaredMethods() Mehtod[] 메소드 객체를 배열로 리턴
java.lang.Reflect.Method Return Type 설명
isAnnotationPresent(Class<? extends Annotation> annotationClass) boolean 지정한 어노테이션이 적용되었는지 여부. 
getAnnotation(Class<T> annotationClass) Annotation 지정한 어노테이션이 적용되어있으면 어노테이션을 리턴하고, 그렇지 않으면 null을 리턴
getAnnotations() Annotation[] 적용된 모든 어노테이션을 리턴한다.
getDeclaredAnnotations() Annotation[] 직접 적용된 모든 어노테이션을 리턴한다.

 

[어노테이션]

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.ANNOTATION_TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnotationName{
	String elementName1();
    String elementName2() default "Manta.Ray";    
}

[어노테이션 정보 출력]

import java.lang.reflect.Method;

public class AnnotationTest {

	@AnnotationName(elementName1 = "test1")
	public void test1(){
		System.out.println("test 1 실행");
	}
	@AnnotationName(elementName1 = "test2", elementName2 = "Manta")
	public void test2(){
		System.out.println("test 2 실행");
	}
	
	public static void main(String[] args) {
		
		AnnotationTest at = new AnnotationTest();
		
		Method[] methods = at.getClass().getDeclaredMethods();

		for (Method method : methods) {
		
			System.out.println(method.toString());
			//어노테이션 정보 출력
			if(method.isAnnotationPresent(AnnotationName.class)) {
				AnnotationName an = method.getAnnotation(AnnotationName.class);
				System.out.printf("elementName1 = %s, elementName2 = %s\n" ,
					an.elementName1(),
					an.elementName2());
			}
		}
	}
}
public static void level3.AnnotationTest.main(java.lang.String[])
public void level3.AnnotationTest.test1()
elementName1 = test1, elementName2 = Manta.Ray
public void level3.AnnotationTest.test2()
elementName1 = test2, elementName2 = Manta

 

출처

신용권, 이것이 자바다, 한빛미디어

'JAVA > JAVA' 카테고리의 다른 글

Objects 클래스  (0) 2021.09.28
Object Class  (0) 2021.09.28
java.lang 패키지  (0) 2021.09.27
데이터 타입 Data Type  (0) 2021.09.24
NaN과 Infinity  (0) 2021.09.24