본문 바로가기
Tech/Java

Java Annotation (어노테이션)

by Dog발자. 2020. 6. 3.
반응형

- 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

댓글