아무 메서드도 담고있지 않고 단지 자신을 구현하는 클래스가 특정 속성을 가짐을 표시해주는 인터페이스를 마커 인터페이스라 한다 Serializable인터페이스가 좋은 예시이다 Serializable을 구현한 클래스는 자신의 인스턴스가 ObjectOutputStream을 통해 쓸 수 있다고 즉, 직렬화 할 수 있다고 알려준다
마커 인터페이스를 마커 어노테이션으로 바꿀 수 있다 하지만 그냥 인터페이스를 쓰는게 낫다고 한다 이유는
- 마커 인터페이스는 이를 구현한 클래스의 인스턴스들을 구분하는 타입으로 쓸 수 있으나, 마커 어노테이션은 그렇지 않다 왜와이? 직렬화하는 메서드(ObjectOutputStream.write)에 Object객체를 받도록 설계되어 타입관련 컴파일 에러를 뱉지만 마커 어노테이션은 직렬화할 수 없는 객체를 넘기더라도 런타임에 문제를 확인할 수 있다
- 마커 인터페이스는 적용 대상을 더 정밀하게 지정할 수 있다. 마커 어노테이션은 @Target(적용대상)을 ElementType.TYPE으로 선언한 어노테이션은 모든 타입(클래스, 인터페이스, 열거, 어노테이션)에 달 수 있다 더 세밀하게 제한하지 못한다는 뜻이다 하지만 마커 인터페이스는 구현하고 싶으면 그냥 클래스가 구현하기만 하면 된다
반대로 마커 어노테이션이 마커 인터페이스보다 나은 점으로는 거대한 어노테이션 시스템의 지원을 받는다는 점이다 어노테이션을 적극 활용하는 프레임워크에서는 마커 어노테이션을 쓰는 쪽이 일관성을 지키는데 유리하다