소스코드에 대한 문서를 따로 만들기보다는 소스코드와 문서를 하나의 파일로 관리하는 방법으로 주석에 소스코드에 대한 정보를 저장하고, 해당 주석으로부터 HTML문서를 생성해내는 프로그램(javadoc.exe)을 만들어서 사용할 수 있다.
이 기능을 응용하여 프로그램의 소스코드 안에 다른 프로그램을 위한 정보를 미리 약속된 형식으로 포함시킨 것이 어노테이션이다.
어노테이션은 주석처럼 프로그래밍 언어에 영향을 미치지 않으면서도 다른 프로그램에게 유용한 정보를 제공할 수 있다는 장점이 있다.
* annotation의 뜻은 주석, 주해, 메모이다.
표준 어노테이션
@Override | 컴파일러에게 오버라이딩하는 메서드라는 것을 알린다 |
@Deprecated | 앞으로 사용하지 않을 것을 권장하는 대성에 붙인다 |
@SuppressWarnings | 컴파일러의 특정 경고메세지가 나타나지 않게 해준다 |
@SafeVarargs | 지네릭스 타입의 가변인자에 사용한다 'unchecked'경고를 억제한다 |
@FunctionalInterface | 함수형 인터페이스 라는것을 알린다 |
@Native | native 메서드에서 참조되는 상수 앞에 붙인다 |
@Target | 어노테이션이 적용가능한 대상을 지정하는데 사용 |
@Documented | 어노테이션 정보가 javadoc으로 작성된 문서에 포함되게 한다 |
@Inherited | 어노테이션이 자손 클래스에 상속되도록 한다 |
@Retention | 어노테이션이 유지되는 범위를 지정하는데 사용한다 |
@Repeatable | 어노테이션을 반복해서 정용할 수 있게 한다 |
메타 어노테이션
어노테이션에 붙이는 어노테이션으로, 어노테이션을 정의할때 어노테이션의 적용대상이나 유지기간 등을 지정하는데 사용된다.
@Target
어노테이션이 적용가능한 대상을 지정하는데 사용된다.
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarning {
String[] value();
}
@SuppressWarning을 정의한 것으로, 이 어노테이션에 적용할 수 있는 대상을 @Target으로 지정했다.
어노테이션 적용대상의 종류
ANNOTATION_TYPE | 어노테이션 |
CONSTRUCTOR | 생성자 |
FIELD | 필드 (멤버변수, enum 상수) 기본형에 사용됨 |
LOCAL_VARIABLE | 지역변수 |
METHOD | 메서드 |
PACKAGE | 패키지 |
PARAMETER | 매개변수 |
TYPE | 타입 (클래스, 인터페이스, enum) 타입을 선얼할 때, 어노테이션을 붙일수 있다는 뜻 |
TYPE_PARAMETER | 타입 매개변수 |
TYPE_USE | 타입이 사용되는 모든곳 참조형에 사용됨 해당 타입 변수를 선언할 때 붙일수 있다는 뜻 |
@Reteintion
어노테이션이 유지되는 기간을 지정하는데 사용된다.
SOURCE | 소스 파일에만 존재. 클래스파일에는 존재하지 않음 |
CLASS | 클래스 파일에 존재. 실행시에 사용불가. 기본값 |
RUNTIME | 클래스 파일에 존재. 실행시에 사용가능 |
@Overrice나 @SuppressWarnings처럼 컴파일러가 사용하는 어노테이션은 유지 정책이 SOURCE이다.
유지 정책을 RUNTIME으로 하면, 실행 시에 리플랙션(reflection)을 통해 클래스 파일에 저장된 어노테이션의 정보를 읽어서 처리할 수 있다.
유지 정책 CLASS는 컴파일러가 어노테이션의 정보를 클래스 파일에 저장할수 있게 하지만, 클래스 파일이 JVM에 로딩될 때는 어노테이션의 정보가 무시되어 실행 시에 어노테이션의 정보를 얻을 수 없다.
@Documented
어노테이션에 대한 정보가 javadoc으로 작성한 문서에 포함되도록 한다.
@Inherited
어노테이션이 자손 클래스에 상속되도록 한다.
해당 어노테이션이 붙은 어노테이션을 조상 클래스에 붙이면, 자손 클래스도 이 어노테이션이 붙은 것과 같이 인식된다.
@Inherited // @SupperAnno가 자손까지 영향을 미치게함
@interface SupperAnno{}
@SupperAnno
class Parent {}
class Child extends Parent {} // Child에 어노테이션이 붙은 것으로 인식
@Repeaetable
보통 하나의 대상에 한 종류의 어노테이션을 붙이는데, 해당 어노테에션이 붙은 어노테이션은 여러번 붙일 수 있다.
@Reapeatable(ToDos.class) // ToDo어노테이션을 반복해서 쓸수 있게 한다
@interface Todo{
String value();
}
@ToDo("delete test codes.");
@ToDo("override ingerited methos")
class MyClass{
...
}
@Native
네이티브 메서드(JVM이 설치된 OS의 메서드, Object클래스의 메서들은 대부분 네이티브 메서드)에 의해 참조되는 상수필드에 붙이는 어노테이션
어노테이션 타입 정의
어노테이션의 요소
어노테이션 내에 선언된 메서드.
@interface TestInfo{
int count();
String testedBy();
String[] testTools();
TestType testType();
DateTime testDate();
}
@interface DateTime{
String yymmdd();
String hhmmss();
}
TestInfo어노테이션은 다섯개의 요소를 갖는다
어노테이션의 요소는 반환값이 있고, 매개변수는 없는 추상 메서드의 형태를 가지며 상속을 통해 구현하지 않아도 된다.
어노테이션을 적용할 때 이 요소들의 값을 빠짐없이 지정해주어야 한다.
각 요소는 기본값을 가질수 있으며, 기본값이 있는 요소는 어노테이션을 적용할 때 값을 지정하지 않으면 기본값이 사용된다.
어노테이션 요소가 하나뿐이고 이름이 value인 경우에 어노테이션을 적용할 때 요소의 이름을 생략하고 값만 적어도 된다.
마커 어노테이션(Marker Annotation): 요소가 하나도 정의되지 않은 어노테이션
'Language > Java' 카테고리의 다른 글
12.2 쓰레드(Thread) - 실행 제어 (0) | 2021.07.28 |
---|---|
12.1 쓰레드 (Thread) - 구현 (0) | 2021.07.28 |
9. 제네릭스(gernerics) (0) | 2021.07.26 |
8.4 Collection Framework - Map 인터페이스 (0) | 2021.07.24 |
8.3 Collection Framework - set 인터페이스 (0) | 2021.07.20 |