스터디/이펙티브 자바

[Effective Java] Item41. 정의하려는 것이 타입이면 마커 인터페이스를 활용하라

📝 작성 : 2022.07.03  ⏱ 수정 : 
728x90

마커 인터페이스

일반적인 인터페이스와 동일하지만 아무 메서드도 선언하지 않은 형태의 인터페이스입니다. 자신을 구현하는 클래스가 특정 속성을 가짐을 표시하기 위해 사용합니다.
대표적인 마커 인터페이스로는 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 마커 인터페이스를 구현하지 않은 클래스를 인자로 넘긴다면 컴파일 오류가 발생합니다.

마커 애너테이션의 장점

애너테이션을 적극 활용하는 프레임워크에서는 일관성을 유지하기 위해 마커 애너테이션을 쓰는 것이 좋습니다.

정리

마킹이 된 객체를 매개변수로 받는 메서드를 작성할 일이 있다면 마커 인터페이스를 사용하고, 아니라면 마커 애너테이션을 사용합니다.
하지만 애너테이션을 적극 활용하는 프레임워크에서는 마커 애너테이션을 사용하는 편이 좋습니다.

반응형