정의하려는 것이 타입이라면 마커 인터페이스를 사용하자

2021-05-30

마커 인터페이스

아무 메서드도 담고 있지 않고, 단지 자신을 구현하는 클래스가 특정 속성을 가짐을 표시해주는 인터페이스를 마커 인터페이스라 한다.

Serializable 은 자신을 구현한 클래스의 인스턴스는 ObjectOutputStream 을 통해 쓸 수 있다고 알려준다.

public interface Serializable {
}

마커 인터페이스 vs 마커 어노테이션

마커 인터페이스는 두 가지 면에서 마커 어노테이션 보다 낫다.

  • 마커 인터페이스는 이를 구현한 클래스의 인스턴스들을 구분하는 타입으로 쓸 수 있으나, 마커 어노테이션은 그렇지 않다.
    • 런타임에 발견될 오류를 컴파일 타임에 잡을 수 있다.
    • 자바의 직렬화는 마커 인터페이스를 보고 그 대상이 직렬화할 수 있는 타입인지 확인한다.
      • 그런데 직렬화를 하는 메서드인 ObjectOutputStream.writeObject 메서드는 인수를 Serializable로 받지 않고, Object로 받고 있어서, 컴파일타임에 오류를 잡을 수 없다. (마커 인터페이스의 이점을 살리지 못한 코드긴 하다.)
  • 마커 인터페이스는 적용 대상을 더 정밀하게 지정할 수 있다.
    • 마커 어노테이션 사용방법인 ElementType.Type으로 선언한 어노테이션의 제약조건을 걸게 되면 이 어노테이션이 붙은 모든 코드에 제약조건이 붙게된다.
    • 반면에 마커 인터페이스는 특정 클래스에만 추가적으로 제약조건을 설정할 수 있다.
  • 반면에 마커 어노테이션은 거대한 어노테이션 시스템의 지원을 받을 수 있다

사용

  • 마커 어노테이션을 사용해야 할 때
    • 클래스와 인터페이스 외의 프로그램 요소(모듈, 패키지, 필드 ,지역변수 등)에 마킹해야 할 때
      • 클래스와 인터페이스만이 인터페이스를 구현하거나 확장이 가능하기 때문
    • 어노테이션을 활발히 활용하는 프레임워크를 사용할 때
  • 마커 인터페이스를 사용해야 할 때
    • 마킹 된 객체를 매개변수로 받는 메서드를 작성해야 할 때
      • 컴파일타임에 오류를 잡아낼 수 있음