본문 바로가기
프로그래밍 놀이터/디자인 패턴, 리펙토링

[Effective Java] 작명 패턴보다는 주석(annotation)을 사용하자.

by 돼지왕 왕돼지 2017. 1. 2.
반응형

 [Effective Java] 작명 패턴보다는 주석(annotation)을 사용하자.


1.5, @interface, annotation, annotationname, Compiler, Effective JAVA, elementtype, exception, Interface, Java, junit, meta annotation, Method, naming pattern, prefix, Public, retention, retentionpolicy, Runtime, Target, test, tool smith, 단점, 도구, 매개 변수, 매개변수 타입, 메타 주석, 사전 정의된 어노테이션, 어노테이션, 오류, 오타, 작명 패턴, 작명 패턴의 단점, 적용 가능 범위, 주석, 철자, 컴파일러, 테스트 도구, 테스트 메소드, 툴스미스, 프레임워크, 프로그래머, 프로그램 요소


-
1.5 배포판 이전에는 도구나 프레임워크에서 특별히 취급할 필요가 있는 프로그램 요소들을 나타내기 위해 작명 패턴(naming pattern)을 사용하는 것이 일반적.
예를 들어 JUnit 테스팅 프레임워크에서는 테스트 메소드들의 이름을 test로 시작하도록 하였다.
이 방법은 효과는 있지만 단점들이 있다.

1. 철자상의 오류로 인한 오류
2. 적합한 프로그램 요소에만 사용되는지 확신할 방법이 없다.
3. 매개 변수 값을 프로그램 요소와 연관시키는 좋은 방법을 제공하지 않는다.


-
작명패턴의 단점은 annotation 을 사용하여 깔끔히 해결된다.


-
annotation 정의는 다음과 같이 한다.

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.METHOD)

public @interface AnnotationName{

}



@Retention 은 Runtime 에 이 annotation 이 유지되어야 하는지를 나타내고,
@Target 은 이 annotation 이 적용 가능한 범위를 나타낸다.
@Retention 과 @Target 을 메타 주석(meta-annotation)이라 부른다.


-
annotation 정의에는 compiler 가 할 수 없는 내용을 꼭 적어 주어야 한다.
예를 들면 "매개변수가 없는 static 메소드에만 사용할 것." 와 같이.


-

...

public @interface ExceptionTest{

Class<? extends Exception> value();

}


Class<? extends Exception> 은 annotation 의 매개변수 타입을 나타낸다.


-
여러개의 Exception 을 허용하려면 다음과 같이 정의한다.

public @interface ExceptionTest{

Class<? extends Exception>[] value();

}



annotation 을 사용할 때는 아래와 같이 사용한다.

@ExceptionTest({ IndexOutOfBoundException.class, NullPointerException.class } )

public static void testFunc(){ ... }




-
주석을 사용할 수 있는 지금, 굳이 작명 패턴을 써야 할 이유가 없다.


-
툴스미스(tool smith, 테스트 도구를 잘 알고 다루는 사람) 이외에는 대부분의 프로그래머가 주석 타입을 정의할 필요는 없을 것이다.
그러나 모든 프로그래머는 자바 플랫폼에서 제공하는 사전 정의된 주석 타입을 반드시 사용해야 한다.




반응형

댓글