728x90
반응형
- 마커 인터페이스 : 아무 메서드도 선언되어있지 않고, 단지 자신을 구현하는 클래스가 특정 속성을 가짐을 표시하는 인터페이스
- ex) Serializable : 자신을 구현한 클래스의 인스턴스는 ObjectOutputStream을 통해 Write(Serialization)이 가능하다는 것을 알려줌
- 마커 어노테이션이 등장하면서 마커 인터페이스는 구식이 되었다고들 얘기하지만, 사실은 그렇지 않다.
# 마커 인터페이스의 장점
- 마커 인터페이스는 이를 구현한 클래스의 인스턴스들을 구분하는 타입으로 쓸 수 있으나, 마커 어노테이션은 그렇지 않다.
- 마커 인터페이스는 어엿한 타입이므로, 마커 어노테이션을 사용했다면 런타임 때 발견될 오류를 컴파일 타임에 잡을 수 있다.
- ObjectOutputStream.writeObject 메서드는 이 점을 살리지 못했기 때문에 실제로 런타임에 오류가 발생한다.
- 마커 인터페이스는 적용 대상을 더 정밀하게 지정할 수 있다.
- 적용대상(@Target)을 ElementType.TYPE으로 선언한 어노테이션은 모든 타입(클래스, 인터페이스 , Enum, 어노테이션)에 달 수 있다. -> 부착할 수 있는 타입을 더 세밀하게 제한하지 못한다.
- 특정 인터페이스를 구현한 클래스에만 적용하고 싶은 마커가 있다고 가정하고, 이 마커를 인터페이스로 정의했다면 그냥 마킹하고 싶은 클래스에서만 그 인터페이스를 Impl(구현/확장)하면 된다.
- 이는 마킹된 타입은 자동으로 그 인터페잇의 하위 타입인 것이 보장된다.
- EX) - Set Interface
- 일종의 제약이 있는 마커 인터페이스
- Set은 Collection의 하위 타입에만 적용할 수 있으며, Collection이 정의한 메서드 외에는 새로 추가한 것이 X
- add, equals, hashCode 등 Collection 메서드 몇개의 규약을 살짝 수정만 함
# 마커 인터페이스의 단점
- 마커 어노테이션은 거대한 어노테이션의 시스템의 지원을 받는다. (즉, 마커 인터페이스는 어노테이션의 장점을 살리지 못함)
- 어노테이션을 주로 쓰는 프레임워크라면 마커 어노테이션을 통한 기능/활용이 마커 인터페이스를 사용하는 것보다 용이하다.
구현시, "이 마킹이 된 객체를 매개변수로 받는 메서드를 작성해야하는가?" 라고 자문
-> Yes : 마커 인터페이스
-> No : 마커 어노테이션
정리 :
- 마커 인터페이스와 마커 어노테이션은 각자의 쓰임이 있다.
- 새로 추가하는 메서드 없이 단지 타입 정의가 목적이라면 마커 인터페이스를 선택할 것.
- 클래스나 인터페이스 외의 프로그램 요소에 마킹해야하거나, 어노테이션을 적극 활용하는 프레임워크의 일부로 그 마커를 적용해야한다면 마커 어노테이션이 올바른 선택지
- 마커 인터페이스가 적절할 지, 마커 어노테이션이 적절할 지 충분히 고민하고 사용하자
Item 22) 타입을 정의할 것이면 인터페이스 사용 <-> 타입을 정의할 것이 아니라면 인터페이스를 사용하지 말 것
728x90
반응형
'책 > Effective Java' 카테고리의 다른 글
메서드 참조 (Method Reference) (0) | 2022.03.20 |
---|---|
lambda(람다) 사용법 (0) | 2022.03.20 |
@Override 어노테이션 사용법 (0) | 2022.03.18 |
클래스 계층 구조를 활용하기 (0) | 2022.02.09 |
인터페이스 - 타입을 정의하는 용도로만 사용하기 (0) | 2022.02.07 |