- Annotation 이란?
-
사전적 의미로는 "주석"을 말한다 그래서 코드의 주석으로도 사용한다.
-
특정 기능을 수행하는 주석(Annotation)으로 사용 될 수 있다.
-
사용자가 직접 Annotation을 만들어 정의 할 수 있다.
- Annotation 분류
<빌트인(Built-in) 어노테이션>
-
SDK에 내장되어 있는 기본 Annotation을 말한다.
-
@Override, @Deprecated, @SupressWarning 등 처럼 주석으로 사용할 수 있다.
@Override : 부모 Class스의 메소드를 오버라이딩한 메소드를 명시한다(컴파일러시에 확인한다.)
@Deprecated : 더 이상 사용되지 말아야하는 메소드를 의미한다.
@SupressWarning : 경고를 제거하는 에노테이션이다.
<커스텀(Custom) 어노테이션>
-
Annotation을 사용자가 정의하여 사용 하는 Annotation이다.
-
@interface 키워드로 정의한다.
ElementType | 설명 |
TYPE | Class, Interfacem, enum 에서 사용 한다는 의미이다. |
FIELD | 프로퍼티 에서 사용 |
METHOD | 메소드 에서 사용 |
PARAMETER | 메서드 파라미터 에서 사용 |
CONSTRUCTOR | 생성자 에서 사용 |
LOCAL_VARIAVLE | 로컬변수 또는 Catch문 에서 사용 |
ANNOTATION_TYPE | 어노테이션(메타 어노테이션) 에서 사용 |
PACKAGE | 자바 패키지 에서 사용 |
RetentionPolicy | 설명 |
SOURCE | 어노테이션을 커파일러이러에 의해 버려짐 |
CLASS | 어노테이션이 클래스파일 저장되지만 JVM에게 무시됨 |
RUNTIME | 어노테이션이 클래스파일에 저장되며, JVM에 의해 읽혀짐 |
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String value() default "jk";
int number() default 13;
}
-
Custom Annotation을 정의한다.
-
@Target 어노테이션은 Custom Annotation을 어디에서 사용될 것인지를 정의한다.
- @Retention 어노테이션은 JAVA 컴파일러가 어노테이션을 어느 시점까지 보유(사용) 할 것인지를 정의한다.
public class AnnotationTest {
@MyAnnotation
public void method1 (String test, int test2) {
System.out.println("test1");
System.out.println(test);
System.out.println(test2);
}
@MyAnnotation("jk2")
public void method2 (String test, int test2) {
System.out.println("test2");
System.out.println(test);
System.out.println(test2);
}
@MyAnnotation(value="jk3", number=33)
public void method3 (String test, int test2) {
System.out.println("test3");
System.out.println(test);
System.out.println(test2);
}
}
- Custom Annotation을 사용한 Class 를 정의한다. 하지만 의미있는 동작을 하기 위해서는 JAVA 의 Reflect를 사용하여 구현 해야한다.
public class AnnotationExample {
public static void main(String[] args) {
// Class 의 메소드를 얻어온다
// return Type은 Method[] 이다
Method[] methods = AnnotationTest.class.getDeclaredMethods();
for (Method method : methods) {
// 각각 method에 MyAnnotation 어노테이션이 있는지 확인한다.
if (method.isAnnotationPresent(MyAnnotation.class)) {
// MyAnnotation 객체 를 가져온다
MyAnnotation myAnnotation = method.getAnnotation(MyAnnotation.class);
// method 이름
System.out.println(method.getName() + "=> value : " + myAnnotation.value() + " , number : " + myAnnotation.number());
// invoke()로 method를 실행 시킨다.
try {
// method 를 실행 시키고 값을 넘겨 준다.
method.invoke(new AnnotationTest(), myAnnotation.value(), myAnnotation.number());
} catch (Exception e) {
// TODO: handle exception
}
}
}
}
}
1. getDeclaredMethods() 을 사용하여 Class의 Method를 가져온다 (java.lang.reflect.Method)
2. isisAnnotationPresent("찾는 어노테이션 Class")을 사용하여 어노테이션 이 정의 되어있는지 확인한다.
3. getAnnotation("찾는 어노테이션 Class") 사용하여 어노테이션 객체를 가져온다.
4 invoke() 를 사용하여 메소드를 실행 시킨다.
- 잡담
Spring, Spring Boot 를 하다보면 여러 Annotation들을 사용하는데 사실 어떡게 돌아가는지 생각해보지 안고 그냥 사용 했던 것 같다. 항상 어떡게 동작하는지 궁굼해서 이번기회에 알아보고자 JAVA의 Annotation을 공부하면서 대충 어떡게 돌아갈지 예상할 수 있게 되었다. 물론 Spring 쪽 공부를 하면서 안쪽까지 까봐야 정확하겠지만.... 그 내용은 차 후 공부 후 정리 하도록 하겠습니다.
'Tech > Java' 카테고리의 다른 글
Java Thread, Multi Thread (0) | 2020.06.04 |
---|---|
싱글톤 패턴(Singleton Pattern) (0) | 2020.06.02 |
Java 자료구조 - List, Set, Map (1) | 2020.05.30 |
Java 자료구조 - Queue (0) | 2020.05.25 |
Java 자료구조 - Stack (0) | 2020.05.25 |
댓글