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/
반응형
'번역 > C# Notes for Professionals' 카테고리의 다른 글
42.2: 정적 (Static) 클래스의 수명 (lifetime) (0) | 2022.05.19 |
---|---|
42.1: 정적 (Static) 클래스 (0) | 2022.04.27 |
41.6: 인터페이스 사용 목적 (0) | 2022.04.23 |
41.5: 다중 인터페이스 구현 (implement) 하기 (0) | 2022.04.23 |
41.4: 인터페이스 구현 예제로써의 IComparable<T> (0) | 2022.04.21 |