Section 41.7: 명시적 구현 (Explicit Implementation) 을 이용해 멤버를 숨김 처리하기

인터페이스 사용 시, 실제로 제공하고자 하지도 않는 기능들로 인해 사용자의 클래스에 불필요하게 많은 멤버가 public 하게 추가될 때가 있다. 이러한 경우, 명시적 구현 (Explicit Implementation) 을 해결책으로 사용할 수 있다.

public interface IMessageService { void OnMessageReceive(); void SendMessage(); string Result { get; set; } int Encoding { get; set; } // 기타 등등 }

일반적으로 클래스가 이 인터페이스를 구현 (implement) 하는 방식은 다음과 같다.

public class MyObjectWithMessages : IMessageService { public void OnMessageReceive(){ } public void SendMessage(){ } public string Result { get; set; } public int Encoding { get; set; } }

위 예제에서 확인할 수 있듯이, 모든 멤버가 public 하게 공개되어 있다.

var obj = new MyObjectWithMessages(); // 아래의 메소드를 호출할 필요가 있는가? obj.OnMessageReceive();

답: 필요하지 않다. 그러나 이 함수가 public 하게 선언 될 필요가 없다 하더라도, 이를 단순히 private 으로 바꾸어 선언한다면 컴파일러가 에러를 발생시킬 것이다.

이러한 경우에 명시적 구현 (explicit implementation) 을 사용할 수 있다:

public class MyObjectWithMessages : IMessageService{ void IMessageService.OnMessageReceive() { } void IMessageService.SendMessage() { } string IMessageService.Result { get; set; } int IMessageService.Encoding { get; set; } }

이제 필요한 멤버를 구현 (implement) 은 하였으나 해당 클래스에서는 어떠한 멤버도 public 하게 외부에 노출되지 않게 하였다.

var obj = new MyObjectWithMessages(); /* MyObjectWithMessages 타입에는 존재하지 않는 멤버라 에러가 발생할 것이다. * 해당 함수를 "private" 하게 변경하였다고 생각할 수 있다. */ obj.OnMessageReceive();

이렇듯 명시적 구현을 사용한 상황에서 만약 해당 멤버를 사용해야 하는 경우가 발생한다면, 객체를 인터페이스 형식으로 캐스팅하여 접근 가능하다.

((IMessageService)obj).OnMessageReceive();
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

+ Recent posts