사전에서의 의미는 주석이다.
자바 소스 코드에 추가하여 사용할 수 있는 메타데이터의 일종이다. JDK 1.5버전 이상에서 사용 가능하다.
@interface 키워드를 통해 정의 할 수 있다.
Java Server Faces(JSF) : JavaEE의 파트 중 하나로 웹 어플리케이션의 UI를 만들기 위한 자바 기반의 웹 어플리케이션 프레임워크이다.
- @Deprecated : 앞으로 사용하지 않을 것을 권장하는 필드나 메소드에 붙인다. 하위호환성 때문에 삭제하지는 않지만 사용하지 않는 것을 권장한다.
- @FunctionalInterface : 함수형 인터페이스에 붙이면, 컴파일러가 올바르게 작성했는지 체크한다. 함수형 인터페이스의 "하나의 추상메소드만 가져야 한다"는 제약을 확인해준다. 또한 컴파일러에게 함수형 인터페이스라는 것을 알려주는 역할도 한다.
- @SuppressWarnings : 컴파일러의 경고메시지가 나타나지 않게 한다. 경고가 많을 때, 확인된 경고는 새로운 경고를 알아보는데 방해가 되는 것을 방지하기 위해 사용한다.
다른 어노테이션에 사용하기 위한 어노테이션이다. 어노테이션이 어떻게 처리되어야 하는지, 프로그램의 특정 요소에 적용될 수 있는지와 같은 주석의 동작과 특성을 정의하는 방법을 제공한다.
RetentionPolicy.SOURCE / RetentionPolicy.CLASS / RetentionPolicy.RUNTIME
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override{}
@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를 사용해야 한다.
어노테이션은 클래스나 메소드의 사용 의도 같은 정보를 컴파일러나 런타임 환경에 제공할 수 있다.
Reflection은 자바의 특징으로 런타임에 객체의 행동을 프로그램이 시험하거나 조정할 수 있게 한다. 이는 객체의 클래스를 검사하여 필드, 메소드 및 어노테이션을 검사하거나 메소드를 호출하거나 객체의 필드 값을 변경하여 수행할 수 있다.
예를 들어, 메소드에 특정 이벤트가 발생하면 호출되어야 한다는 것을 명시해놓은 어노테이션을 사용하고, Reflection을 사용하여 실제로 해당 이벤트가 발생하면 메소드를 호출한다.또한, 어노테이션은 Reflection과 결합하여 메소드의 arguments에 대한 제약사항이나 행동에 대해서 추가적인 정보를 제공할 수 있다.
이것들을 통해 사용자가 입력한 input의 유효성을 검사하거나, 코드가 convention을 따르는지 확인하거나, 자동으로 코드를 생성하는데 사용할 수 있다.
Ref : 자바의 정석 - 남궁성