6장_아이템39 - ririkat/effective-java GitHub Wiki
전통적으로 도구나 프레임워크가 특별히 다뤄야 할 프로그램 요소에는 딱 구분되는 명명 패턴을 적용해왔다. 명명 패턴은 효과적인 방법이지만 단점도 크다.
- 오타가 나면 안 된다.
- 올바른 프로그램 요소에서만 사용되리라 보증할 방법이 없다.
- 프로그램 요소를 매개변수로 전달할 마땅한 방법이 없다.
애너테이션은 이 모든 문제를 해결해주는 멋진 개념으로, JUnit도 버전 4부터 전면 도입하였다.
- 애너테이션 선언에 다는 애너테이션
@Target
- 해당 애너테이션의 적용 범위를 지정해주는 메타에너테이션
-
@Target(ElementType.TYPE)
형태로 사용
ElementType.PACKAGE : 패키지 선언
ElementType.TYPE : 타입 선언
ElementType.ANNOTATION_TYPE : 어노테이션 타입 선언
ElementType.CONSTRUCTOR : 생성자 선언
ElementType.FIELD : 멤버 변수 선언
ElementType.LOCAL_VARIABLE : 지역 변수 선언
ElementType.METHOD : 메서드 선언
ElementType.PARAMETER : 전달인자 선언
ElementType.TYPE_PARAMETER : 전달인자 타입 선언
ElementType.TYPE_USE : 타입 선언
@Retention
- 해당 애너테이션의 유지 범위를 표시하는 메타애너테이션
-
@Retention(RetentionPolicy.~)
형식으로 사용
RetentionPolicy.RUNTIME // 컴파일 전까지만 유효
RetentionPolicy.CLASS // 컴파일러가 클래스를 참조할 때까지 유효
RetentionPolicy.SOURCE // 컴파일 이후에도 JVM 에 의해서 계속 참조가 가능
@Repeatable
- 해당 어노테이션을 반복정의하게 해주는 메타애너테이션