요약
새로 추가하는 메서드 없이 타입 정의가 목적이라면 마커 인터페이스를 선택하고,
인터페이스/클래스 외의 프로그램 요소(모듈, 패키지, 필드, 지역 변수)에 마킹을 하거나 애너테이션을 많이 사용하는 프레임워크를 사용할 때는 마커 애너테이션을 사용하자.
마커 인터페이스란
마커 인터페이스는 아무 메서드도 담고 있지 않고, 단지 자신을 구현하는 클래스가 특정 속성을 가짐을 표시해 주는 인터페이스를 의미한다.
예시로 Serializable 인터페이스가 있다. Serializable은 자신을 구현한 클래스의 인스턴스는 ObjectOutputStream을 통해 직렬화 할 수 있다고 알려주는 인터페이스이다.
마커 인터페이스 vs. 마커 애너테이션
마커 인터페이스 > 마커 애너테이션
- 마커 인터페이스는 타입을 구분할 수 있다
- 컴파일 타임에 오류를 잡아낼 수 있다
- 반면 마커 애너테이션은 런타임에 오류를 잡아낼 수 있다
- 마커 인터페이스는 적용 대상을 더 정밀하게 지정할 수 있다
- 마커 애너테이션은 적용 대상을 @Target(Element.TYPE)으로 지정할 수 있지만, 세밀하게 하지는 못한다
- 반면 마커 인터페이스는 클래스가 해당 인터페이스를 구현하면 되기 때문에 원하는 곳에 적용할 수 있다
마커 인터페이스 < 마커 애너테이션
- 마커 애너테이션은 애너테이션의 시스템 지원을 받을 수 있다
- 애너테이션을 적극 활용하는 프레임워크에서는 마커 애너테이션을 쓰는 쪽이 일관성을 지키는 데 더 유리하다
정리
마커 애너테이션을 사용해야 할 때
- 인터페이스나 클라스가 아닌 프로그램 요소(모듈, 패키지, 필드, 지역 변수)에 마킹을 해야할 때
- 애너테이션을 많이 사용하는 프레임워크를 사용할 때
마커 인터페이스를 사용해야 할 때
- 마킹이 된 객체를 매개변수로 받는 메서드 작성이 필요할 때
- 매개변수 타입으로 마커 인터페이스를 설정하면 컴파일타임에 오류가 발생하기 때문
'Dev Language > EffectiveJava' 카테고리의 다른 글
[EffectiveJava] 스트림에서는 부작용 없는 함수를 사용하라 (0) | 2025.02.23 |
---|---|
[EffectiveJava] 익명 클래스보다는 람다를 사용하라 (2) | 2025.02.16 |
[EffectiveJava]명명패턴 대신 애너테이션을 사용하라 (0) | 2025.01.31 |
[EffectiveJava]비트 필드 대신 EnumSet을 사용하라 (2) | 2025.01.25 |
[EffectiveJava] int 상수 대신 열거 타입(Enum)을 사용하라 (2) | 2025.01.18 |