[아이템 41] 정의하려는 것이 타입이라면 마커 인터페이스를 사용하라.
마커 인터페이스란 메서드 선언을 포함하지 않고, 단지 구현하는 클래스의 특정 속성을 표시해주는 것입니다. 대표적으로 Serializable
인터페이스가 있습니다.
마커 애너테이션이 등장하면서 마커 인터페이스가 구식이 되었다는 얘기가 있는데, 이는 사실이 아닙니다. 마커 인터페이스는 마커 애너테이션 보다 좋은 점도 있습니다.
첫 째로 마커 인터페이스는 이를 구현한 클래스의 인스턴스들을 구분하는 타입을 쓸 수 있지만, 마커 애너테이션은 그렇지 않습니다. 마커 인터페이스는 타입이고 마커 애너테이션을 사용하면 런타임에야 발견할 수 있습니다.
자바의 직렬화는 Serializable
마커 인터페이스를 보고 그 대상이 직렬화를 할 수 있는 타입인지 확인합니다. 예를들어 ObjectOutputStream.writeObject 메서드는 당연히 인수로 받은 객체가 Serializable를 구현 했을 거라고 가정합니다. 하지만 이 메서드는 Object 객체를 받도록 설계되어서 직렬화할 수 없는 객체를 넘겨도 런타임에야 확인할 수 있습니다. 이는 마커 인터페이스의 이점을 살리지 못한 것입니다.
두 번째는 적용 대상을 더 정밀하게 지정할 수 있다는 것입니다. 특정 인터페이스를 구현한 클래스에만 적용하고 싶으먼 그 클래스에 마커 인터페이스를 구현하기만 하면 됩니다.
반대로 마커 애너테이션이 마커 인터페이스보다 좋은 점은 거대한 애너테이션 시스템의 지원을 받을 수 있다는 점입니다. 둘 중 어느것을 사용해야될지 모르는 경우 확실한 건 클래스와 인터페이스 외의 프로그램요소(모듈, 패키지, 필드 등)에 마킹해야 되는 경우 애너테이션을 사용할 수 밖에 없습니다. 마커 인터페이스를 적용해야 한다면 “마킹이 된 객체를 매개변수로 받는 메서드를 작성할 일이 있을까?“라고 자문해보는 게 좋습니다. 만약 그렇다라고 결론이 날 경우 마커 인터페이스를 사용하고 그렇지 않으면 마커 애너테이션을 사용하는 것이 더 나은 선택이 될 것입니다.