아이템 41. 정의하려는 것이 타입이라면 마커 인터페이스를 사용하라
마커 인터페이스(marker interface)
마커 인터페이스는 메서드 없이 자신을 구현하는 클래스가 특정 속성을 가진다는 의미를 부여할 때 사용되며 대표적으로 Serializable
인터페이스가 있다.
마커 인터페이스가 마커 애너테이션보다 나은 점
마커 애너테이션이 등장하며 마커 인터페이스가 구식이라 생각할 수 있지만, 마커 인터페이스는 두 가지 면에서 마커 애너테이션보다 낫다.
마커 인터페이스로 클래스들을 구현하면 어떤 클래스가 해당 마커 인터페이스를 구현했는지 알 수 있다. 반면, 마커 애너테이션에 오류가 있다면 런타임에서야 발견할 수 있다.
마커 인터페이스는 마커 애너테이션보다 적용 대상을 더욱 정밀하게 지정할 수 있다. 마커 애너테이션은
@Target
애너테이션으로ElementType.TYPE
으로 선언한 모든 타입(클래스, 인터페이스, 열거 타입, 애너테이션)에 부착할 수 있다. 하지만 특정 클래스에만 마킹을 하고 싶다고 가정을 하자. 그러면 마커 인터페이스를 확장하기만 하면 마킹된 타입이 자동으로 그 인터페이스의 하위 타입임을 보장한다.
마커 애너테이션이 마커 인터페이스보다 나은 점
마커 애너테이션은 애너테이션 시스템의 지원을 받기 때문에 마커 인터페이스 보다 좋을 수 있다. 그래서 클래스와 인터페이스 외의 프로그램 요소(모듈, 패키지, 필드 지역변수 등)에 마킹을 해야된다면 마커 애너테이션이 더 적절하다. 애너테이션을 적극적으로 활용한 프레임워크에서는 마커 인터페이스보다 마커 애너테이션을 쓰는게 일관성을 유지시켜 줄 수 있기 때문에 유리하다.
정리
마커 인터페이스와 마커 애너테이션은 각각의 장단점이 있다. 새로 추가되는 메서드 없이 타입만을 정의하는 목적이라면 마커 인터페이스가 적절하다. 반면, 클래스나 인터페이스 외의 프로그램 요소에 마킹을 해야된다면 마커 애너테이션을 활용하자.
Last updated