java - 어노테이션

이유석·2022년 11월 8일
0
post-thumbnail

어노테이션

  • 어노테이션은 Java5에 추가된 기능
  • 어노테이션은 클래스나 메소드위에 붙습니다. @(at)기호로 이름이 시작합니다.
  • 프로그램에게 추가적인 정보를 제공해주는 메타데이터 이며 특별한 의미 및 기능을 수행하도록 하는 기술입니다.

어노테이션 종류

표준(내장) 어노테이션

  • 자바가 기본적으로 제공해주는 어노테이션
  • @Override : 오버라이딩을 올바르게 했는지 컴파일러가 체크한다.
  • @Deprecated : 앞으로 사용하지 않을 것을 권장하는 필드나 메서드에 붙인다.
  • @FunctionalInterface : 함수형 인터페이스에 붙이면, 컴파일러가 올바르게 작성했는지 체크한다.
  • @SuppressWarnings : 컴파일러의 경고 메시지가 나타나지 않게 한다.

메타 어노테이션

  • 어노테이션을 위한 어노테이션

  • @Target : 어노테이션을 정의할 때 적용대상을 지정하는데 사용한다.

  • @Retention : 어노테이션이 유지되는 기간을 지정하는데 사용한다.

  • @Documented : javadoc으로 작성한 문서에 포함시키려면 해당 어노테이션을 붙인다.

  • @Inherited : 어노테이션을 자손 클래스에 상속하고자 할 때 사용한다.

  • @Repetable : 반복해서 붙일 수 있는 어노테이션을 정의할 때 사용한다.

커스텀 어노테이션

  • 사용자가 직접 작성하는 어노테이션을 Custom 어노테이션이라고 말합니다.

  • 커스텀 어노테이션 생성하는 방법 - 예제

    1. 패키지 익스플로러에서 [new - Annotation]을 이용하여 Count100이라는 어노테이션 생성
    2. Count100어노테이션을 JVM실행시에 감지할 수 있도록 하려면
      @Retention(RetentionPolicy.RUNTIME)를 붙여줘야 합니다.
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

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

}
  • "hello"를 출력하는 hello()메소드를 가지는 MyHello라는 클래스를 작성
    • hello메소드 위에 @Count100 어노테이션을 붙힙니다.
public class MyHello {
   @Count100
   public void hello(){
       System.out.println("hello");
    }
}
  • MyHello클래스를 이용하는 MyHelloExam클래스를 작성
    • MyHello의 hello메소드가 @Count100어노테이션이 설정되어 있을 경우, hello()메소드를 100번 호출하도록 합니다.
import java.lang.reflect.Method;

public class MyHelloExam {
     public static void main(String[] args) {
        MyHello hello = new MyHello();

       try{
           Method method = hello.getClass().getDeclaredMethod("hello"); // 해당 클래스에 선언된 hello 로 선언된 메서드를 받아온다.
           if(method.isAnnotationPresent(Count100.class)){ // 해당 메서드에 Count100 이라는 어노테이션이 설정되어 있다면
                for(int i = 0; i < 100; i++){
                   hello.hello();
                }
           }else{
                    hello.hello();
           }
       }catch(Exception ex){
                ex.printStackTrace();
       }       
    }
}
profile
https://github.com/yuseogi0218

0개의 댓글