만자의 개발일지

[Java] Annotation 이란 본문

Java/Java

[Java] Annotation 이란

박만자 2022. 1. 18. 16:01

Annotation

어노테이션은 Java5에 추가된 기능으로 사전적 의미로는 주석을 뜻합니다. 이 어노테이션으로 인해 데이터의 유효성 검사 등을 쉽게 알 수 있고, 코드를 더 깔끔하게 해주는 효과가 있습니다. 무엇보다 가장 큰 비중은 소스코드에 메타 데이터를 삽입하는 것이라고 볼 수 있습니다.
메타 데이터: 데이터를 설명하기 위한 데이터이다. 예를 들어 사진에 날짜와 시간, 위치 같은 데이터를 메타 데이터라고 볼 수 있다.

어노테이션의 사용 용도는 크게 3가지 입니다.

  • 컴파일러에게 코드 문법 에러를 체크하도록 정보를 제공
  • 빌드나 배치시 코드를 자동으로 생성할 수 있도록 정보 제공
  • 실행시(Runtime) 특정 기능을 실행하도록 정보를 제공

 

Java에서 기본적으로 제공하는 어노테이션

java.lang
@Override - 해당 메서드가 오버라이드된 메서드라는 것을 명시합니다.
- 부모 클래스 혹은 인터페이스에서 해당 메서드를 찾을 수 없다면 컴파일 에러를 발생 시킵니다.
@FunctionalInterface - 해당 인터페이스가 함수형 인터페이스라는 것을 명시합니다.
- 메서드가 존재하지 않거나, default, static 메서드를 제외한 2개 이상의 메서드가 존재할 경우 컴파일 오류를 발생 시킵니다.
@Deprecated - 해당 메서드가 더 이상 사용되지 않음을 표시합니다.
- 사용할 경우 컴파일 경고를 발생 시킵니다.
@SuppressWarnings - 선언한 곳의 컴파일 경고를 무시합니다.
@SafeVarargs - Generic 같은 가변인자의 매개변수를 사용할 때의 경고를 무시합니다.

java.lang.annotation
@Retention - 컴파일 시 어노테이션을 어느 시점 까지 유지할 것인지 결정합니다.
@Target - 어노테이션을 어디에 적용할 것인지를 지정합니다.
@Inherited - 어노테이션의 상속을 가능하게 합니다.
@Documented - 해당 어노테이션을 Javadoc에 포함시킵니다.
@Native - 해당 어노테이션을 네이티브 코드로 선언합니다.
@Repeatable - 연속적으로 어노테이션을 선언할 수 있게 해줍니다.

 

 

Annotation 구현

 

[ TestAnnotation.java ]

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

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface TestAnnotation {
	
	String value() default "hello";
	int number() default 10;
	
	
}

 

[ AnnotationTest.java ] 

public class AnnotationTest {
	
	@TestAnnotation
	public void methodA() {
		System.out.println("methodA");
	}
	
	@TestAnnotation(value = "hi")
	public void methodB() {
		System.out.println("methodB");
	}
	
	@TestAnnotation(value = "hola", number = 1004)
	public void methodC() {
		System.out.println("methodC");
	}
	
}

[ Main.java ]

import java.lang.reflect.Method;

public class Main {
	
	public static void main(String[] args) {
		
		Method[] methods = AnnotationTest.class.getMethods();
		
		for(Method method : methods) {
			//@TestAnnotation이 적용된 메소드라면
			if(method.isAnnotationPresent(TestAnnotation.class)) {
			
				System.out.println(method.getName());
				//적용된 어노테이션 중 @TestAnnotation을 반환
				TestAnnotation annotation = method.getDeclaredAnnotation(TestAnnotation.class);
				
				System.out.println(annotation.value());
				
				System.out.println(annotation.number());
			
			}
			
		}
		
	}
	
}

 

실행 결과

methodA
hello
10
methodB
hi
10
methodC
hola
1004

 

참고

Comments