상세 컨텐츠

본문 제목

인터페이스 릴레이

소프트웨어 공학

by ryujt 2012. 6. 1. 17:29

본문

하나의 시스템을 여러 개로 나눠서 구현 할 때 가끔 구성원이 된 내부 객체의 인터페이스를 외부에서도 사용해야 할 경우가 생깁니다.  초보자들의 경우 이런 경우를 만났을 때, 무조건 해당 인터페이스를 가진 객체를 public으로 선언하여 외부에 노출 시키는 경우를 많이 봅니다.  이 포스트에서는 public으로 노출 시킬 필요가 없는 객체를 노출시키지 않고 인터페이스만 릴레이 하는 방법을 설명합니다. 


[그림 1]을 보면 화상회의를 위한 TVideoChat 클래스가 여러 개의 작은 클래스로 나누어져서 구현이 된 모습을 표현하고 있습니다.  이때, TVideoChat에 포함된 TSocket과 같은 클래스는 private로 선언하여 밖에서는 접근할 수 없도록 캡슐화하였습니다.  사용자는 단지 화상채팅을 시작하기 위해서 Start 메소드를 실행하거나, Stop 메소드를 통해서 화상채팅을 중단 할 수 있도록 하였습니다.  내부의 동작은 구체적으로 알지 못하여도 상관없도록 구성되어 있는 상태입니다.



[그림 1]


하지만, 만약 출력되는 음성의 볼륨을 제어하고 싶다면 어떻게 해야 할 까요?  쉽게 떠올릴 수 있는 방법은 서두에 이미 거론했듯이, FVoicePlayer를 public으로 바꾸고 "TVideoChat.FVoicePalyer.Volume := 50"과 같은 형식을 취하는 것 입니다.  (예시된 소스가 문법적으로 문제가 있으나 설명을 짧게 하기 위해서 무시하기로 합니다)  


그러나, 개인적으로는 이러한 방법은 그다지 추천 하고 싶지 않습니다.  이유는 [그림 1]에 표현되지 않았지만, TVoicePlayer가 TSocket 등과 연관되어 있는 인터페이스까지 모두 밖으로 노출되기 때문입니다.  불필요한 인터페이스를 노출하는 것은 시스템을 이해하기 어렵게 할 뿐 아니라, 추후 예상치 못한 문제를 일으킬 수 있습니다.


두 번째 방법으로는, TVoiceChat에 "SetVolume(AVolume:integer)"와 같은 메소드 등을 만들고 해당 메소드가 FVoicePlayer의 Voulme을 조절하도록 하는 것 입니다.  꼭 필요한 인터페이스를 추가하고 실제 동작은 내부 객체의 인터페이스에 전달하는 방식입니다.   


이러한 릴레이 방식은 일견 문제가 없어 보이긴 하지만, 경우에 따라 서로 다른 종류의 인터페이스가 TVoiceChat에 밀집되면서 역시 시스템을 이해하는데 어렵게 만들 수가 있습니다.  [그림 2]는 Interface 키워드를 이용해서, 인터페이스를 렐레이 하는 방법을 설명하고 있습니다.


키워드의 Interface와 개념적 인터페이스를 구분하기 위해서, 전자는 영어로 후자는 한글로 표기하고 있습니다.



[그림 2]


[그림 2]의 경우에는 "TVideoChat.VoicePlayer.SetVolume(50)"과 같은 형식으로 볼륨을 조절 할 수 있게 됩니다.  마치 FVoicePlayer를 public으로 선언한 것과 같은 효과가 있지만, Interface 키워드를 통해서 꼭 필요한 인터페이스만 외부로 노출 할 수 있다는 장점이 있습니다.  복잡한 시스템을 구성 할 때 추천되는 인터페이스 릴레이 방식 입니다.


관련글 더보기