Effective Java : 아이템 41. 정의하려는 것이 타입이라면 마커 인터페이스를 사용하라.

    아이템 41. 정의하려는 것이 타입이라면 마커 인터페이스를 사용하라.

    핵심 요약을 하면 다음과 같다. 

    • 마커 인터페이스는 특정 기능이 추가되는 것은 아니고, 타입 정의를 목표로 함. 
    • 마커 인터페이스는 컴파일 시점에 타입 에러를 확인할 수 있음. 마커 어노테이션은 컴파일 시점에 에러 확인이 불가능함. 
    • 마커 인터페이스는 클래스, 인터페이스에만 사용 가능. 그 외에는 마커 어노테이션을 사용함. 
    • 메서드의 매개변수로 받는 타입이라면 마커 인터페이스를 사용해야함. (마커 어노테이션은 타입을 보장할 수 없음) 

    마커 인터페이스란?

    마커 인터페이스는 다음 특징을 가지는 인터페이스를 의미한다. 

    • 인터페이스 내부에 어떠한 메서드도 담지 않는다. 즉, 인터페이스를 구현하는 클래스가 구현해야 할 것이 없다. 
    • 이 인터페이스를 구현하는 구현체의 타입을 '마커 인터페이스'로 정의하기 위함이다. 

    예를 들면 Serializable 같은 인터페이스가 있다. 아래에서 볼 수 있듯이 Serializable 인터페이스는 아무런 역할도 하지 않는다. 

    public interface Serializable {
    }

    마커 인터페이스 / 마커 어노테이션 각각의 장점은?

    마커 인터페이스와 어노테이션은 각각의 장점이 있다. 따라서 적재적소에 잘 사용하는 것이 중요하다. 먼저 마커 인터페이스의 장점은 다음과 같다. 

     

    1. 마커 인터페이스는 타입으로 사용할 수 있다. 어노테이션은 불가능하다. 

    마커 인터페이스는 '타입'으로 사용될 수 있다. 마커 인터페이스 타입을 매개변수로 받는 메서드가 있다면, 타입이 맞지 않을 때 컴파일 에러로 미리 잡아낼 수 있다. 마커 어노테이션은 타입이 아니기 때문에 타입과 관련된 컴파일 에러를 잡아낼 수는 없다. 

     

    2. 마커 인터페이스는 적용 대상을 더 정밀하게 지정할 수 있다.

    마커 인터페이스의 적용 대상은 클래스와 인터페이스만 가능하다. 반면 마커 어노테이션은 @Target(적용 대상)을 ElementType.TYPE으로 선언한 경우 모든 타입(클래스, 인터페이스, 열거 타입, 어노테이션)에 선언할 수 있게 된다. 즉, 마커 어노테이션보다 세밀하게 적용할 수 있는 것은 마커 인터페이스다. 

     

    3. 마커 어노테이션은 프로그램 요소에 마킹해야 할 때 유리하다.

    마커 인터페이스는 클래스, 인터페이스에만 적용이 가능했다. 이 외에 패키지, 메서드, 어노테이션 등에 마킹을 해야한다면 마커 어노테이션을 사용할 수 밖에 없다. 

     

    4. 마커 어노테이션은 어노테이션 기반 프레임워크에 좋다. 

    어노테이션 기반 프레임워크는 어노테이션으로 많은 기능을 제공해준다. 따라서 '마킹'이라는 것도 어노테이션을 사용하면, 프레임워크의 전체적인 코드의 일관성을 유지하는데 유리하다. 


    마커 인터페이스는 언제 쓸까?

    마커 인터페이스는 '타입'을 지정해서, '타입'과 관련된 컴파일 에러를 미리 발생시킨다는 장점이 있다. 만약 마커 인터페이스 / 어노테이션 중에 고민하고 있는 경우라면 다음을 생각하면 된다. 

    마커 인터페이스가 메서드의 매개변수로 사용되는 경우가 있을까? 있다면 망설이지 말고 마커 인터페이스를 사용하면 된다. 

    댓글

    Designed by JB FACTORY