마커 인터페이스 ?
아무 메서드도 담지 않고, 단지 자신을 구현하는 클래스가 특정 속성을 가짐을 표시해주는 인터페이스이다.
Serializable
은 자신을 구현한 클래스의 인스턴스는 ObjectOutputStream
을 통해 write할 수 있다고, 즉 직렬화할 수 있다고 알려준다.마커 애너테이션[아이템 39]이 등장하면서 마커 인터페이스는 구식이 되었다는 이야기가 있지만 사실이 아니다. 마커 인터페이스는 다음 두가지 측면에서 마커 애테이션보다 낫다.
마커 인터페이스는 어엿한 타입이다. 마커 애너테이션을 사용했다면 런타임 시점에서야 발견했을 오류를 컴파일 타임에 잡아낼 수 있다.
적용 대상(@Target
)을 ElementType.TYPE
으로 선언한 애너테이션은 모든 타입(클래스, 인터페이스, 열거 타입, 애너테이션)에 달 수 있다. 이는 부착할 수 있는 타입을 더 세밀하게 제한하지 못한다는 뜻이다.
그런데 특정 인터페이스를 구현한 클래스에만 적용하고 싶은 마커가 있다고 가정해보자. 이 마커를 인터페이스로 정의했다면 그냥 마킹하고 싶은 클래스에서만 그 인터페이스를 구현하면 된다. 그러면 구현한 타입은 자동으로 그 인터페이스의 하위 타입임이 보장되는 것이다.
마커 애너테이션이 마커 인터페이스보다 나은 점으로는 거대한 애너테이션 시스템의 지원을 받을 수 있다는 점이다. 따라서 애너테이션을 적극 활용하는 프레임워크에서는 마커 애너테이션을 쓰는 것이 일관성을 지키는데 더 유리할 것이다.
클래스와 인터페이스 외 프로그램 요소들(모듈, 패키지, 필드, 지역변수 등)에 마킹해야 할 때는 애너테이션을 쓸 수 밖에 없을 것이다. 하지만, 마커를 클래스나 인터페이스에 사용해야 하는 경우 "이 마커이 된 객체를 매개변수로 받는 메서드를 작성할 일이 있을까?"라고 자문해보자.
자문의 결과가 "그렇다"이면 마커 인터페이스를 써야 한다.
적용 대상이
ElementType.TYPE
인 경우 마커 애너테이션과 마커 인터페이스 중 어떤 것이 더 나을지 곰곰이 생각해보자