애너테이션(Annatation)

Nak Jun Choi·2022년 11월 14일

애너테이션이란?

  • 개발자 입장에서 스스로 좀 더 직관적으고 빠르게 코드를 이해하고, 다른 개발자와의 협업의 과정에서 해당 코드를 설명하는 정보를 제공하는 역할
  • '주석'은 소스 코드를 읽는 '사람'에게 정보를 제공하고, '애너테이션'은 특정 코드를 사용하는 '프로그램'에게 정보를 전달한다.

애너테이션의 용도와 종류

애너테이션의 용도

  • 컴파일러에게 문법 에러를 체크하도록 정보를 제공한다.
  • 프로그램을 빌드할 때 코드를 자동으로 생성할 수 있도록 정보를 제공한다.
  • 런타임에 특정 기능을 실행하도록 정보를 제공한다.
@Test // 아래 메서드가 테스트 대상임을 테스트 프로그램에게 알리는 애너테이션
public void run() {...생략...}

public void stop() {...생략...}
  • 애너테이션은 해당 테스트를 수행하는 프로그램 외의 다른 프로그램들에게는 아무런 영향을 주지 않는다.

애너테이션의 종류

  • 애너테이션은 2종류가 있다.

    • 표준 애너테이션 (자바에서 기본적으로 제공하는 애너테이션)
    • 메타 애너테이션 (애너테이션을 붙이는 애너테이션으로, 애너테이션을 정의하는 데에 사용된다.)

    표준 애너테이션

@Overide

  • 상위 클래스의 메서드를 오버라이딩하는 메서드라는 것을 컴파일러에게 알려주는 역할이다.
  • 많은 경우 애너테이션은 자바 컴파일러에게 어떤 정보를 제공하기 위한 역할을 담당한다.

@Deprecated

  • 더 이상 사용하지 않는 필드나 메서드가 있는 경우에 애너테이션이 붙은 대상이 새로운 것으로 대체되었으니 기존의 것을 사용하지 않을 것을 권장하는데 사용된다. (하위 버전 호환성 문제로 삭제하기 곤란해 남겨두어야만 하지만 더 이상 사용하는 것을 권장하지 않을 때)

@SuppressWarnings

  • 컴파일 경고 메시지가 나타나지 않도록 한다.

@FunctionallInterface

  • 컴파일러가 함수형 인터페이스의 선언이 바르게 선언되었는 지 확인하도록 한다.
  • 함수형 인터페이스는 단 하나의 추상 메서드만을 가져야하는 제약이 있다.
@FunctionalInterface
public interface Runnable {
	public abstract void run (); // 하나의 추상 메서드
}

메타 애너테이션

@Target

  • 애너테이션을 적용할 "대상"을 지정하는 데 사용된다.
  • @Target 앤너테이션을 통해 사용자가 정의한 애너테이션이 어디까지 적용되는 지를 설정할 수 있다.
import static java.lang.annotation.ElementType.*; 
//import문을 이용하여 ElementType.TYPE 대신 TYPE과 같이 간단히 작성할 수 있다.

@Target({FIELD, TYPE, TYPE_USE})	// 적용대상이 FIELD, TYPE
public @interface CustomAnnotation { }	// CustomAnnotation을 정의

@CustomAnnotation	// 적용대상이 TYPE인 경우
class Main {
    
		@CustomAnnotation	// 적용대상이 FIELD인 경우
    int i;
}

@Documented

  • 애너테이션에 대한 정보가 javadoc으로 작성한 문서에 포함되도록 하는 애너테이션 설정이다.
@Documented
@Target(ElementType.Type)
public @interface CustomAnnotation { }

@Inherited

  • 하위 클래스가 애너테이션을 상속받도록 한다. @Inherited 애너테이션을 상위 클래스에 붙이면, 하위 클래스도 상위 클래스에 붙은 애너테이션들이 동일하게 적용 된다.
@Inherited // @SuperAnnotation이 하위 클래스까지 적용
@interface SuperAnnotation{ }

@SuperAnnotation
class Super { }

class Sub extends Super{ } // Sub에 애너테이션이 붙은 것으로 인식

@Retention

  • 특정 애너테이션의 지속 시간을 결정하는 데 사용한다.
  • 애너테이션과 관련한 유지 정책은 세 가지가 있다.
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE) 
//오버라이딩이 제대로 되었는지 컴파일러가 확인하는 용도 
//클래스 파일에 남길 필요 없이 컴파일시에만 확인하고 사라짐
public @interface Override(){ }

@Repeatable

  • 애너테이션을 여러 번 붙일 수 있도록 허용한다는 의미를 가지고 있다
@interface Works {  // 여러개의 ToDo애너테이션을 담을 컨테이너 애너테이션 ToDos
    Work[] value(); 
}

@Repeatable(Works.class) // 컨테이너 애너테이션 지정 
@interface Work {
	String value();
}
  • 일반적인 애너테이션과 달리 같은 이름의 애너테이션이 여러번 적용될 수 있기 때문에, 이 애너테이션들을 하나로 묶어주는 애너테이션도 별도로 작성해야 한다.

사용자 정의 애너테이션

  • 사용자가 직접 애너테이션을 정의해서 사용하는 것을 의미한다.
@interface 애너테이션명 { // 인터페이스 앞에 @기호만 붙이면 애너테이션을 정의할 수 있습니다. 
	타입 요소명(); // 애너테이션 요소를 선언
}
  • 애너테이션은 java.lang.annotation 인터페이스를 상속받기 때문에 다른 클래스나 인터페이스를 상속 받을 수 없다.
profile
HelloWorld

0개의 댓글