어노테이션
컴파일 및 실행 과정에서 코드를 어떻게 컴파일하고 처리할 지를 알려주는 메타데이터 정보
@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 |