본문 바로가기

기타/객체지향의 탄생(2013)

객체지향의 탄생-객체지향 보물지도의 해석

꼬마때 동화나 만화, 고전 소설들을 읽다보면 보물이 꼭꼭 숨겨져 있다. 보물을 찾기 위한 험난한 스토리가 이어진다. 진부하면서도 손을 놓을 수 없는 스토리 전개에 푹 빠졌다. 어린 나이에 나도 보물을 찾아 어려운 집안에 도움을 줘야겠다는 상상도 했다. 그러나 지금 생각해보니 보물찾기 소설은 어쩌면 한탕주의를 부추기는 스토리이기도 하다.

 

중학교때는 무협소설, 무협영화에 빠져지냈다. 유명한 황비홍, 동방불패 시리즈를 보며 인간의 한계를 저렇게 뛰어넘을수도 있겠구나 싶었다. 무협에 대해 좀더 알고 싶어 여러 무협소설을 읽었다. 무협소설도 읽어보니 공통점이 있다. 하나의 무공비급을 얻기위해 각 인물이나 문파들이 기를쓰고 싸운다는 것이다. 무공비급들도 하나의 책에 불과할 것인데, 무공비급만 얻으면 천하무적이 되는 설정이 지금 보면 과장 되었다는 생각이 든다.

 

 

소프트웨어 분야에서 객체지향은 보물이고 무공비급일까~ 라고 생각하면 그 정도까지는 아닌 것 같다. 보물이고 무공비급이면 조금만 알아도 바로 효과를 봐야 할 것이지만 알면 알수록 어렵기만 하고 써먹기 힘들다.

 

객체지향이 보물이고 무공비급이라기 보다는 보물을 찾아내기 위한 보물지도라고 보는 것이 정확한 비유이다.

 

보물지도는 보통 이해하기 어려운 암호도 있고 수수께끼도 함께 있다. 탐험가들은 보물지도를 보며 여러 차례 지도의 뜻을 이해하고 해석하며 지도의 길을 따라가는데 평생을 바친다. 객체지향 역시 보물지도처럼 많은 노력을 하여 이해를 해야 한다. 보물지도 이해를 확실히 할수만 있다면 우리는 객체지향 보물지도가 안내하는 진짜 보물을 찾게 될 것이다.

 

 

객체지향 세계는 숨겨진 보물이 가득찬 이상한 나라의 엘리스와 같다. 먼저 객체지향 세계의 인터페이스니, 오버라이딩이니, 폴리모피즘이란 단어는 괴물 같은 외래어 같아서 거부감이 든다. 한글로 풀어도 겨우 상속과 구성이라는 머리 아픈 단어로만 해석이 된다. 그래서 이 단어들은 이상한 나라 엘리스의 괴물과 같다. 무엇보다 이상한 나라 엘리스의 세계관을 이해하는데 한참 걸린다.

 

더 나아가 이상한 나라의 엘리스의 괴물도 이겨내고 그 난해한 세계관을 이겨내어 숨겨진 보물 찾기(유연성과 확장성등)가 여간 힘든일이 아니다. 그러나 여기 '객체지향 보물지도'가 있다. 마치 구겨지고 누런 종이 쪼가리 속의 보물지도처럼 예쁘진 않지만 객체지향 세계를 이해하기 위한 중요한 단서들이 담겨 있는 지도이다.

 

 

위 그림을 머릿속에 저절로 그리는데 한참 걸렸던 것 같다. 이 그림이 저절로 그려질때가 되어서야 비로소 객체지향의 장점을 알고 쓰기 시작했다. 그 전에는 구구단 외우듯이 객체지향 특징을 공부했기 때문에 큰 그림을 그릴 수 없었다. 아마도 딱딱한 책 때문이었을 것이라는 핑계를 댄다.

 

우리가 객체지향을 공부하는 이유는 객체지향 시험을 잘보기 위해서가 아니다. 객체지향을 통해 좀더 나은 프로그램을 짜는 것이 목적일 것이다. 그렇다면 객체, 클래스, 상속의 사전적인 뜻만 외우지 말고 객체지향의 요소가 어떻게 뭉치고 상호작용하는지 '그림으로 그려야' 한다.

 

 

이 그림은 앞으로 자주 나온다. 앞으로 나올 UML그림의 90%를 차지한다. 그림을 잘 설명하기 위해 몇가지 용어를 통일하여 쓸것이다. 통일된 용어를 확실히 이해해야 책읽기에 무리가 없다.

 

객체 그룹, 객체 그룹은 부모 객체의 특징을 이어받은 객체 구성원들의 그룹이다. 최상위에 부모 클래스 또는 인터페이스가 있고, 부모 클래스의 특징을 상속받은 자식 클래스들이 존재한다.

 

부모 인터페이스/클래스, 부모 클래스는 말 그대로 어느 객체 그룹의 최상위 클래스이다. 클라이언트 클래스는 부모 인터페이스/클래스에만 의존하는 것이 기본적인 객체지향 설계 요령이다.

 

자식 클래스, 자식 클래스는 말 그대로 부모 클래스로부터 특징을 상속받은 클래스이다. 부모 클래스의 기능을 그대로 물려받을 수 있고 자기 고유의 특징에 맞게 로직을 고칠 수(=오버라이딩) 있다.

 

실행 클래스, 실행 클래스는 객체를 어떻게 생성하고 실행할 것인지를 결정하는 클래스이다. 자동차의 운전석이고 비행기의 조종석과 같다. 프로그래밍을 조금이라도 아는 개발자라면 main() 메소드가 있는 곳을 생각하면 아하~ 하며 이해할 것이다. 실행 클래스에서 객체를 어떻게 다룰 것인지 정한다.

 

클라이언트 클래스, 클라이언트 클래스는 어느 객체의 그룹군을 사용 하는 클래스를 말한다. 예를 들어 자동차 클래스가 네비게이션 객체가 필요하다면 네비게이션 객체그룹을 알고 의존하기 때문에 자동차 클래스가 네비게이션 객체 그룹의 클라이언트가 되는 것이다. 네비게이션 객체라고 하지 않고, 객체그룹이라고 한 이유는 제대로된 객체지향 설계라면 네비게이션 부모 객체는 인터페이스나 간단한 클래스로 설계되었을 것이고, 자식 클래스에서 여러 특화된 네비게이션을 구현하여 이 객체들이 그룹화 되었기 때문이다.

 

구성 클래스, 클라이언트 클래스 입장에서 자신이 구현할 기능을 다른 클래스에게 위임했을 때 위임받아 일을 대신 해주는 클래스를 구성 클래스라고 한다. 저 그림에서 구성 클래스가 무엇인지 한번 생각해보자.

 

의존, 한 클래스가 다른 클래스를 알고 있다. 한 클래스가 다른 클래스의 객체를 알고 있어 그 객체에 대해 알고 있어야 한다는 뜻으로 필요 이상 많은 클래스에 의존하면 프로그램 유지보수가 어려워 진다.

 

 

이 용어를 확실히 이해할때까지 음미한다. 이제 객체지향 보물지도를 해석한다.

보물 단서1. 인터페이스, 인터페이스는 해당 객체 그룹 특징의 뼈대를 선언한다. 보통 객체 그룹의 최상위에서 정의 한다. 객체를 설계하고 구현할때는 객체의 내부 로직에 신경쓰기 보다는 객체가 어떤 기능들을 수행하는 것이 좋을지의 관점에서 생각하고 설계하여 인터페이스를 만드는 것이 더 중요하는 것을 알게 된다.

 

보물 단서2. 오버라이딩, 부모 인터페이스에서 정의한 기능을 상속 클래스마다 다르게 구현한다. 상속 클래스 마다 고유 장점과 특화된 기능이 있을 것이다. 오버라이딩은 상속 클래스의 같은 메소드에 다른 로직을 작성할 수 있다..

 

보물 단서3. 캡슐화와 정보은닉, 각 클래스들의 중요 속성은 '높은 응집도와 낮은 결합도'를 위해서 안전하게 보호되어야 한다. 객체의 속성은 박물관의 문화 유산처럼 소중하고 안전하게 보호해야 한다. 객체의 속성은 메소드를 통해서만 접근해야 한다. 다른 개념으로 클라이언트 객체에게 같은 객체 그룹의 여러 객체를 잘 넘겨주고 교체할수 있을 때 객체를 캡슐화 했다고 표현하기도 한다.

 

보물 단서4. 상속과 폴리모피즘, 이 영역에 속한 클래스 다이어그램은 전형적인 상속 구성도를 나타낸다. 상속 클래스1,2,3 은 인터페이스에서 명시한 기능을 각각 다르게 구현했다. 이 클래스들은 부모 인터페이스만 의존하고 있는 '클라이언트' 클래스에 동적으로 자유롭게 교체하면서 넘겨주게 될 것이다.

 

보물 단서5. 상속 대신 구성, 클라이언트 클래스는 상속을 쓰지 않고 다른 4.영역 안에 있는 '객체 그룹'에 의존하여 로직을 처리한다. 이렇게 하면 프로그램 실행중에 실행 클래스에 의해 얼마든지 '상속 클래스'를 교체한다. 자유로운 교체와 확장이 가능하기 때문에 유연성이 높고 확장성이 높다.

 

이 다섯가지 요소가 객체지향 프로그램을 더욱 이롭게 만드는 기본적인 장점들이다. 이 장점들이 모이고 잘 조합하면 전형적인 '객체지향 보물지도' 같은 패턴을 이루게 된다. 조만간 이 패턴은 곧 '스트라테지 패턴(Strategy Pattern)'으로도 불릴것이다.

 

객체지향의 핵심 개념을 이해하고 그 장점을 이해하기위해 이 그림을 머릿속에 그려놓고 시작하면 객체지향 보물을 발견하기 편할것이었다.

 

 

덧 ) 이 객체지향의 탄생 원고는 제가 책으로 내려다가 일단 잘 안되었는데요. 이유는 비문이 많다. 단락내 주제가 중복된다. 어떤 상황 설명을 과장한다.등 입니다. 그래도 원고를 일단 블로그에 몽땅 풀어보고 언젠가 제대로 교정해서 다시 도전할 생각입니다. 비문이 많다. 단락내 주제가 중복된다. 어떤 상황 설명을 과장한다. 이점을 감안해서 읽고 객체지향을 이해하는데 도움이 되셨으면 좋겠습니다. 의견도 주셨으면 좋겠습니다. 원고 조금만 교정하면 괜찮을것 같은 출판사 관계자분의 피드백도 환영합니다. 특별한 일 없으면 매주 월수 발행 예정입니다.