[[객체지향의 기본 개념]]
객체 지향에 대한 체계적인 설명은 못 드리겠고, 생각나는 대로 간략하게 설명을 하겠습니다.
< 인터페이스와 구현의 분리 >
객체 지향에서는 인터페이스와 구현의 분리를 아주 중요하게 여깁니다.
인터페이스와구현이 뭔지는 아시겠죠? 모르시면 메일을..
왜!! 분리하느냐? 라는 것은 이것이 주는 이점을 알면 이해할 수 있겠죠.
눈 앞의 컴퓨터를 예로 들겠습니다. 컴퓨터 본체의 인터페이스를 살펴보면 전원, 리
셋버튼, 시디롬 버튼 등의 버튼들과 모니터 연결 케이블, 전원 케이블 등의 케이블이있습니다..
그럼 이제 컴퓨터의 구현을 살펴보죠.
...
...
...
헉!! 구현은 너무 복잡해서 생략 했습니다. 암튼 컴퓨터의 내부 동작은 무쟈게 복잡하다는
것을 아실껍니다. 내부 부품도 무쟈게 많고 부품들 간의 통신도 무쟈게 복잡하죠.
그러나 유저들은 아주 쉽게 사용합니다. 컴맹이라는 사람들도 컴퓨터를 켜고 끄는 것이나,
시디롬을 열고 닫는 것은 문제 없이 해내지요.
이것이 바로 구현과 인터페이스 분리의 첫 번째 이점입니다.
==> 1. 사용하기 쉽게 해준다.
라는 것이지요. 구현은 감추고 꼭 필요한 인터페이스만 유저에게 보여줌으로써 에러
를 줄이고 사용을 쉽게 하는 것입니다. 컴퓨터 케이스를 벗기고 컴맹을 데려와서 컴퓨터를 켜보라고 해보세요. 상당히 헤멜껍니다.
클래스의 설계도 이것과 비슷합니다. 클래스에 쓸데 없는 함수들이 많고, 멤버 변수
들까지 public에다 놓는 것은 케이스 없는 컴퓨터를 설계하는 것이나 마찬가지 효과를
냅니다. 게다가 모든 멤버 변수와 함수를 public에다 넣는 것은 구조적 프로그래밍을
하시는 분들에게는 프로그래밍을 편하게 하겠지만 그 프로그래머 외에는 누구에게도
쓰기 편하지 않을 것입니다. 게다가 이것은 클래스들 간의 결합을 강하게 만드는 결과를 내게 됩니다. 여러 클래스들이 서로의 멤버 변수에 접근하고 구현 함수에 접근을 하는 상황은 본체와 모니터의 껍질을 벗겨놓고 무수히 많은 선으로 연결 해 놓은 상황과 같습니다. 제 앞에 있는 컴퓨터는 본체와
모니터가 단 하나의 케이블로 연결 되어 있군요. --;; 모니터와 본체가 하나의 케이블로 연결되어 있기 때문에 모니터를 새로운 기종으로 바꿔도 케이블만 바꿔 연결하면 끝입니다. 본체의 내부 부품을
갈아 끼워도 모니터에는 아무런 영향도 미치지 않습니다. 이것을 통해 또 하나의 이 점을 알 수 있습니다.
==> 2. 객체 간의 결합을 약하게 해줌으로써 유지 보수의 비용을 줄인다.
만약 본체와 모니터가 수많은 선을 통해 연결이 되어 있다면 모니터를 새로운 기종으
로 바꾸는 데에만 하루가 꼬박 걸릴 수도 있겠지요. 잘못 연결해서 망가뜨리는 경우
도 생길 수 있습니다. 반면에 수많은 선을 통해 직접 연결되기 때문에 단일 케이블로
연결되는 것보다 속도가 더 빠를 수도 있습니다. 눈꼽 만큼의 차이도 안 되겠지만요.
프로그래밍에서도 마찬가지로 객체 지향 방식과 구조적 프로그래밍 방식의 속도 차이
는 눈꼽 만큼도 안 됩니다. 차이가 없다고 봐도 무방하지요.
헉헉~ -_-;; 이 밖에 이점이 많이 있으나 스스로 생각해 보시면 잘 아실 수 있을 것입
니다. 생각이 잘 안나는군요 ㅠ_ㅠ
이제 어떻게!!!!!! 구현과 인터페이스를 분리하느냐!라는 문제를 생각해 봅시다.
1. 최소한의 완전한 인터페이스를 구축한다.
Effective C++에 나온 말입니다. 클래스에서는 public이 인터페이스를 대표한다고 할 수 있습니
다. public에다 쓸데없는 함수를 넣지 말라는 말입니다. 필요한 함수는 모두 넣되 쓸데 없는 것은
모두 빼고 최소화 하라는 것이지요.
그러나 말이 쉽지.. 실제로는 쉽지 않습니다. 필요한 함수일 것 같은데 나중에 보면 쓸데없는 경
우도 많지요. 그래서 필요한 것이 Refactoring(재분해) 입니다.
먼저 이번에 구현할 기능을 정하고, 그것을 위해 꼭 필요한 함수만 만듭니다.
그리고 다음 기능 구현할 때 필요한 함수를 또 추가하고, 바뀌어야 될 함수는 바꾸고 해서 점진적
이고 반복적으로 설계를 발전시켜 나가는 것입니다.
점진적이고 반복적인 설계와 개발은 Extreme Programming의 핵심이지요.
자세한 것은 책들을 참조하세요.
2. 멤버 변수를 public에다 넣지 않는다.
마찬가지로 Effective C++에 나온 말입니다. 멤버 변수를 public에다 넣는게 안좋다는 것은 다
아실 껍니다. 이것도 자세한 것은 책을 참조.
3. 객체 간의 상호 작용에 심혈을 기울인다. 역시 노력 뿐인 것 같습니다. -_-;; 처음엔 멤버
변수 등을 모두 public에 넣는 것이 편하게 느껴지겠지만, 노력 하다보면 public에 안 넣는게 더
편하게 되실 것입니다. 이것의 이점을 생각한다면 힘들더라도 충분히 가치있는 일이겠죠.
Booch도 말했더랬죠. "설계가 얼마나 잘 되느냐는 객체 간의 상호작용에 얼마나 노력을 쏟아 붓느냐
에 달렸다" 라고..(Booch는 UML을 만든 사람 중하나임)
저런 객체지향 권위자도 클래스의 인터페이스나 상호작용에 많은 노력을 기울이면서 하는데 하물
며 우리같은 사람들이 클래스 설계 하기가 편하지는 않겠죠.
'노력하는 자만이 미인을 얻을 수 있나니..' (맞..낭..? -_-a )
4. 디자인 패턴을 이용한다.
디자인 패턴이 이것을 도와줍니다. 유지 보수의 비용을 적게 하고 직관적기 때문에 이해가 쉽고
유연하게 잘 돌아가는 그런 클래스 설계가 바로 디자인 패턴이라 할 수 있습니다.
<인스턴스>
인스턴스라는 말이 계속 나올 것이므로 약간의 설명을 드리겠습니다.
인스턴스는 클래스의 변수라고 생각하시면 됩니다.
class cObject
{
public:
...
};
이런 클래스가 있고,
cObject Obj1;
이런 변수를 만들었다면 Obj1을 인스턴스라고 부
릅니다.