Post

어노테이션

어노테이션이란

프로그램에 영향을 미치지 않으면서 다른 프로그램에게 유용한 정보를 제공하는 것

표준 어노테이션

어노테이션설명
@Override오버라이딩한 메서드라는 것을 알림
@Deprecated사용하지 않는 것을 권장한다는 것을 알림
@SuppressWarnings특정 경고메시지를 무시하도록 함
@SafeVarargs제네릭 타입의 가변인자에 사용
@FunctionalInterface함수형 인터페이스라는 것을 알림
@Nativenative메서드에서 참조되는 상수 앞에 붙임

메타 어노테이션

메타 어노테이션은 어노테이션을 정의할 때 사용한다.

@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인 경우 어노테이션을 적용할 때 요소의 이름을 생략하고 값을 지정하는 것이 가능하다.

This post is licensed under CC BY 4.0 by the author.