- 마커 인터페이스는 새로 추가하는 메서드없이 단지 타입 정의가 목적일 때 사용한다. ex. Serializable 인터페이스
- 마커 애너테이션은 클래스나 인터페이스 외의 프로그램 요소에 마킹해야 하거나, 애너테이션을 적극 활용하는 프레임워크의 일부로 그 마커를 편입시키고자 할 때 사용한다. ex. @Controller
마커 인터페이스는 이 인터페이스를 사용하는 클래스나 인터페이스의 타입을 명확하게 나타낸다. 그렇기 때문에 메서드 구현 시 해당 타입 외에 다른 타입을 못 오게 만들 수 있다. 이는 컴파일 시 에러를 잡을 수 있는 장점이다.
마커 인터페이스를 사용한 클래스나 인터페이스는 구체적으로 마커 인터페이스를 구현하면 된다. 비록 메서드는 하나도 없기 때문에 구현할 메서드든 없지만 타입을 확실하게 지정해줄 수 있다. 반면에, 마커 애너테이션을 구현할 때 타켓을 ElementType.TYPE으로 구현한 경우 타입을 더 세밀하게 제한하지 못한다.
스프링 프레임워크처럼 애너테이션을 적극 활용하는 프레임워크에서는 마커 애너테이션을 쓰는 쪽이 일관성을 지키는 데 유리할 것이다.