본문 바로가기

IT/Programming Language

[Java] 어노테이션 (Annotation)

반응형
  • 에노테이션은 주석이라는 의미를 가진다.
  • 자바 소스 코드에 사이에 @ 기호를 앞에 붙여서 사용하는데, JDK 1.5 버전 이상에서 사용 가능하다.

 

Annotation 용도

  • 컴파일러에게 코드 작성 문법 에러를 체크하도록 정보를 제공
  • 소프트웨어 개발툴이 빌드나 배치시 코드를 자동으로 생성할 수 있도록 정보 제공
  • 실행시(런타임시)특정 기능을 실행하도록 정보를 제공

 

내장 Annotation

7개의 표준 어노테이션 중에 3개가 java.lang의 일부이며, 나머지 4개는 java.lang.annotation으로부터 가져온다.

 

java code에 적용되는 Annotation

Annotation Description
@Override
  • 선언한 메서드가 오버라이드 되었다는 것을 나타냄
  • 만약 상위(부모) 클래스(또는 인터페이스)에서 해당 메서드를 찾을 수 없다면 컴파일 에러 발생
@Deprecated
  • 해당 메서드가 더 이상 사용되지 않음을 표시
  • 만약 사용할 경우 컴파일 경고 발생
@SuppressWarnings
  • 선언한 곳의 컴파일 경고를 무시
@SafeVarargs
  • Java7 부터 지원하며, 제너릭 같은 가변인자의 매개변수를 사용할 때의 경고를 무시
@FunctionalInterface
  • Java8 부터 지원하며, 함수형 인터페이스를 지정하는 annotation
  • 만약 메서드가 존재하지 않거나, 1개 이상의 메서드(default 메서드 제외)가 존재할 경우 컴파일 오류 발생

 

 

기타 annotation에 적용되는 annotation (meta annotation)

Annotation Description
@Retention
  • 컴파일러가 어노테이션을 다루는 방법을 기술하며, 특정 시점까지 영향을 미치는지를 결정
  • 종류
    1) RetentionPolicy.SOURCE : 컴파일 전까지만 유효. (컴파일 이후에는 사라짐)
    2) RetentionPolicy.CLASS : 컴파일러가 클래스를 참조할 때까지 유효.
    3) RetentionPolicy.RUNTIME : 컴파일 이후에도 JVM에 의해 계속 참조가 가능. (리플렉션 사용)
@Documented
  • 해당 어노테이션을 Javadoc에 포함시킴
@Target
  • 어노테이션이 적용할 위치를 선택
  • 종류
    1) ElementType.PACKAGE : 패키지 선언
    2) ElementType.TYPE : 타입 선언
    3) ElementType.ANNOTATION_TYPE : 어노테이션 타입 선언
    4) ElementType.CONSTRUCTOR : 생성자 선언
    5) ElementType.FIELD : 멤버 변수 선언
    6) ElementType.LOCAL_VARIABLE : 지역 변수 선언
    7) ElementType.METHOD : 메서드 선언
    8) ElementType.PARAMETER : 전달인자 선언
    9) ElementType.TYPE_PARAMETER : 전달인자 타입 선언
    10) ElementType.TYPE_USE : 타입 선언
@Inherited
  • annotation의 상속을 가능하게 함
@Repeatable
  • Java8 부터 지원하며, 연속적으로 어노테이션을 선언할 수 있게 해줌

 

 

Custom Annotation

커스텀 어노테이션을 이용하는 방법

1) 어노테이션을 정의한다.
2) 어노테이션을 클래스에서 사용한다. (타겟에 적용)
3) 어노테이션을 이용하는 코드를 수행한다.

 

 

annotation 생성

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

@Retention(RetentionPolicy.RUNTIME)    // 런타임중에도 유효한 어노테이션임을 기술
public @interface Count100 {        // 어노테이션은 @interface 인터페이스명으로 정의
}

 

 

custom annotation을 method에 적용

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

 

 

annotation이 적용된 부분인지 체크하여 코드 내에서 사용

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");
        if(method.isAnnotationPresent(Count100.class)){
                for(int i = 0; i < 100; i++){
                    hello.hello();
                }
            }else{
                hello.hello();
            }
        }catch(Exception ex){
            ex.printStackTrace();
        }       
    }
}

 

우아한 형제들에서 사용하는 커스텀 어노테이션 예제

https://techblog.woowahan.com/2684/

반응형