[이펙티브자바] item41. 정의하려는 것이 타입이라면 마커 인터페이스를 사용하라

wally·2022년 6월 22일
0

1. 마커 인터페이스란?

  • 마커 인터페이스는 일반적인 인터페이스와 동일하지만 사실상 아무 메소드도 선언하지 않은 인터페이스를 말한다.
public interface example{

}
  • 자바의 대표적인 마커 인터페이스로는 Serializable, CloneableSpring에서 event 리스너를 사용한다면 종종 보이는 EventListener라는 인터페이스도 있다.
  • 사용용도는 대부분의 경우에는 단순한 타입 체크이다.

  • 주 사용 용도는 Serializableimplements 하지 않은 경우 직렬화를 사용할 수 없는 것이다. 그게 다다. 실제로 관련 메서드를 뜯어보면 수많은 if 문들을 통해 Serializableimplements 하는지 체크한다. 안하면 예외를 던진다.

2. 마커 인터페이스의 장점

  1. 마커 애노테이션과 달리 구현한 클래스의 인스턴스들을 구분하는 타입으로 쓸 수 있다. (타입지정)
    타입을 통해 맞지 않은 타입 혹은 하위타입이 아니면 컴파일 에러가 발생할 것이다
  • 마커 애노테이션은 런타임에 오류를 잡는다.
  • 마커 인터페이스는 타입으로 컴파일타임에 오류를 잡는다.
  1. 적용 대상을 더 정밀하게 지정할 수 있다.
    (의문!! -> 클래스 로만 바라보기에 더 정밀!?)
  • 애노테이션은 @TargetElementType.TYPE 으로 선언한 모든 타입(클래스, 인터페이스, 열거 타입, 애노테이션) 에 달 수 있다 -> 즉 더 세밀하게 제한하지는 못한다.
  • 마커 인터페이스는 마킹하고 싶은 클래스에서만 인터페이스를 구현(확장)하면 된다. 그러면 자동으로 하위 타입임이 보장된다.

Set 마커 인터페이스?

  • 저자는 Set 인터페이스도 일종의 마커 인터페이스로 바라본다. 클래스를 뜯어보면 메서드들이 설정되어있다.
  • 하위 타입지정이라는 마커 인터페이스의 특징을 생각하면 명시 목적으로 사용가능하다고 한다.
  • 또한 객체의 특정 부분을 불변식으로 규정하는것도 가능하다고 한다.
    분변식 : 프로그램 실행 일정 시간동안 항상 참이 되는 조건 - 타입을 통한 명시
  • 그 타입의 인스턴스는 다른 클래스의 특정 메서드가 처리할 수 있다는 사실을 명시하는 용도로 사용할 수 있다.

3. 마커 애노테이션의 장점

  • 거대한 애너테이션의 시스템의 지원을 받는다.
    • 활용프레임워크가 마커 애너테이션을 쓴다면 일관성을 고려하여 사용하라

결론

  • 클래스와 인터페이스 외의 요소(모듈, 패키지, 필드, 지역변수) 에 마킹할 떄는 애너테이션을 써라
  • 마킹된 객체가 매개변수로 받는 메서드가 존재한다면 인터페이스를 써라(타입지정 + 컴파일시점에 오류를 잡는다)
  • 그렇지 않다면 마커 애너테이션이 나은 선택일 것이다.
  • 애너테이션을 활발히 활용하는 프레임워크라면 마커 애너테이션을 써라

타입을 정의할 거라면 인터페이스를 써라. 타입 지정이 아니라면 인터페이스를 사용하지 말자

참고

이펙티브 자바

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=salinokl&logNo=221053934445

https://woovictory.github.io/2019/01/04/Java-What-is-Marker-interface/

profile
클린코드 지향

0개의 댓글