[Effective Java 3/E] ITEM 41. 정의하려는 것이 타입이라면 마커 인터페이스를 사용하라

    Effective Java 표지. Source : https://blog.insightbook.co.kr/

    *알림 : *
    Effective Java 3판은 Java 9까지 도입된 언어적 기능을 중심으로 서술되어 있습니다. 10버젼 이후의 Java 개발을 하시는 분들은 우회적인 접근법 대신 Java 언어 내 새로 도입된 기능이 더 간결하고 좋을 수 있습니다.

    해당 포스팅은 SSAFY 내 책읽기 스터디의 활동을 통해 작성된 포스팅입니다.
    https://github.com/kjsu0209/JavaBook
    https://medium.com/javabook

     

    JavaBook – Medium

    Documentation space of our book study.

    medium.com

     

    kjsu0209/JavaBook

    책읽기 스터디. Contribute to kjsu0209/JavaBook development by creating an account on GitHub.

    github.com

     

    마커 인터페이스란 아무런 메서드를 담지 않고, 오로지 해당 클래스가 특정 속성을 가짐을 표현하는 인터페이스다. Serializable이 그 예다. 아무런 추상 메서드를 가지지 않았지만, 해당 클래스의 인스턴스는 ObjectOutputStream을 통해 직렬화가 가능함을 표기한다.

    목적을 달성하기 위해 마커 인터페이스와 마커 annotation을 사용할 수 있지만 장단점은 다르다.

     

    마커 인터페이스 vs 마커 annotation

    1. 마커 인터페이스는 이를 구현한 클래스의 인스턴스를 구분하는 타입으로 쓸 수 있지만, 마커 애너테이션은 그렇지 않다.마커 인터페이스를 쓸 때 주의할 점은, ObjectOutputStream.writeObject 메서드로 설명할 수 있다. 이 메서드는 Serializable이 아닌 Object 객체를 받도록 설계되었기 때문에 Serializable을 구현했는지 컴파일 타임에 검사할 수 없다.
    2. 마커 인터페이스로는 런타임에 문제를 잡을 수 있지만 마커 annotation으로는 그렇지 못하다.
    3. 마커 인터페이스는 적용 대상을 더 정밀하게 지정할 수 있다.
    4. 마커 annotation은 모든 클래스, 인터페이스, enum 타입, annotation에 달 수 있기 때문에 세밀하게 제한할 수 없다. 그러나 마커 인터페이스는 그냥 붙이고 싶은 클래스에 구현하면 끝이다.
    5. 마커 annotation은 거다핸 annotation 시스템의 지원을 받을 수 있다.
    6. 어떤 프레임워크가 annotation을 적극 사용한다면, 일관성 유지를 위해 마커 annotation을 사용하는 것이 유리할 것이다.

     

    정리하기

     

    마커 annotation을 사용하는 경우

    1. 클래스 이외의 요소(모듈, 패키지, 필드, 지역변수 등)에 마킹해야 할 때
    2. annotation을 적극적으로 활용하는 프레임워크에서

    마커 인터페이스를 사용하는 경우

    1. 마킹이 되는 객체를 매개변수로 받는 메서드를 작성할 일이 있는 경우
    2. 컴파일 타임에 오류를 잡을 수 있다.

    댓글