재미로 읽는 C# 스토리

[제목] 후배와의 대화 - Marker Interface

B: 소스코드를 보다가 인터페이스에 아무런 메서드가 없는 Interface가 있던데, 이런 게 가능해요?

public interface IA { }

A: 응, 아무 멤버가 없는 빈 껍데기 Interface를 Marker Interface라고 부르지.

B. 인터페이스는 어떤 Behavior에 대한 규약을 정하는 것인데, Behavior 자체가 없다면, 도대체 왜 그런 인터페이스를 정의하죠? 쓸모가 없을 것 같은데...

A: Marker Interface는 말 그래도 어떤 표식을 남기는 거야. 예를 들어, 1000개의 클래스가 있는데, 이 중 10개의 클래스들은 꼭 이벤트 로깅을 해야한다면, 그 클래스들에 IEventLog 라는 마커 인터페이스를 붙여 두는 거지. 그러면 Framework (혹은 Library)에서 처리할 때, 클래스 객체가 IEventLog 라는 마커 인터페이스를 가지고 있는지 체크해서 가지고 있다면 특별한 처리(이벤트 로깅)을 하는 거고...

if (clsObj is IEventLog)  // 마크 체킹
{ 
    WriteEventLog(clsObj);
} 
else 
{
    Debug.WriteLine(clsObj); 
}

B. 일종의 메타데이타인가?

A. 그래, 일종의 클래스에 대한 메타데이타지. 좀 거창하게는 이러한 스타일을 Marker Interface 패턴이라 부르기도 하고...

B. 그럼 이거 쓰면 뭐 단점은 없어요?

A. 원래 Interface라는 게 한번 클래스에 정의되면 그 클래스 혹은 파생클래스에서 지울 수가 없잖아. 그래서 파생클래스들은 갖고 싶지 않아도 계속 Marker Interface 메타데이타를 갖게되지. Marker Interface가 갖는 단점 때문에서 C#에서는 대신 Attribute를 사용하도록 권장하고 있지. Attribute는 클래스에 좋은 메타데이타 역활을 하니까.. 그리고 상속도 쉽게 없앨 수 있고... 하지만, .NET Framework 내에서 Marker Interface를 가끔 쓰니깐, 알아는 둬야지...



본 웹사이트는 광고를 포함하고 있습니다. 광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.