DevelopmentTools/Java

[programmers-java 중급] 어노테이션(Annotation)

수짱수짱 2022. 7. 18. 03:55

<어노테이션>

Java5에서 추가된 기능

 

  • 어노테이션 (Annotation)
    • 클래스 or 메소드 위에 붙여 사용 Ex) @Override
    • 소스코드에 메타코드(추가정보)를 주는 것
    • 클래스가 컴파일되거나 실행될 때 어노테이션의 유무나 어노테이션의 설정 값을 통하여 클래스가 다르게 실행될 수 있다.
    • 위의 이유로 어노테이션을 설정파일처럼 설명하는 경우도 존재
    • 자바가 직접 제공하는 어노테이션과 사용자가 직접 생성하는 어노테이션이 존재
      • 제공되어지는 어노테이션을 이용하는 경우가 더 많을 것 
      • 사용자가 직접 생성하는 어노테이션: Custom 어노테이션
        • 커스텀 어노테이션을 이용하는 방법
          • 1. 어노테이션 정의
            • 패키지 익스플로러 - new - Annotation 
            • 정의한 어노테이션을 JVM 실행시에 감지할 수 있도록 @Retention(RetentionPolicy.RUNTIME)을 붙여 주어야 한다.
          • 2. 어노테이션을 클래스에서 사용 (타겟에 적용)
            • 사용할 클래스나 메소드 위에 @어노테이션이름 을 붙여준다.
          • 3. 어노테이션을 이용하여 실행

 

1. 어노테이션 정의

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

@Retention(RetentionPolicy.RUNTIME)
public @interface Count100 {

}

 

2. 어노테이션을 클래스에서 사용 (타겟에 적용)

 

public class MyHello {	
    @Count100
    public void hello(){
    	System.out.println("hello");
    }
}

 

3. 어노테이션을 이용하여 실행

 

public class MyHelloExam {     // MyHello가 사용되는 클래스 정의
	public static void main(String[] args){
    	MyHello hello = new MyHello();  // MyHello 객체 생성
        
        try{
        	Method method = hello.getClass().getDeclaredMethod("hello");  // 메소드에 대한 정보를 알아보자. 
            // getClass는 Object 클래스가 가진 메소드. 해당 객체를 만들 때 사용한 class의 정보를 return하는 메소드
            // getDeclaredMethod는 클래스에 대한 정보를 얻고 그 정보로 부터 hello라는 이름의 메소드에 대한 정보를 return. 예외 처리가 필요한 메소드
            // 즉, method 객체는 hello에 대한 정보를 가진 것이다.
            
            if(method.isAnnotationPresent(Count100.class)){ 
            // isAnnotationPresent 메소드는 특정 어노테이션이 메소드에 적용되어 있는지 확인한다. 
            // 즉, Count100이라는 어노테이션을 적용하고 있는가에 대한 정보를 얻고 적용되어 있다면 true를 반환한다.
            	
            	for(int i=0; i<100; i++) hello.hello();  // hello가 가진 hello라는 메소드를 100번 호출
            }
            else{
            	hello.hello();
            }
        }
        catch(Exception e){ // 여러개 발생할 수 있는 예외를 Exception으로 한 번에 처리한다.
			e.printStackTrace();
		}
	}
}