'10.03.16 story JAVA이야기2010. 4. 1. 13:33
07:00 ~ 09:00 effective java
주석달린 메소드는 테스트 하는 메소드임을 나타낸다
매개 변수가 없는 static 메소드에서만 사용할 것
@Retention(RetnentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Test{}
Test 주석 타입의 선언에는 Retention과 Target 주석이 포함되어 있다. 이와 같이 주석 타입 선언에 나온 주석을 메타 주석이라고 한다.
@Retention 메타 주석은 테스트 주석이 런타임 시에 존속되어야 한다는 것을 나타내며, 그 주석이 없다면 테스트 주석은 테스트 도구 소프트웨어에서 보이지 않을 것이다.
@Target(ElementType.MEHTOD) 메타 주석은 Test주석이 메소드 선언시에만 유효하다는 것을 나타낸다. 따라서 클래스 선언, 필드 선언,또는 다른 프로그램 요소에는 사용할 수 없다.
자바에서의 리플렉션
런타임 시의 타입 정보와 같은 메타 데이터를 관리하는 기능이다. 예를 들어, 리플렉션 기능을 이용하면, 현재 생성된 인스턴스의 클래스 및 이 클래스의 수퍼나 서브 클래스가 무엇인지를 알 수 있다. 클래스 라이브러리 관리도구와 같은 프로그램을 만들 때 유용하다
만일 리플렉션에 의해 테스트하는 메소드를 호출하려다가 InvocationTargetException 예외가 아닌 다른 예외를 발생시킨다면, 그것은 Test주석(컴파일 시점에는 검사 안된)을 부적합하게 사용했음을 나타낸다. 인스턴스 메소드(static선언 안한거), 하나 이상의 매개 변수를 갖는 메소드, 접근 불가능한 메소드 등에 Test 주석을 달았을 때가 그런 경우이다.
Override주석을 일관성 있게 사용하자
바이그램 :
정보검색의 인덱스를 만드는 기법 중에 언학적 기법으로 N-gram 색인 기법이 있다. 이 방법은 대상 문자열로부터 추출한 N개 부속 문자열로 색인을 만드는 것으로써, 두 글자를 추출하는 것을 바이그램이라 한다.
수퍼클래스의 메소드를 오버라이드 한다고 생각되는 모든 메소드에 Override주석을 사용해야 한다.
요약하면, 수퍼 타입의 메소드를 오버라이드 하는 모든 메소드에 Override 주석을 달아주면, 컴파일러가 굉장히 많은 에러를 막아줄 수 있다. 한 가지 예외는 있다. 실체 클래스에서는 수퍼 클래스의 추상 메소드를 오버라이드 하는 메소드에 주석을 달 필요 없다.
오버라이딩을 제대로 했는지 컴파일러가 검사해주기 때문이다.
타입 정의는 표시 인터페이스를 사용하자
표시인터페이스는 메소드 선언은 전혀 하지 않으면서 클래스가 그 인터페이스를 구현하는지만 나타내는 인터페이스이다. 예를 들어, Serializable 인터페이스를 생각해보자 어떤 클래스에서 이 인터페이스를 구현하면 자신의 인터페이스가 ObjectOutputStream으로 출력 될 수 있는 클래스라는 것을 나타낸다.
타입 정의는 표시 인터페이스를 사용하자
표시인터페이스는 메소드 선언은 전혀 하지 않으면서 클래스가 그 인터페이스를 구현하는지만 나타내는 인터페이스이다. 예를 들어, Serializable 인터페이스를 생각해보자 어떤 클래스에서 이 인터페이스를 구현하면 자신의 인터페이스가 ObjectOutputStream으로 출력 될 수 있는 클래스라는 것을 나타낸다.
표시 주석(Annotation : @Test, @Retention, @Target....)에 비해 표시 인터페이스에는 두 가지 장점이 있다. 첫 번째 면서 제일 중요한 것으로 표시 인터페이스는 표시된 클래스의 인스턴스에 의해 구현되는 타입을 정의한다. 그러나 표시주석은 그렇지 않다. 또 다른 장점은 더 정확한 목표를 가질 수 있다는 것이다. 만일 주석타입이 목표 ElementType.Type으로 선언된다면 그 주석을 어떤 클래스나 인터페이스에도 적용할 수 있다. Set인터페이스는 이와 같은 제한적 표시 인터페이스 임이 확실하다.
만일, ElementType.TYPE 형태로 사용이 가능한 표시 주석 타입을 작성하려고 한다면, 그것을 정말로 주석타입으로 해야할지, 아니면 표시 인터페이스 더 적합한지 잘 생각해서 판단하자.
“타입 정의를 정말로 원한다면 인터페이스를 사용하자”
'JAVA이야기' 카테고리의 다른 글
'10.03.19 story (0) | 2010.04.01 |
---|---|
'10.03.17 story (0) | 2010.04.01 |
'10.03.15 story (0) | 2010.04.01 |
'03.03.14 story (0) | 2010.04.01 |
'03.03.13 story (0) | 2010.04.01 |