# 읽은 목차
- 01 협력하는 객체들의 공동체
- 02 이상한 나라의 객체
# 시작하며
객체지향에 흥미를 가지게 되면서, 객체지향을 꽤 공부해봤지만 정작 내가 배웠던 원리 원칙들이 실제 개발에서는 전혀 보이지 않았다. 내가 객체지향을 잘 못 이해하고 있는 것일까? 아니면 개발단계에서 적용되는 객체지향적인 사고는 어떤 것일까 궁금해서 읽기 시작했다. 실제세계의 객체와 소프트웨어 세계에서의 객체의 개념은 사뭇 달라보인다. "02 이상한 나라의 객체"챕터까지 읽은 지금 내용들을 잊지 않기 위해서 조금 정리해보려고 한다.
# 01 협력하는 객체들의 공동체
객체지향의 목표는 실세계를 모방하는 것이 아니다. 오히려 새로운 세계를 창조하는 것이다.
시작하며에서 적었던거와 같이, 책에서는 실제 애플리케이션 개발단계에서 객체에 직접적으로 대응하는 실세계의 사물을 발견할 확률은 높지 않다고 했다. 그렇기 때문에 실세계를 모방 할 수 없다. 똑같은 형태의 객체가 존재할 확률은 극히 드물기 때문이다. 그런데 왜 자꾸 객체를 현실세계와 연관을 지으려고 하는 것일까?
나는 객체지향의 세계와 실세계의 흐름이 비슷하기 때문이라고 생각한다. 책에서는 "커피 공화국의 아침"이라는 예시를 들어서 설명했다. 현실세계에서는 손님, 캐시어, 바리스타가 서로 협력하여 최종적으로 손님이 커피를 받게 될 것이다. 이 흐름에는 두가지가 존재한다. 요청(Request)과 응답(Response)이다
요청의 흐름
- 손님이 캐시어에거 커피를 주문한다
- 캐시어는 메뉴를 바리스타에게 전달 한다.
- 바리스타는 커피를 제조한다.
응답의 흐름
- 바리스타가 완성한 커피를 캐시어에게 건넨(알린)다.
- 캐시어는 건네(알림)받은 커피를 손님에게 전달한다.
- 손님은 커피를 받는다.
이러한 요청과 응답의 흐름에는 협력(collaboration)이 숨어있다. 실세계에서 인간은 이러한 협력을 통해서 어려운 일을 수행한다.
## 현실세계 - 역할과 책임, 협력
커피의 주문 과정속에서 손님, 캐시어, 바리스타라는 역할이 존재함을 알 수 있다. 조금 더 자세히 들여다 보면, 이 역할에는 마땅히 해야할 책임이 있다. 어쩌면 두루뭉실해보이는 말 일 수 있지만 의외로 간단하다. 캐시어라는 역할에는 주문을 받고, 바리스타에게 커피를 제조하라고 말하며 손님에게 완성된 커피를 건넬 책임이 있다. 이렇듯 역할을 책임을 내포하며 암시하게 된다. 이러한 역할과 책임, 협력의 핵심 요지를 뽑아 보자.
- 여러 사람이 동일한 역할을 수행 할 수 있다.
- 역할은 대체 가능성을 의미한다.
- 책임을 수행하는 방법은 자율적으로 선택할 수 있다.
- 한 사람이 동시에 여러 역할을 수행 할 수 있다.
## 객체세계 - 역할과 책임, 협력
현실세계의 커피를 주문하는 과정에서 살펴 봤던 것들에서 객체세계에 적용되는 모든 원칙이 같게 적용 된다. 객체들은 서로 역할과 책임을 하며 어플리케이션 내부에서 요청-응답의 과정을 수없이 하며 사용되고 있을 것이다. 그렇기 떄문에 객체는 충분히 '협력적'이어야 하며 '자율적'이어야 한다.
또한 객체는 다른 객체가 무엇을 수행하는지 알 수 있지만 어떻게 수행하는지에 대해서는 알 수 없다. 클린소프트웨어에서 공부했던거와 같이, 이런 느슨한 관계를 만듦으로써 개방폐쇄원칙(OCP)를 달성 할 수 있었다. 그 중심에는 다형성이 있었다.
객체는 메서드를 통해서 행동을 수행한다.
## 핵심
이번 장에서 가장 와 닿는 말은 아래와 같다.
중요한 것은 어떤 클래스가 필요한가가 아니라 어떤 객체들이 어떤 메시지를 주고받으며 협력하는거다. 객체지향의 핵심은 클래스가 아닌 적절한 책임을 수행하는 역할 간의 유연하고 견고한 협력 관계를 구축 하는 것이다.
나는 정말로 지금 껏 어떤 객체가 필요할까에 대해서만 생각했던거 같다. 이제는 어떤 역할이 필요하고 어떤 책임이 책임들이 협력해야하는지에 대한 관점에서 보는 시각을 길러여 할 것 같다.
# 02 이상한 나라의 객체
챕터제목이 이상해보이는데, 예시를 이상한나라의 엘리스가 커졌다 작아졌다 하는 것을 객체세계로 옮겨 비교해석했기 때문에 그렇다. 객체가 이상하다는 것과는 관계가 없다.
## 객체
객체에는 상태와 행동 그리고 식별자가 존재 한다. 앨리스가 물병을 쥐고 있는 모습을 생각해보자. 그리고 표현하려 해보자. 앨리스와 음료의 객체는 서로 연결된 상태이다. 앨리스는 음료에 관해 알고 있는 상태이며, 난 앨리스는 음료에 의존하고 있는 상태라고 생각했다. 음료를 쥐고 있는 것을 놓는다면 이러한 의존관계는 끊긴 것이다.
객체의 행동을 유발하는 것은 외부로부터 전달된 메시지지만 객체의 상태를 변경할지 여부는 객체 스스로 결정한다.
여기서 가장 인상깊었던 것은 객체는 실세계와 다르게 "스스로 상태를 변경한다"였다. 한번도 이러한 생각을 해본 적이 없었다. 어떠한 행동에는 부수효과가 따르기 마련이다. "앨리스가 물병의 물을 마셨다면"이라는 가정을 생각해보자. 난 단번에 앨리스가 물의 양을 줄였어라고 생각했다. 그러나 객체 세계에서 물병의 물의 양을 줄인 것은 "물병"그 자체였다. 즉, 객체는 행동의 결과로 자신의 상태를 변경시키거나, 다른 객체에게 메시지를 전달한다. 자신의 상태를 변경 할 수 있는 것은 자신 뿐이다. 우리가 setter()를 정의하고 해당 setter()를 호출 하게 하여 자신의 상태를 직접 변경 시키는거와 같은 맥락이다.
## 의인화
즉, 자신의 상태를 자신이 직접 변경시키는 것이 실세계와 소프트웨어의세계의 가장 큰 차이점이다. 수동적인 존재가 능동적인 존재가 된다. 캐시어가 현금저금통의 돈을 빼는 모습은 객체 세계에서는 현금저금통이 스스로 돈을 빼버리는 것이다. 실세계에서는 말료 표현 할 수 없는 상황 일 것이다.
결국 우린 객체세계에서 이러한 자연스러운 표현을 위해서는 의인화를 하여 생명을 넣어줘야 한다는 것이다. 그렇기 때문에 서두에서 이야기 했던거와 같이, 새로운 세계를 창조한다는 것이다.
# 마치며
책에서 인상깊었던 내용을 몇가지 뽑고 나만의 해석을 통해서 정리해봤다. 객체를 다른 시각으로 바라봐야하는 이유를 알았다. 내가 이 책을 궁극적으로 얻고 싶은 것은 정말로 내가 창조주가 되서 객체들을 설계하는 방법이다. 프로젝트를 하면서 책에 나왔던 대로 객체를 만들고 아무생각없이 프로퍼티를 짜 넣고 그랬다. 어디에 어떤 역할과 책임을 부여해야하는지, 객체세계의 창조주의 시각으로써 알아가고 싶다.
# 궁금 한 것
단일책임원칙(SRP)에 따르면 한 클래스에서는 하나의 책임을 맡도록 하라고 했으나, 객체는 여러 역할을 동시에 맡을 수 있다고 한다. 객체의 특성이지 개발의 방법론을 다르는 구절이 아니기 때문에 적혀있는 것일까?