마커 인터페이스(Marker Interface)
책/Effective Java

마커 인터페이스(Marker Interface)

728x90
반응형
  • 마커 인터페이스 : 아무 메서드도 선언되어있지 않고, 단지 자신을 구현하는 클래스가 특정 속성을 가짐을 표시하는 인터페이스 
    • ex) Serializable : 자신을 구현한 클래스의 인스턴스는 ObjectOutputStream을 통해 Write(Serialization)이 가능하다는 것을 알려줌 

Serializable interface

  • 마커 어노테이션이 등장하면서 마커 인터페이스는 구식이 되었다고들 얘기하지만, 사실은 그렇지 않다. 

# 마커 인터페이스의 장점 

  1. 마커 인터페이스는 이를 구현한 클래스의 인스턴스들을 구분하는 타입으로 쓸 수 있으나, 마커 어노테이션은 그렇지 않다. 
    • 마커 인터페이스는 어엿한 타입이므로, 마커 어노테이션을 사용했다면 런타임 때 발견될 오류를 컴파일 타임에 잡을 수 있다.
    • ObjectOutputStream.writeObject 메서드는 이 점을 살리지 못했기 때문에 실제로 런타임에 오류가 발생한다. 
  2. 마커 인터페이스는 적용 대상을 더 정밀하게 지정할 수 있다. 
    • 적용대상(@Target)을 ElementType.TYPE으로 선언한 어노테이션은 모든 타입(클래스, 인터페이스 , Enum, 어노테이션)에 달 수 있다. -> 부착할 수 있는 타입을 더 세밀하게 제한하지 못한다.
    • 특정 인터페이스를 구현한 클래스에만 적용하고 싶은 마커가 있다고 가정하고, 이 마커를 인터페이스로 정의했다면 그냥 마킹하고 싶은 클래스에서만 그 인터페이스를 Impl(구현/확장)하면 된다. 
      • 이는 마킹된 타입은 자동으로 그 인터페잇의 하위 타입인 것이 보장된다. 
  • EX) - Set Interface 
    • 일종의 제약이 있는 마커 인터페이스 
    • Set은 Collection의 하위 타입에만 적용할 수 있으며, Collection이 정의한 메서드 외에는 새로 추가한 것이 X
      • add, equals, hashCode 등 Collection 메서드 몇개의 규약을 살짝 수정만 함 

# 마커 인터페이스의 단점 

  1. 마커 어노테이션은 거대한 어노테이션의 시스템의 지원을 받는다. (즉, 마커 인터페이스는 어노테이션의 장점을 살리지 못함)
  2. 어노테이션을 주로 쓰는 프레임워크라면 마커 어노테이션을 통한 기능/활용이 마커 인터페이스를 사용하는 것보다 용이하다.
구현시, "이 마킹이 된 객체를 매개변수로 받는 메서드를 작성해야하는가?" 라고 자문
-> Yes : 마커 인터페이스
-> No : 마커 어노테이션

 

정리 :
- 마커 인터페이스와 마커 어노테이션은 각자의 쓰임이 있다.
  - 새로 추가하는 메서드 없이 단지 타입 정의가 목적이라면 마커 인터페이스를 선택할 것.
  - 클래스나 인터페이스 외의 프로그램 요소에 마킹해야하거나, 어노테이션을 적극 활용하는 프레임워크의 일부로 그 마커를 적용해야한다면 마커 어노테이션이 올바른 선택지
마커 인터페이스가 적절할 지, 마커 어노테이션이 적절할 지 충분히 고민하고 사용하자 

Item 22) 타입을 정의할 것이면 인터페이스 사용 <-> 타입을 정의할 것이 아니라면 인터페이스를 사용하지 말 것
728x90
반응형