1. 마커 인터페이스란?
- 마커 인터페이스는 일반적인 인터페이스와 동일하지만 사실상 아무 메소드도 선언하지 않은 인터페이스를 말한다.
public interface example{
}
- 자바의 대표적인 마커 인터페이스로는
Serializable
, Cloneable
과 Spring
에서 event
리스너를 사용한다면 종종 보이는 EventListener
라는 인터페이스도 있다.
- 사용용도는 대부분의 경우에는 단순한 타입 체크이다.
- 주 사용 용도는
Serializable
을 implements
하지 않은 경우 직렬화를 사용할 수 없는 것이다. 그게 다다. 실제로 관련 메서드를 뜯어보면 수많은 if
문들을 통해 Serializable
을 implements
하는지 체크한다. 안하면 예외를 던진다.
2. 마커 인터페이스의 장점
- 마커 애노테이션과 달리 구현한 클래스의 인스턴스들을 구분하는 타입으로 쓸 수 있다. (타입지정)
타입을 통해 맞지 않은 타입 혹은 하위타입이 아니면 컴파일 에러가 발생할 것이다
- 마커 애노테이션은 런타임에 오류를 잡는다.
- 마커 인터페이스는 타입으로 컴파일타임에 오류를 잡는다.
- 적용 대상을 더 정밀하게 지정할 수 있다.
(의문!! -> 클래스 로만 바라보기에 더 정밀!?)
- 애노테이션은
@Target
을 ElementType.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/