1. Annotation이란?
소스코드와 소스코드에 대한 문서를 하나로 관리하기 위해
소스코드의 주석 /* ~~~ */에 소스코드에 대한 정보를 저장
소스코드의 주석으로부터 HTML 문서를 생성해내는 프로그램(javadoc.exe)를 만들어서 사용
@로 미리 정의된 태그를 이용해서 주석 안에 정보를 저장하고,
javadoc.exe라는 프로그램이 이 정보를 읽어서 문서를 작성하는데 사용함
애노테이션은
이 기능을 응용해서 프로그램의 소스코드 안에 다른 프로그램을 위한 정보를 미리 약속된 형식으로 포함시킨 것
예시) @Test
특정 메서드를 테스트할 때 사용하는 애노테이션
이 메서드를 테스트해야 한다는 것을 테스트 프로그램에게 알리는 역할을 함
JDK에서 제공하는 표준 애너테이션은 주로 컴파일러를 위한 것으로 컴파일러에게 유용한 정보를 제공함.
그리고 새로운 애너테이션을 정의할 때 사용하는 메타 애너테이션을 제공함
2. 표준 Annotation
JDK에서 제공하는 표준 Annotation
@Override | 컴파일러에게 오버라이딩하는 메서드라는 것을 알림 |
@Deprecated | 앞으로 사용하지 않을 것을 권장하는 대상에 붙임 |
@SuppressWarnings | 컴파일러의 특정 경고메시지가 나타나지 않게 함 |
@SafeVarargs | 지네릭스 타입의 가변인자에 사용함(JDK 1.7) |
@FunctionalInterface | 함수형 인터페이스라는 것을 알림 (JDK 1.8) |
@Native | native 메서드에서 참조되는 상수 앞에 붙임 (JDK 1.8) |
표준 Annotation 중 메타 에너테이션
애너테이션을 정의하는데 사용되는 애너테이션의 애너테이션
@Target | 애너테이션이 적용가능한 대상을 지정하는데 사용함 |
@Documented | 애너테이션 정보가 javadoc으로 작성된 문서에 포함되게 함 |
@Inherited | 애너테이션이 자손 클래스에 상속되도록 함 |
@Retention | 애너테이션이 유지되는 범위를 지정하는데 사용함 |
@Repeatable | 애너테이션을 반복해서 적용할 수 있게 함 (JDK 1.8) |
3. 애너테이션 타입 정의하기
인터페이스를 정의하는 것과 거의 동일함
@interface TestInfo{
int count(); // annotation 요소
String testedBy();
String[] testTools();
TestType testType(); // enum TestType {FIRST, FINAL}
DateTime testDate(); // 자신이 아닌 다른 애너테이션(@DateTime)을 포함할 수 있음
}
@interface DateTime{
String yymmdd();
String hhmmss();
}
애너테이션의 요소
- 애너테이션 내에 선언된 메서드
- 상수 정의 가능
- 요소의 타입은 기본형, String, enum, 애너테이션, Class만 허용됨
- 매개변수가 없는 추상 메서드의 형태를 가짐
- 상속을 통해 구현하지 않아도 됨
- 디폴트 메서드는 정의할 수 없음
- 각 요소는 기본값을 가질 수 있으며, 기본값이 있는 요소는 애너테이션을 적용할 때 값을 지정하지 않으면 기본값이 사용됨
- 예외 선언 불가능
- 요소의 타입에 타입 매개변수 사용불가
애너테이션을 적용할 때 에너테이션 요소들의 값을 빠짐없이 지정해주어야 함
순서는 상관 X
@TestInfo(
count=3, testedBy="Kim",
testTools = {"JUnit", "AutoTester"},
testType = TestType.FIRST,
testDate = @DateTime(yymmdd="160101", hhmmss="235959")
)
public class NewClass {...}
java.lang.annotation.Annotation
모든 애너테이션의 조상은 Annotation이만,
애너테이션은 상속이 허용되지 않으므로 명시적으로 Annotation을 조상으로 지정할 수 없음
그리고 Annotation은 인터페이스로 정의되어 있음
Annotation 인터페이스에 equals, hashCode, toString 메서드가 있기 때문에
모든 애너테이션 객체에서 위의 메서드를 호출하는 것이 가능함
댓글