"객체지향의 사실과 오해" 를 읽고
역할, 책임, 협력
객체지향의 사실과 오해를 다 읽었다. OOP를 하는 개발자들에게 필수 도서라 하여, 다른 공부할 것들을 제쳐두고 이것만 먼저 읽었다.
사실 이 책은 펼쳐놓고 코드를 타이핑하고 응용하는 책은 아니다. 이 책에서 실제 코드는 단 한 파트에서만 나온다. 대부분은 줄글과 이해를 돕기 위한 삽화로 구성되어 있다.
페이지 수는 260p 밖에 안되는 책이었다. 하지만 이 책을 완독하는데 순수 시간으로 약 20시간 정도가 든 것 같다. 단순히 글을 줄줄 읽기만 했다면 빠르면 1시간에도 충분했을 건데, 이 책이 설명하는 단어와 문장과 은유를 이해하려고 몇번이고 곱씹어보고, OKKY에 질문도 하느라 많은 시간이 들었다. 완독한 다음날인 오늘, 간략하게나마 회고를 해 본다.
일단, 어려웠다.
이 책은 은근 높은 독해력을 요구한다. 객체지향 설계에 있어서 중급자 이상의 지식이 있다면 높은 독해력이 없더라도 줄줄 읽기만 해도 이해하기는 쉬울 것이다. 하지만 객체지향을 파고드는 초급자의 입장에서, 이 책의 문장 하나하나는 솔직히 많이 어렵다. 아래 내용을 보자. 책의 아무 곳이나 펴서 한 문단만 긁어 와봤다.
상태와 행위의 캡슐화
객체는 상태와 행위의 조합이다. 객체는 스스로 자신의 상태를 관리하며 상태를 변경하고 외부에 응답할 수 있는 행동을 내부에 함께 보관한다.객체는 상태와 행동을 하나의 단위로 묶는 자율적인 실체다.이 관점에서의 캡슐화를 데이터 캡슐화(data encapsulation)라고 한다. 객체는 상태와 행위를 한데 묶은 후 외부에서 반드시 접근해야만 하는 행위만 골라 공용 인터페이스를 통해 노출한다. 따라서 데이터 캡슐화는 인터페이스와 구현을 분리하기 위한 전제 조건이다.
객체가 자율적이기 위해서는 자기 자신의 상태를 스스로 관리할 수 있어야 하기 때문에 데이터 캡슐화는 자율적인 객체들 만들기 위한 전제 조건이기도 하다.
프로그래밍 관점에서 상태는 주로 데이터로 구현되고 행동은 프로세스로 구현된다. 과거의 전통적인 개발 방법은 데이터와 프로세스를 엄격하게 구분하지만 객체지향에서는 데이터와 프로세스를 객체라는 하나의 틀 안으로 함께 묶어 놓음으로써 객체의 자율성 을 보장한다. 이것이 전통적인 개발 방법과 객체지향을 구분 짓는 가장 중요한 차이다.
객체지향의 사실과 오해, 170-171p
'객체', '상태', '행위', '캡슐화', '인터페이스', '구현'...
한 문단 안에만 여러 용어들이 들어간다(인터페이스, 구현은 Java 언어 관점에서의 인터페이스나 implements도 아니다).
물론 앞의 부분에서 이것들을 설명해준다. 하지만 객체지향에 익숙하지 않은 사람이라면 이해하긴 분명히 난해하다. 객체지향에 아무 지식도 없는 사람이 읽는다면 이 책을 완벽히 이해하기란 무리라고 생각된다.
그러나, 객체지향의 기초 지식이 있는 자가 책의 어려움에도 불구하고 내용을 꼭꼭 씹어 삼키면, 객체지향의 형체가 보인다.
객체지향의 형체가 아른거린다
이 책의 설명은 OOP를 처음 배우는 사람이 흔히들 접하는 개념 (- 클래스:설계도:객체 등의 비유)과는 다르다. 현실 세계의 모방이라는 일반적으로 알려진(입문자 수준의) 객체지향 설계의 관점과도 다르다.
- 현실 세계의 모방이라는 비유는 학습하기엔 적절하지만, 실무적인 관점에서는 적합하지 않다고 한다. 객체지향의 세계는 현실 세계를 조금 참조할 뿐 궁극적인 목적은 현실과 전혀 다른 새로운 세계를 창조하는 것이다.
- 클래스 중심의 설계가 아닌 '객체 중심'의 설계를 말한다. 클래스는 단지 객체를 표현하고 생성하기 위해 언어가 제공하는 구현 매커니즘일 뿐이다. (이 개념이 매우 충격적이었다.)
- 객체를 협력이라는 문맥에서 떼놓은 채 어떤 데이터가 필요하고 어떤 클래스로 구현해야 하는지를 고민하지 말라고 한다.(객체는 고립된 섬이 아니다.)
- 중요한 것은 객체가 수행할 책임과 행동이다. 그 이후에 필요한 데이터를 고민하고, 그 이후에 클래스의 구현 방법을 결정하라. 즉, 무엇을 해야 하고 주고 받을 것인가? (클래스를 작성하는 것이 먼저가 아니다.)
- 요구사항을 달성하기 위한 협력에 필요한 책임을 결정하고, 합리적으로 객체에 책임을 할당하고, 필요한 데이터를 고민하고, 구현하라!(방법론적으로 핵심이다.)
문장을 하나하나 꼼꼼히 살피고, 이해하려 애쓰고, 질문하는 과정을 긴 시간을 들여 반복하니 책 후반부 즈음엔 객체지향의 실체가 어렴풋이 보이기 시작했다. 이토록 심오하고 깊은 내용을 가진 개념이었다니! 귀찮다고 그냥 생각 없이 문자로서만 받아들이고 읽었다면 얻을 수 없는 값진 결과였다.
객체를 사용하고 역할을 나눠서 분담하기만 하면 객체지향 설계인줄 알았던 이전을 생각하면, 부끄럽기도 하고 대견하다는 생각도 든다.
객체지향은 아름다운 창조의 방법이다
객체지향에 대해 내가 내린 결론이다. (이전에도 이런 생각을 어렴풋이 가지고 있었지만, 이 책 이후로 더 확실해졌다.) 객체지향은 새로운 세계를 창조하는 능력을 우리에게 부여한다. 객체지향 설계(또는 객체 지향 프로그래밍)은 단순히 정해진 원칙과 설계에 따른 프로그래밍 방법이 아니다. 우리는 객체지향을 통해 자율성을 가지고 살아가는 생명체들(객체)를 창조하고, 유기적으로 움직이게 할 수 있으며, 얼마든지 더 새롭고 확장된 생명체들로 대체할 수 있다. 이 생명체들은 우리가 설정한 상태(state)와 역할(role)을 협력하여 행위(method)로 구현(implement)한다. 이들이 협력해서 내가 원하는 목표를 이루는 과정은 예술적이기까지 하다. 이것은 아무것도 그려져 있지 않고 형태도 없는 퍼즐을 한 피스 씩 창조하는 과정같다는 생각도 들었다.
마무리
나는 영상제작을 할 줄 안다.(전문가 수준은 아니다. 그러나 여러 사람에게 보일 기회가 많이 생긴다.) 간혹 영상 제작 요청을 받을 땐, 주어진 기획과 콘티에 따라 소스들을 단순히 배치하기만 하면 되는 영상도 있고, 기획 및 촬영, 편집과 제작까지 내가 온전히 할 때도 있다. 제작의 난이도는 후자가 당연히 더 어렵지만, 최종 완성된 영상 안에서 출연자들이 나의 기획대로 행동하고 움직여서 종래에 전달하고자 하는 메시지를 대중들에게 성공적으로 전달했을 때, 그 쾌감은 전자보다 훨씬 크다.
전자의 경우는 나의 세계가 아니다. 내가 설계하지 않은 세계를 구현하는 것은 그저 작업에 불과하다. 하지만 내가 설계한 세계를 구현하는 것은 힘듬에도 분명하고 더 큰 만족감과 완성도를 가져다 준다.
객체지향 설계도 이와 같지 않을까. 객체지향 설계의 원칙을 잘 지키는 것은 분명히 더 어렵고 수고스런 일이지만, *그렇지 않은 세계보다 더 큰 아름다움을 가진다. *
이 책을 읽은 후, 객체지향 설계를 하고 공부하는 것은 단순히 공학적 설계나 키보드 타이핑이 아닌, 하나의 세계를 창조하는 작업으로 자리잡았다. 이 행위에 마치 영상 제작처럼, 더 아름답고 유기적인 세계를 창조하는 기쁨과 결과물에 대한 기대 가 동반되는 건 당연한 수순이 아닐까.