명명 패턴
특별히 다뤄야 할 프로그램 요소에는 구분되는 명명패턴을 이용했다. 예를 들어 JUnit은 테스트 메서드 이름이 test로 시작하게끔 했었다.
이런 명명 패턴은 다음과 같은 문제가 있다.
- 타입 세이프 하지 않다. tsetSaftey라고 적으면 JUnit은 이를 인지하지 못한다.
- 올바른 프로그램 요소에서만 사용된다는 보장이 없다.
-> 클래스의 이름에 test를 붙여도 클래스에는 적용되지 않는다. - 프로그램 요소를 매개변수로 전달할 방법이 없다.
-> 예외 테스트가 힘들다.
애너테이션
@Retention가 @Target이라는 메타 어노테이션을 이용해 애너테이션의 라이프사이클을 지정하고 사용자가 올바른 프로그램 요소에 사용할 수 있도록 도와준다.
이러한 마커 애너테이션은 잘못 사용하면 컴파일 타임에 에러를 잡아준다. 다음과 같은 test 어노테이션을 정의해주고 클래스 레벨에 애노테이션을 사용하면 컴파일 에러가 난다.
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Test {
}
이렇게 애너테이션을 정의하고 사용함으로써 명명 패턴의 1번, 2번 문제가 해결된다.
예외 처리
public @interface ExceptionTest {
Class<? extends Throwable> value();
}
다음과 같이 예외처리가 쉬워진다.
public class Example2 {
@ExceptionTest(ArithmeticException.class)
public static void m1() {
int i = 0;
i = i / i;
}
}
정리
다른 프로그래머가 소스코드에 추가 정보를 제공할 수 있는 도구를 만들어야 한다면 적당한 애너테이션 타입도 함께 정의해 제공하자.
자바 프로그래머라면 예외 없이 자바가 제공하는 애너테이션 타입들은 사용해야 한다.