[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 을 사용하면 된다.
'프로그래밍 놀이터 > 디자인 패턴, 리펙토링' 카테고리의 다른 글
[Effective Java] 필요하면 방어 복사본을 만들자. (2) | 2017.01.10 |
---|---|
[Effective Java] 매개 변수가 유효한지 검사하기. (0) | 2017.01.09 |
[Effective Java] Override 주석을 일관성 있게 사용하자. (0) | 2017.01.03 |
[Effective Java] 작명 패턴보다는 주석(annotation)을 사용하자. (0) | 2017.01.02 |
[Effective Java] 인터페이스를 사용해서 확장 가능한 enum 을 만들자. (0) | 2016.12.29 |
댓글