Language/Java

11. 어노테이션(annotation)

리져니 2021. 7. 26. 16:13

소스코드에 대한 문서를 따로 만들기보다는 소스코드와 문서를 하나의 파일로 관리하는 방법으로 주석에 소스코드에 대한 정보를 저장하고, 해당 주석으로부터 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): 요소가 하나도 정의되지 않은 어노테이션

 

728x90