자바에서 인터페이스를 확장(extends)하는 가장 일반적인 사례는 부모 인터페이스에 아무런 메서드도 포함되어 있지 않은 경우입니다. 대표적인 예로, java.awt.event 패키지의 MouseListener 인터페이스가 java.util.EventListener를 상속받는 경우를 들 수 있습니다. EventListener는 다음과 같이 정의되어 있습니다.
예제
package java.util;
public interface EventListener {}이처럼 내부에 메서드가 하나도 없는 인터페이스를 마커 인터페이스(Marker Interface) 또는 태그 인터페이스(Tagging Interface)라고 부릅니다. 마커 인터페이스에는 크게 두 가지 설계 목적이 있습니다.
1. 공통 부모(Parent) 생성
자바 API에서 수십 개의 인터페이스가 상속하는 EventListener처럼, 마커 인터페이스를 활용하면 여러 인터페이스 간의 공통 조상을 만들 수 있습니다. 예를 들어 어떤 인터페이스가 EventListener를 상속하면, JVM은 해당 인터페이스가 이벤트 위임(event delegation) 시나리오에서 사용될 것임을 인식할 수 있습니다.
2. 클래스에 데이터 타입 추가
'태그(tagging)'라는 용어가 유래된 바로 이 부분입니다. 마커 인터페이스를 구현하는 클래스는 별도의 메서드를 정의할 필요가 없습니다(인터페이스 자체에 메서드가 없기 때문입니다). 하지만 다형성(polymorphism)에 의해 해당 클래스는 마커 인터페이스 타입으로 분류됩니다.
즉, 마커 인터페이스는 컴파일러와 JVM에게 "이 클래스는 특정한 성격이나 역할을 가진다"는 메타 정보를 전달하는 일종의 표식 역할을 합니다. 실무에서는 Serializable, Cloneable 같은 표준 마커 인터페이스가 대표적인 예이며, 직렬화 가능 여부나 복제 가능 여부를 런타임에 판단하는 데 활용됩니다.