Skip to content

Latest commit

 

History

History
41 lines (31 loc) · 2.54 KB

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

File metadata and controls

41 lines (31 loc) · 2.54 KB

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

마커 인터페이스(Marker interface)

  • 아무 메서드도 담고 있지 않고, 단지 자신을 구현하는 클래스가 특정 속성을 가짐을 표시해주는 인터페이스
  • 예) Serializable: 나를 구현한 클래스의 인스턴스는 직렬화할 수 있어!
  • Set도 일종의 마커 인터페이스로 볼 수 있다.
    • Collection의 하위 타입에만 적용할 수 있다.
    • Collection이 정의한 메서드 외에는 새로 추가한 것이 (거의) 없다.
    • 이처럼 특정 인터페이스의 하위 타입에만 적용할 수 있으며, 규약에 손대지 않은 마커 인터페이스는 충분히 있음직하다.

마커 애너테이션(Marker annotation) — 아이템 39

  • 요소가 하나도 정의되지 않은 애너테이션
  • 프로그램에게 추가 정보를 제공하여 특별한 처리를 하도록 한다.
  • 예) @Override, @Test

마커 인터페이스 사용의 이점

  • 마커 인터페이스를 구현한 클래스의 인스턴스들을 구분하는 타입으로 쓸 수 있다.
    • 마커 인터페이스도 어엿한 타입이다.
    • 따라서 오류를 컴파일타임에 잡을 수 있다.
  • 적용 대상을 더 정밀하게 지정할 수 있다.
    • @Target(ElementType.TYPE)으로 선언한 애너테이션은 모든 타입(클래스, 인터페이스, 열거 타입, 애너테이션)에 달 수 있다.
    • 하지만 마커 인터페이스는 마킹하고 싶은 클래스에서만 그 인터페이스를 구현하면 된다.
    • 부착할 수 있는 타입을 더 세밀하게 제한할 수 있다.

마커 애너테이션 사용의 이점

  • 거대한 애너테이션 시스템의 지원을 받는다.
    • 애너테이션을 적극 활용하는 프레임워크에서는 마커 애너테이션을 사용하는 것이 유리할 수 있다.

마커 인터페이스 vs 마커 애너테이션, 무엇을 쓸까?

  • 적용 대상이 ElementType.TYPE인 마커 애너테이션은, 마커 인터페이스가 낫지 않을지 고민해 보자.
  • 마커 인터페이스
    • 마킹된 객체를 매개변수로 받는 메서드를 작성할 일이 있을 때 → 마커 인터페이스를 매개변수 타입으로 하여 컴파일타임에 오류를 잡을 수 있다.
  • 마커 애너테이션
    • 클래스나 인터페이스가 아닌, 모듈, 패키지, 필드, 지역변수 등에 마킹할 때
    • 애너테이션을 활발히 활용하는 프레임워크에서 사용할 때