애노테이션

수호천사임다·2024년 10월 1일

자바

목록 보기
2/15

애노테이션 ?

애노테이션은 향후 특정 상황에서 데이터를 쉽게 활용할 수 있도록 소스 코드에 추가적인 정보를 제공해주는 메타 데이터(metadata) 어노테이션은 컴파일 할 때 나, 런타임 시에 해석될 수 있다.
어노테이션은 자바 1.5부터 제공

애노테이션 사용 목적

컴파일러 지시: 컴파일러에게 특정 검사를 요청.
런타임 처리: 리플렉션을 통해 어노테이션을 읽어 동작을 제어.
프레임워크 지원: 스프링 같은 프레임워크에서 객체 관리나 설정에 활용.

기본 어노테이션

@Override: 상위 클래스의 메서드를 오버라이드할 때 사용한다.
@Deprecated: 더 이상 사용하지 않는 코드에 붙여, 사용을 경고한다.
@SuppressWarnings: 특정 컴파일러 경고를 무시할 때 사용한다.
@SafeVarargs: 제네릭 같은 가변인자 매개변수를 사용할 때 경고를 무시한다.(자바 7이상)
@FunctionalInterface: 람다식을 위한 함수형 인터페이스를 지정한다. 메소드가 없거나 두개 이상 되면 컴파일 오류가 발생한다.(자바 8이상)

메타 애노테이션

어노테이션을 정의할 때 사용되는 어노테이션이다.

@Retention: 어노테이션이 유지되는 기간을 정의 (소스, 클래스, 런타임).
@Target: 어노테이션이 적용될 위치를 지정 (메서드, 필드 등).
@Inherited: 상속 시 자식 클래스가 부모 클래스의 어노테이션을 상속받도록 설정.
@Documented: 문서화에 포함되도록 설정.

기본 애노테이션 사용 예시

class User {
	@Override
	public String toString() {
		return "애노테이션 예제...";
	}
	
	//@Deprecated : 개선된 메소드가 있음을 나타낼 대 주로 사용 
	@Deprecated
	public void sub1() {
		System.out.println("사용하면 안된다.");
	}
	
	//@SuppressWarnings() : 이 부분에는 경고문을 출력하지 말라는 애노테이션
	@SuppressWarnings("deprecation")
	public void sub2() {
		Date date = new Date();
		int y = date.getYear() + 1900;
		System.out.println("년도 : " + y);
	}
}

사용자 정의 애노테이션 사용 예시

// 사용자 정의 애노테이션 
@Target(ElementType.METHOD) // 이 애노테이션이 메서드에 적용될 수 있음을 지정
@Retention(RetentionPolicy.RUNTIME) // 애노테이션 유지 시점 설정
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Method;

public class Ex03 {
	
	public static void main(String[] args) {
		PrintService obj = new PrintService();
		obj.sub1();
		System.out.println();
		
		Method[] mm = PrintService.class.getDeclaredMethods();
// PrintService 클래스에 선언된 모든 메서드를 Method 배열로 가져옴

		
		for (Method m : mm) {
			if(m.isAnnotationPresent(PrintAnnotaion.class)) {
// 각 메서드에 @PrintAnnotaion 애노테이션이 붙어 있는지 확인

				PrintAnnotaion pa = m.getAnnotation(PrintAnnotaion.class);
// 애노테이션이 붙어 있다면 그 애노테이션 정보를 가져옴

				
				System.out.println("[" + m.getName() + "]");
				
				for(int i = 0; i < pa.number(); i++) {
					System.out.print(pa.value());
				}
				System.out.println();
				
				try {
					// 메소드 호출
					m.invoke(obj);
				} catch (Exception e) {
				}
			}
		}
		obj.sub4();
		
	}
}

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@interface PrintAnnotaion {
	public String value() default "-";

	public int number() default 15;
}

class PrintService {
	@PrintAnnotaion("*")
	public void sub1() {
		System.out.println("실행 - 1");
	}
	
	@PrintAnnotaion("-")
	public void sub2() {
		System.out.println("실행 - 2");
	}
	
	@PrintAnnotaion(value ="#", number = 20)
	public void sub3() {
		System.out.println("실행 - 3");
	}
	
	public void sub4() {
		System.out.println("애노테이션 없음..");
	}
}

0개의 댓글