어노테이션
어노테이션이란
프로그램에 영향을 미치지 않으면서 다른 프로그램에게 유용한 정보를 제공하는 것
표준 어노테이션
어노테이션 | 설명 |
---|---|
@Override | 오버라이딩한 메서드라는 것을 알림 |
@Deprecated | 사용하지 않는 것을 권장한다는 것을 알림 |
@SuppressWarnings | 특정 경고메시지를 무시하도록 함 |
@SafeVarargs | 제네릭 타입의 가변인자에 사용 |
@FunctionalInterface | 함수형 인터페이스라는 것을 알림 |
@Native | native메서드에서 참조되는 상수 앞에 붙임 |
메타 어노테이션
메타 어노테이션은 어노테이션을 정의할 때 사용한다.
@Target
어노테이션 적용 대상을 지정할 때 사용한다.
대상 타입 | 설명 |
---|---|
ANNOTATION_TYPE | 어노테이션 |
CONSTRUCTOR | 생성자 |
FIELD | 필드 (멤버변수, enum 상수) |
LOCAL_VARIABLE | 지역변수 |
METHOD | 메서드 |
PACKAGE | 패키지 |
PARAMETER | 매개변수 |
TYPE | 타입 (클래스, 인터페이스, enum) |
TYPE_PARAMETER | 타입 매개변수 |
TYPE_USE | 타입이 사용되는 모든 곳 |
@Retention
어노테이션이 유지되는 기간을 지정할 때 사용한다.
유지 정책 | 의미 |
---|---|
SOURCE | 소스파일에만 존재 |
CLASS | 클래스 파일에 존재 + 실행시에 사용불가 |
RUNTIME | 클래스 파일에 존재 + 실행시에 사용가능 |
RUNTIME 유지 정책을 지정한 어노테이션은 리플렉션 API를 통해 런타임에 Class 객체를 통해 어노테이션의 정보를 읽어서 처리할 수 있다.
@Documented
어노테이션에 대한 정보가 javadoc 문서에 포함되도록 한다.
@Inherited
어노테이션이 자식 클래스에 상속되도록 한다.
@Repeatable
어노테이션이 중복해서 여러 번 사용할 수 있도록 한다.
@Native
네이티브 메서드에 사용되는 상수 필드에 붙이는 어노테이션이다.
네이티브 메서드는 추상 메서드처럼 정의만 되어있고 구현은 되어있지 않다.
네이티브 메서드를 호출하면 OS의 메서드가 실행된다.
이 때, 자바의 네이티브 메서드와 OS의 메서드를 연결하는 작업이 필요한데 이 역할을 JNI(Java Native Interface)가 수행한다.
어노테이션 정의
어노테이션은 다음과 같은 형태를 가진다.
1
2
3
4
@interface 어노테이션이름 {
타입 요소이름(); // 어노테이션 요소 선언
...
}
어노테이션 요소는 반환값이 있고 매개변수는 없는 추상 메서드의 형태를 가지며, 어노테이션을 적용할 때 이 요소들의 값을 빠짐없이 지정해주어야 한다.
단, 요소의 이름도 같이 적어주기 때문에 순서는 상관없다.
1
2
3
4
5
6
7
8
@interface MyAnno {
int count();
String name();
String[] message();
}
@MyAnno(name="test", count=3, message={"a","b","c"})
public class MyClass { ... }
어노테이션 요소는 기본값을 가질 수 있으며 어노테이션을 적용할 때 값을 지정하지 않으면 기본값이 사용된다.
단, null은 허용되지 않는다.
1
2
3
@interface MyAnno {
int count() default 0;
}
그리고 어노테이션 요소가 오직 하나뿐이고 이름이 value
인 경우 어노테이션을 적용할 때 요소의 이름을 생략하고 값을 지정하는 것이 가능하다.