마커 인터페이스
일반적인 인터페이스와 동일하지만 아무 메서드도 선언하지 않은 형태의 인터페이스입니다. 자신을 구현하는 클래스가 특정 속성을 가짐을 표시하기 위해 사용합니다.
대표적인 마커 인터페이스로는 Serializable
, Cloneable
등이 있습니다.
마커 애너테이션과의 비교
마커 인터페이스의 장점
마커 인터페이스는 이를 구현한 클래스의 인스턴스들을 구분하는 타입으로 사용할 수 있습니다.
ObjectOutputSteam.writeObject
메서드의 경우 Serializable
을 구현하지 않은 경우 NotSerializableException
예외를 발생시킵니다.
마커 애너테이션도 Java Reflection을 이용하여 같은 기능을 할 수 있습니다.
@MySerializable
public class MyClass {}
class Test {
public static void main(String[] args) throws NotSerializableException {
MyClass myClass = new MyClass();
MySerializable annotation = myClass.getClass().getAnnotation(MySerializable.class);
if (!(annotation instanceof MySerializable)) {
throw new NotSerializableException("cannot serializable");
}
// doSomething
}
}
마커 인터페이스의 진정한 장점은 오류를 컴파일 타임에 할 수 있다는 것입니다.
public String doSomething(Serializable serializable) {
// doSomething
}
위의 doSomething메서드에 Object와 같이 Serializable 마커 인터페이스를 구현하지 않은 클래스를 인자로 넘긴다면 컴파일 오류가 발생합니다.
마커 애너테이션의 장점
애너테이션을 적극 활용하는 프레임워크에서는 일관성을 유지하기 위해 마커 애너테이션을 쓰는 것이 좋습니다.
정리
마킹이 된 객체를 매개변수로 받는 메서드를 작성할 일이 있다면 마커 인터페이스
를 사용하고, 아니라면 마커 애너테이션
을 사용합니다.
하지만 애너테이션을 적극 활용하는 프레임워크에서는 마커 애너테이션
을 사용하는 편이 좋습니다.
반응형
'스터디 > 이펙티브 자바' 카테고리의 다른 글
[Effective Java] Item43. 람다보다는 메서드 참조를 사용하라 (0) | 2022.07.03 |
---|---|
[Effective Java] Item42. 익명 클래스보다는 람다를 사용하라 (0) | 2022.07.03 |
[Effective Java] Item40. @Override 애너테이션을 일관되게 사용하라 (0) | 2022.07.03 |
[Effective Java] Item39. 명명 패턴보단 어노테이션 (0) | 2022.06.26 |
[Effective Java] Item38. 확장가능한 열거 타입이 필요하면 인터페이스 (0) | 2022.06.26 |