애노테이션은 향후 특정 상황에서 데이터를 쉽게 활용할 수 있도록 소스 코드에 추가적인 정보를 제공해주는 메타 데이터(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("애노테이션 없음..");
}
}