본문 바로가기

생각

이상한 나라의 객체 : 객체는 思物 이다.

객체는 창조된다

창조한 객체의 특성을 상기시킬 수 있다면 현실 속의 객체의 이름을 이용해 객체를 묘사하라. 그렇지 않다면 깔끔하게 현실을 무시하고 자유롭게 여러분만의 새로운 세계를 창조하기 바란다.

처음 자바 공부를 시작했을 때, 가장 이해하기 난감했던 건 '객체' 라는 개념이었다. 국어는 대부분 한자로 이루어져있어서 한자풀이를 해보면 이해하기 쉬운 경우가 많았다. 나는 그때에도 객체를 사전에 검색해보았다. 손 객,   몸 체. 이 두 개의 한자로는 좀 이해하기 어려웠다. 중국에서는 이 객체를 뭐라고 부르는지 궁금했다. 몇 개의 중국 개발자 깃헙을 둘러보니 그들은 面向对象程序设计 으로 객체 지향 프로그래밍을 일컫고 있었다. 그러다 이런 단어가 눈에 띄었다. 思物 : 面向对象程序设计

 

思物 를 직역하면 생각(가치)으로 만들어진 무언가 라는 뜻이다. 내가 이 책을 읽으며 객체는 창조된다는 사실을 깨달았을 때, 딱 이 단어가 떠올랐다. 정말 언어는 신기하다. 통한다.

 

 

객체는 책임을 기반으로 협력한다

객체 지향 설계는 협력에 참여하기 위해 어떤 객체가 어떤 책임을 수행해야하고 어떤 객체로부터 메시지를 수신할 것인지를 결정하는 것으로부터 시작된다. 어떤 클래스가 필요하고 어떤 메서드를 포함해야하는지를 결정하는 것은 책임과 메시지에 대한 대략적인 윤곽을 잡은 후에 시작해도 늦지 않다. 

릴레이 소설 도메인을 만들 때, 루시드 차트에 메모해놨던 문장이다. 최대한 객체가 가지는 책임과 메세지를 먼저 생각하고 싶었다. 객체가 가지는 상태나 메소드를 신경쓰고 싶지 않았다. 그렇게 했던 이유는 그렇게 해야 좋은 설계가 나온다는 책의 말을 믿기로 했기 때문이다. 

 

"설계를 시작하는 초반에는 어떤 객체가 어떤 책임을 가지고 어떤 방식으로 서로 협력해야 하는지에 대한 개요를 아는 것만으로도 충분하다. 책임과 협력의 구조가 자리를 잡기 전까지는 책임을 구현하는 방법에 대한 고민은 잠시 뒤로 미루는 것이 좋다."

 

 

이번에 중계 수수료를 계산하는 작은 프로그램에서도 객체가 가지는 책임에 집중했다.

객체의 용도와 목적을 명확하게 가져가고 싶었다. 처음에는 각각의 Rent(임대), Purchase(매매) 정책 을 가지고 있는 객체였다. 리팩토링을 하다가 Brokerage 를 리턴하는 calculate 코드가 중복되길래 해당 부분을 BrokeragePolicy 인터페이스로 추상화시켰다. 추상화가  어쩔 수 없이 탑-다운이 아닌 바텀-업 방식일 수밖에 없다는 말이 이해갔다. 

 

 

메세지를 믿어라 

메시지를 이해할 수만 있다면 다양한 타입의 객체로 협력 대상을 자유롭게 교체할 수 있기 때문에 설계가 좀 더 유연해진다. 메시지를 기반으로 다양한 타입의 객체들이 동일한 협력 과정에 참여할 수 있기 때문에 다양한 상황에서 협력을 재사용할 수 있다. 재사용 가능하고 확장 가능한 객체지향 설계를 구축하기 위한 핵심적인 도구인 다형성은 개별 객체가 아니라 객체들이 주고 받는 메시지에 초점을 맞출 때 비로소 진가를 발휘하게 된다. 메시지를 중심으로 설계된 구조는 유연하고 확장 가능하며 재사용 가능하다. 

중계 수수료를 계산하라는 단 하나의 메세지에만 집중하면 추상화와 다형성이 자연스럽게 이루어지는 것 같다. 어찌됐든 변하지 않는 것은 '중계 수수료 계산' 이니까. 변하지 않는 단 하나의 메세지를 생각하고, 적절한 객체에게 책임을 할당하거나 그런 책임을 갖게할 객체를 만들어 감투를 씌워주면 되지않을까. (근데 리팩토링, 그러니까 자꾸 손을 보고 또 보고 또 다듬고 하는 과정이 없다면 이런 말도 소용없는 것 같다. 뭐든, 지속적인 사포질이 필요한 것 같다.)