본문 바로가기

프로그래밍/C++

객체지향 - 인터페이스와 구현의 분리

< 인터페이스와 구현의 분리 >



객체 지향에서는 인터페이스와 구현의 분리를 아주 중요하게 여깁니다. 
인터페이스라는 용어는 여러곳에 쓰이는데,

여기서의 인터페이스는 컴퓨터의 전원버튼을 생각하면, 쉽게 생각할수 있을듯 합니다.


왜!! 분리하느냐? 라는 것은 이것이 주는 이점을 알면 이해할 수 있겠죠. 


눈 앞의 컴퓨터를 예로 들겠습니다. 컴퓨터 본체의 인터페이스를 살펴보면

전원, 리셋버튼, 시디롬 버튼 등의 버튼들과 모니터 연결 케이블, 전원 케이블 등의 케이블이있습니다.. 
우리는 본체내부의 CPU,RAM,BOARD작동 원리를 알 수 없습니다.

혹시, 아시는분이 게시다면, 대단한 내공의 소유자군요..

어쩄든, 대부분의 일반인은 그 내부의 구조를 자세히 알지 못합니다.

뭐, 이외에도 TV나 비디오등 다른 전자기기에도 마찬가지겠지요..

 

하지만, 작동 원리를 몰라도,  우리는 컴퓨터를 부팅시켜서, 사용할수가 있습니다.

왜일까요?

컴퓨터 구조를 몰라도 어쨰서, 우리는 컴퓨터를 사용할 수 있을까요?

당연한 애기지만, 컴퓨터는 사용자가 쉽게 사용할 수 있도록, 전원버튼을 만들어 놨습니다.

우리는 컴퓨터를 사면, 전원케이블을 꽂고, 전원버튼만 누르면, 끝입니다.

 

바로, 이점이 오늘 이야기할  구현과 인터페이스 분리의 첫번쨰 이점입니다.

 

 



==> 1. 사용하기 쉽게 해준다. 

구현은 감추고 꼭 필요한 인터페이스만 유저에게 보여줌으로써 에러를 줄이고 사용을 쉽게 하는 것입니다. 컴퓨터 케이스를 벗기고 컴맹을 데려와서 컴퓨터를 켜보라고 해보세요. 상당히 헤멜껍니다. 

클래스의 설계도 이것과 비슷합니다. 클래스에 쓸데 없는 함수들이 많고, 멤버 변수들까지 public에다 놓는 것은 케이스 없는 컴퓨터를 설계하는 것이나 마찬가지 효과를 냅니다. 게다가 모든 멤버 변수와 함수를 public에다 넣는 것은 구조적 프로그래밍을 하시는 분들에게는 프로그래밍을 편하게 하겠지만 그 프로그래머 외에는 누구에게도 쓰기 편하지 않을 것입니다. 게다가 이것은 클래스들 간의 결합을 강하게 만드는 결과를 내게 됩니다. 여러 클래스들이 서로의 멤버 변수에 접근하고 구현 함수에 접근을 하는 상황은 본체와 모니터의 껍질을 벗겨놓고 무수히 많은 선으로 연결 해 놓은 상황과 같습니다. 제 앞에 있는 컴퓨터는 본체와 모니터가 단 하나의 케이블로 연결 되어 있군요. --;; 모니터와 본체가 하나의 케이블로 연결되어 있기 때문에 모니터를 새로운 기종으로 바꿔도 케이블만 바꿔 연결하면 끝입니다. 본체의 내부 부품을 갈아 끼워도 모니터에는 아무런 영향도 미치지 않습니다. 이것을 통해 또 하나의 이 점을 알 수 있습니다. 


==> 2. 객체 간의 결합을 약하게 해줌으로써 유지 보수의 비용을 줄인다. 

만약 본체와 모니터가 수많은 선을 통해 연결이 되어 있다면 모니터를 새로운 기종으로 바꾸는 데에만 하루가 꼬박 걸릴 수도 있겠지요.
하지만, 실제론, 본체와 모니터에는 단 하나의 케이블만 있기 떄문에,

모니터가 너무 낡아서, 바꾸고 싶다면, 본체에서 케이블 한개만 뽑아서, 다른 모니터에 꼽기만 하면 됩니다.

바로, '유지보수가 적다'입니다.



 


이제 어떻게!!!!!! 구현과 인터페이스를 분리하느냐! 라는 문제를 생각해 봅시다.



1. 최소한의 완전한 인터페이스를 구축한다. 

Effective C++에 나온 말입니다. 클래스에서는 public이 인터페이스를 대표한다고 할 수 있습니다. public에다 쓸데없는 함수를 넣지 말라는 말입니다. 필요한 함수는 모두 넣되 쓸데 없는 것은 모두 빼고 최소화 하라는 것이지요. 

그러나 말이 쉽지.. 실제로는 쉽지 않습니다. 필요한 함수일 것 같은데 나중에 보면 쓸데없는 경우도 많지요. 그래서 필요한 것이 Refactoring(재 분해) 입니다. 

먼저 이번에 구현할 기능을 정하고, 그것을 위해 꼭 필요한 함수만 만듭니다. 

그리고 다음 기능 구현할 때 필요한 함수를 또 추가하고, 바뀌어야 될 함수는 바꾸고 해서 점진적이고 반복적으로 설계를 발전시켜 나가는 것입니다. 

점진적이고 반복적인 설계와 개발은 Extreme Programming의 핵심이지요. 

 

 



2. 멤버 변수를 public에다 넣지 않는다. 

Effective C++에 나온 말입니다.

멤버 변수를 public에다 넣는게 안좋다는 것은 다 아실 껍니다. 

만약, CPU나 RAM이 컴퓨터 밖에 드러나 있다면, 어떻게 될까요? ㅡㅡ;

멤버변수를 은폐하는건 분명한 이유가 있습니다.

사용자가 건들지 못하게 하는것입니다.

우리는 믿고 써야 합니다.

그렇다면, 클래스 구조가 잘못되었다면?

그러면, A/S를 부르면 됩니다.

컴퓨터가 고장나면, A/S를 부르듯이..ㅡㅡ;



3. 객체 간의 상호 작용에 심혈을 기울인다. 


이점은 확실히 경험인것 같습니다.

처음엔 멤버변수 등을 모두 public에 넣는 것이 편하게 느껴지겠지만, 노력 하다보면 public에 안 넣는게 더 편하게 되실 것입니다. 이것의 이점을 생각한다면 힘들더라도 충분히 가치있는 일이겠죠. 
Booch도 말했더랬죠. "설계가 얼마나 잘 되느냐는 객체 간의 상호작용에 얼마나 노력을 쏟아 붓느냐 에 달렸다" 라고..(Booch는 UML을 만든 사람 중 하나임) 


 

4. 디자인 패턴을 이용한다.


디자인 패턴이 이것을 도와줍니다.

유지 보수의 비용을 적게 하고 직관적기 때문에 이해가 쉽고

유연하게 잘 돌아가는 그런 클래스 설계가 바로 디자인 패턴이라 할 수 있습니다.

 


오늘의 요점은 간단히 요약할 수 있겠네요.

 

컴퓨터를 부팅할때, 전원버튼만 누를것인가?

아니면, 본체뚜껑을 열어, 메뉴얼을 보며,각종 케이블을 하나씩 연결하여, 작동하게 할것인가?



=======================================================================================================================




10여년전 모까페에 인터페이스에 대해 강의했던 내용이다.


부끄럽지만, 다시 공개해본다.



http://cafe.naver.com/jzsdn/5012

'프로그래밍 > C++' 카테고리의 다른 글

Visual C++ 데이터 형식(범위)  (0) 2016.01.29
매크로(define) 재정의 충돌문제 해결  (0) 2016.01.26
C++11 enum class  (0) 2016.01.21
FreeImage 라이브러리  (0) 2015.10.11
C++ 헤더 중복방지  (0) 2015.10.07