*알림 : *
Effective Java 3판은 Java 9까지 도입된 언어적 기능을 중심으로 서술되어 있습니다. 10버젼 이후의 Java 개발을 하시는 분들은 우회적인 접근법 대신 Java 언어 내 새로 도입된 기능이 더 간결하고 좋을 수 있습니다.해당 포스팅은 SSAFY 내 책읽기 스터디의 활동을 통해 작성된 포스팅입니다.
https://github.com/kjsu0209/JavaBook
https://medium.com/javabook
마커 인터페이스란 아무런 메서드를 담지 않고, 오로지 해당 클래스가 특정 속성을 가짐을 표현하는 인터페이스다. Serializable이 그 예다. 아무런 추상 메서드를 가지지 않았지만, 해당 클래스의 인스턴스는 ObjectOutputStream을 통해 직렬화가 가능함을 표기한다.
목적을 달성하기 위해 마커 인터페이스와 마커 annotation을 사용할 수 있지만 장단점은 다르다.
마커 인터페이스 vs 마커 annotation
- 마커 인터페이스는 이를 구현한 클래스의 인스턴스를 구분하는 타입으로 쓸 수 있지만, 마커 애너테이션은 그렇지 않다.마커 인터페이스를 쓸 때 주의할 점은, ObjectOutputStream.writeObject 메서드로 설명할 수 있다. 이 메서드는 Serializable이 아닌 Object 객체를 받도록 설계되었기 때문에 Serializable을 구현했는지 컴파일 타임에 검사할 수 없다.
- 마커 인터페이스로는 런타임에 문제를 잡을 수 있지만 마커 annotation으로는 그렇지 못하다.
- 마커 인터페이스는 적용 대상을 더 정밀하게 지정할 수 있다.
- 마커 annotation은 모든 클래스, 인터페이스, enum 타입, annotation에 달 수 있기 때문에 세밀하게 제한할 수 없다. 그러나 마커 인터페이스는 그냥 붙이고 싶은 클래스에 구현하면 끝이다.
- 마커 annotation은 거다핸 annotation 시스템의 지원을 받을 수 있다.
- 어떤 프레임워크가 annotation을 적극 사용한다면, 일관성 유지를 위해 마커 annotation을 사용하는 것이 유리할 것이다.
정리하기
마커 annotation을 사용하는 경우
- 클래스 이외의 요소(모듈, 패키지, 필드, 지역변수 등)에 마킹해야 할 때
- annotation을 적극적으로 활용하는 프레임워크에서
마커 인터페이스를 사용하는 경우
- 마킹이 되는 객체를 매개변수로 받는 메서드를 작성할 일이 있는 경우
- 컴파일 타임에 오류를 잡을 수 있다.
'IT > Effective Java' 카테고리의 다른 글
[Effective Java 3/E] ITEM 43. 람다보다는 메서드 참조를 사용하라 (0) | 2021.04.14 |
---|---|
[Effective Java 3/E] ITEM 42. 익명 클래스보다는 람다를 사용하라 (0) | 2021.04.14 |
[Effective Java 3/E] ITEM 40. @Override Annotation을 일관적으로 사용하기 (0) | 2021.03.28 |
[Effective Java 3/E] ITEM 39. 명명 패턴보다 애너테이션을 사용하라 (0) | 2021.03.28 |
[Effective Java 3/E] ITEM 38. 확장할 수 있는 열거 타입이 필요하면 인터페이스를 사용하라. (0) | 2021.03.28 |
댓글