Java Annotation

김성호·2023년 1월 23일
0

Java

목록 보기
5/6

Annotation이란?

사전에서의 의미는 주석이다.
자바 소스 코드에 추가하여 사용할 수 있는 메타데이터의 일종이다. JDK 1.5버전 이상에서 사용 가능하다.
@interface 키워드를 통해 정의 할 수 있다.

Annotation의 기능

  • Compiler-time checks : 컴파일러에게 클래스나 메소드의 목적에 관한 정보를 제공한다.
  • Code generation : @Getter, @Setter처럼 클래스 내부에 코드를 자동으로 생성할 수 있다.
  • Runtime behavior : Java Server Faces(JSF*) 응용 프로그램에 의해 특정 클래스가 관리되는 Bean으로 처리되어야 한다는 것과 런타임 환경에 정보를 제공하는데 사용할 수 있다.
  • External tools : IDE, 코드 분석 tool과 같은 외부 tool에서 추가 기능을 제공하거나 코드를 검증하는데 사용할 수 있다.

    Java Server Faces(JSF) : JavaEE의 파트 중 하나로 웹 어플리케이션의 UI를 만들기 위한 자바 기반의 웹 어플리케이션 프레임워크이다.

Annotation의 규칙

  1. 어노테이션은 "@"으로 시작해야 한다.
  2. 어노테이션의 요소는 메소드로 정의되며 이름은 소문자로 시작해야하고 매개 변수는 없어야 한다.
  3. 어노테이션의 멤버변수는 기본 값을 가질 수 있으며, 어노테이션 사용 중에 값이 지정되지 않을 경우 사용된다.
  4. 어노테이션의 멤버변수의 타입은 원시타입, String, enum, 어노테이션, Class 그리고 이 타입들의 array만 허용된다.
  5. java.lang.Annotation이외의 수퍼 클래스는 있을 수 없다.
  6. 어노테이션의 타입은 final 혹은 abstract일 수 없다.
  7. 어노테이션의 인스턴스는 클래스, 메소드, 필드, 변수 처럼 자바 프로그램의 여러 요소에 적용될 수 있다.
  8. 어노테이션의 사용은 reflection을 이용해 런타임 때 읽힐 수 있다.

Annotation의 종류

  1. 표준(내장) 어노테이션 : 자바가 기본적으로 제공하는 어노테이션.
  2. 메타 어노테이션 : 어노테이션을 위한 어노테이션
  3. 커스텀 어노테이션 : 사용자가 정의하고 만들어 사용하는 어노테이션

1. 표준(내장) 어노테이션

  • @Deprecated : 앞으로 사용하지 않을 것을 권장하는 필드나 메소드에 붙인다. 하위호환성 때문에 삭제하지는 않지만 사용하지 않는 것을 권장한다.
  • @FunctionalInterface : 함수형 인터페이스에 붙이면, 컴파일러가 올바르게 작성했는지 체크한다. 함수형 인터페이스의 "하나의 추상메소드만 가져야 한다"는 제약을 확인해준다. 또한 컴파일러에게 함수형 인터페이스라는 것을 알려주는 역할도 한다.
  • @SuppressWarnings : 컴파일러의 경고메시지가 나타나지 않게 한다. 경고가 많을 때, 확인된 경고는 새로운 경고를 알아보는데 방해가 되는 것을 방지하기 위해 사용한다.

2. 메타 어노테이션

다른 어노테이션에 사용하기 위한 어노테이션이다. 어노테이션이 어떻게 처리되어야 하는지, 프로그램의 특정 요소에 적용될 수 있는지와 같은 주석의 동작과 특성을 정의하는 방법을 제공한다.

  • @Target : 어노테이션을 정의할 때, 적용대상을 지정하는데 사용한다.
  • @Retention : 어노테이션이 유지되는 기간을 지정하는데 사용한다. 다음 3가지 값 중 하나를 가진다.

    RetentionPolicy.SOURCE / RetentionPolicy.CLASS / RetentionPolicy.RUNTIME

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override{}
  • @Documented : javadoc으로 작성한 문서에 포함시키려면 해당 어노테이션을 사용하면 된다.
  • @Inherited : 어노테이션도 상속이 가능하다. 어노테이션을 하위 클래스에 상속시키고자 할 때 사용한다.
  • @Repeatable : 반복해서 붙일 수 있는 어노테이션을 정의할 때 사용한다.
@Repeatable(Authors.class)
@interface Author {
    String name();
}

@Inherited
@interface Authors {
    Author[] value();
}

@Author(name = "John Doe")
@Author(name = "Jane Smith")
class MyClass {
    // class body
}

@Repeatable에 의해 컨터이너 어노테이션인 'Authors'을 값으로 @Author어노테이션이 반복적으로 정의되고 있다. 'MyClass'클래스와 같은 단일 요소에 여러 @Author어노테이션을 적용할 수 있다.
@Inherited로 상위 클래스의 모든 어노테이션이 하위 클래스에 의해 상속됨을 의미한다. 즉, MyClass의 하위 클래스에 @Author 어노테이션이 없는 경우에도 상위 클래스인 MyClass에서 @Author을 상속한다.

@Repeatable은 자바8에서 등장하였고 런타임에 어노테이션에 접근하려면 @Repeatable인 Author대신 컨테이너 어노테이션인 Authors를 사용해야 한다.

Annotation과 Reflection

어노테이션은 클래스나 메소드의 사용 의도 같은 정보를 컴파일러나 런타임 환경에 제공할 수 있다.

Reflection은 자바의 특징으로 런타임에 객체의 행동을 프로그램이 시험하거나 조정할 수 있게 한다. 이는 객체의 클래스를 검사하여 필드, 메소드 및 어노테이션을 검사하거나 메소드를 호출하거나 객체의 필드 값을 변경하여 수행할 수 있다.

예를 들어, 메소드에 특정 이벤트가 발생하면 호출되어야 한다는 것을 명시해놓은 어노테이션을 사용하고, Reflection을 사용하여 실제로 해당 이벤트가 발생하면 메소드를 호출한다.또한, 어노테이션은 Reflection과 결합하여 메소드의 arguments에 대한 제약사항이나 행동에 대해서 추가적인 정보를 제공할 수 있다.
이것들을 통해 사용자가 입력한 input의 유효성을 검사하거나, 코드가 convention을 따르는지 확인하거나, 자동으로 코드를 생성하는데 사용할 수 있다.

Ref : 자바의 정석 - 남궁성

profile
개발공부하는사람

0개의 댓글