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

[Effective Java] 타입 정의는 표시 인터페이스를 사용하자.

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

 [Effective Java] 타입 정의는 표시 인터페이스를 사용하자.


annotation, annotation framework, CLASS, class 한정, Effective JAVA, elementtype, extends, implements, marker, marker annotation, marker interface, type, [Effective Java] 타입 정의는 표시 인터페이스를 사용하자., 더 많은 정보, 매개 변수 타입, 매개변수타입, 메소드, 목표, 수월, 어노테이션, 요소 추가, 인자, 인터페이스, 장점, 정의할 타입, 주석 타입, 진화, 컴파일 타입 검사, 클래스, 타입, 타입 검사, 타입 정의, 표시, 표시 인터페이스, 혜택


-
표시 인터페이스(marker interface)는 메소드 선언은 전혀 없으면서 클래스가 그 인터페이스를 구현하는지만 나타내는(표시하는) 인터페이스이다.


-
annotation 이 이를 대체할 수도 있겠지만, marker interface 는 annotation 에 비해 두 가지 장점이 있다.
    1. marker interface 는 표시된 클래스의 인스턴스에 의해 구현되는 타입을 정의한다.
    2. 더 정확한 목표를 가질 수 있다. ( annotation 은 class 한정이 아니다. )


-
annotation 도 장점이 있다.
    1. 주요 장점은 이미 발표되어 사용 중이라도 기본적으로 하나 이상의 주석 타입 요소들을 추가함으로써 더 많은 정보를 주석 타입에 추가할 수 있다.
즉 점점 진화하기가 수월하고 더 많은 정보를 가질 수 있지만 marker interface 는 그렇지 않다.
    2. annotation 은 더 큰 주석 관리시스템의 일부이다.


-
marker 를 클래스나 인터페이스가 아닌 다른 프로그램 요소에 적용할 때는 annotation 을 사용해야 한다.
클래스와 인터페이스만이 인터페이스를 implements 하거나 extends 할 수 있기 때문이다.


-
만일 marker를 클래스와 인터페이스에만 적용한다면, marker를 갖는 객체들만을 인자로 받는 메소드를 하나 이상 작성할 것인지 생각해봐야 한다.
만일 그렇다면, annotation 보다는 marker interface 를 사용해야 한다.
그 인터페이스를 메소드의 매개 변수 타입으로 사용할 수 있어 컴파일 시점의 타입 검사라는 좋은 혜택을 누릴 수 있으므로.


-
클래스와 인터페이스에만 적용하되, marker를 갖는 객체만을 인자로 받는 메소드를 하나 이상 작성하지 않으면,
그 marker를 영원히 특정 인터페이스의 요소에만 제한해서 사용할 것인지 고려해야 한다.
만일 그렇다면 그 인터페이스의 서브 인터페이스로 표시 인터페이스를 정의하는 것이 좋다.
그 외에는 모두 annotation 을 사용하는 것이 좋다.



Summary


marker interface 와 marker annotation 은 각각 용도가 있다.
정의할 타입과 연관된 어떤 새로운 메소드도 갖지 않는 그런 타입을 정의하고자 하면, marker interface 가 좋다.
만일 클래스와 인터페이스가 아닌 다른 프로그램 요소를 표시하고자 하면, 그리고 향후 발전 가능성이 있다면, annotation 을 많이 사용하는 framework 를 사용중이라면, annotation 이 올바른 선택일 것이다.
만일 ElementType.TYPE 형태로 사용이 가능한 marker annotation 을 작성하려면 그것을 정말로 annotation 으로 할지 interface 로 할지 잘 생각해서 판단해야 한다.
결론적으로 타입의 정의를 정말 원하면 인터페이스를 사용하고, 그 외에는 annotation 을 사용하면 된다.





반응형

댓글