우연한 기회로 읽게 된 '객체지향의 사실과 오해'.
가벼운 마음으로 읽다 보니 책이 생각보다 재밌고 내용이 좋아서, 읽으며 느낀 점들을 다시 한번 처음부터 되짚어 보려 한다.
들어가며
먼저 이 책을 본격적으로 읽기 전에, 내 스스로 내가 생각하는 '객체지향'이 뭔가? 에 대해서 생각해보는 시간을 가졌다. 자바의 정석을 그렇게 봤음에도 저 질문을 떠올리자마자 어버버하며 명쾌하게 한 문장으로 정리할 수가 없었다. (부끄러웠다)
그래서 종이를 한 장 꺼내 끄적끄적 수기로 정리해봤다.
최대한 머릿 속에 흩어져있는 개념들을 간결하게 정리한다고 노력했다.책을 다 읽고난 후, 내가 정리해 본 이 개념이 어떻게 수정(혹은 삭제될지도 ..ㅋㅋ)될 지 궁금하다. 이제 본격적으로 읽어보자!
[1장 : 협력하는 객체들의 공동체]
1장을 읽으면서 처음 부트캠프에서 Java의 객체지향을 배웠을 때가 생각났다. 그 때 대부분의 서적이나 자료에서 객체지향이란 현실 속에 존재하는 사물을 최대한 유사하게 모방해서 소프트웨어 내부로 옮겨오는 작업이라고 배웠었던 기억이 있다. ('모방'에 핀트)
하지만 이 책의 저자는 이 말을 객체지향을 올곧게 설명하는 데엔 적절하지 않다고 본다. 실세계의 '모방'이라는 개념은 객체지향의 철학적인 개념을 설명하는 데엔 적합하지만, 유연하고 실용적인 관점에서 (즉, 실무적인 관점) 객체지향을 설명하는 데엔 적합하지 않다는 것이다.
저자는 객체지향의 목표는 실세계를 모방하는 것이 아니라고 한다.
객체지향의 목표는 실세계를 모방하는 것이 아니다.
오히려 새로운 세계를 창조하는 것이다.
이말인 즉 소프트웨어 개발자의 역할은 단순히 실세계를 소프트웨어 안으로 옮겨 담는 것이 아니라, 고객과 사용자를 만족시킬 수 있는 신세계를 창조하는 것이라는 거다.
하지만 모방이라는 키워드가 처음 내가 자바의 객체지향 개념을 공부하기 시작했을 때 이해에 큰 도움을 준 것은 맞다. 클래스와 객체의 개념을 실세계의 '자동차 설계도'와 '자동차'로 설명한 것과 같은 비유를 읽고 모두 아 ~ 이거구만 했던 경험이 있을 것이다.
저자 또한 이 말에 동의하며, 저자가 생각하는 객체 지향의 개념을 독자들에게 이해시키기 위해서 객체를 현실세계에 빗댄 저자만의 예시를 들었다.
이 예시는 "아침에 출근 전 카페에 들려 커피를 주문하는 손님" 으로서의 시나리오로부터 시작한다.
저자가 현실세계에 비유해서 설명한 객체지향 세계
우리가 카페에 가서 커피를 주문할 때를 생각해보면 위의 그림을 쉽게 이해할 수 있을 것이다. 저자는 '모든 음료 주문'에 대한 과정을 역할, 책임, 협력이라는 세 가지 개념으로 설명한다.
'역할, 책임, 협력' 카페 ver
- 모든 음료 주문과 완성까지의 과정에는 손님, 캐시어, 바리스타 사이의 암묵적인 협력 관계가 존재한다.
- 우리가 카페에 가서 커피를 마실 수 있는 이유는, 커피를 주문하는 손님/주문 받는 캐시어/제조하는 바리스타 라는 역할이 존재하기 때문이다.
- 손님, 캐시어, 바리스타는 커피 제조 과정에서 자신이 맡은 바 책임을 다한다.
👉 역할, 책임, 협력은 우리가 살면서 다른 사람과 접촉하는 모든 곳에 존재한다. 정비소에서도, 식당에서도, 소프트웨어 개발 프로젝트가 진행되는 회사에서도, 사람이 사는 곳이라면 어디서나 역할, 책임, 협력이 존재한다.
위의 개념을 이해했다면 이에 따라 수반되는 개념들도 이해할 수 있을 것이다.
- 여러 사람이 동일한 역할을 수행할 수 있다.
- 역할은 대체 가능성을 의미한다. (= 어떤 사람이 캐시어를 하든 손님은 상관이 없다)
- 책임을 수행하는 방법은 자율적으로 선택 할 수 있다. (바리스타가 라떼를 어느 방식으로 만들든, 라떼 주문이라는 요청에 응답만 잘 하면 된다) (= 동일한 요청에 대해 서로 다른 방식으로 응답할 수 있다.) (= 다형성)
- 한 사람이 동시에 여러 역할을 수행할 수도 있다. (한 사람이 캐시어와 바리스타를 동시에 맡을 수도 있다)
👉 역할, 책임, 협력은 곧 객체지향에서도 가장 중요한 개념 세 가지이다.
'역할, 책임, 협력' 객체지향 ver
앞서 설명한 개념에서 사람이라는 단어를 '객체'로, 에이전트의 요청을 '메시지'로, 에이전트가 요청을 처리하는 방법을 '메서드'로 바꾸면 대부분의 설명을 객체지향이라는 문맥으로 옮겨올 수 있다.
단어만 바꿔서 그대로 옮겨봐도 모두 말이 된다.
- 여러 객체가 동일한 역할을 수행할 수 있다.
- 역할은 대체 가능성을 의미한다.
- 각 객체는 책임을 수행하는 방법을 자율적으로 선택 할 수 있다.
- 하나의 객체가 동시에 여러 역할을 수행할 수 있다.
위 카페에서의 상황에 빗대서 추론해보면, 객체가 충분히 잘 설계되기 위하여 갖춰야 할 덕목들을 쉽게 유추할 수 있다.
객체가 갖춰야 할 덕목
- 객체는 충분히 협력적이어야 한다.
객체는 다른 객체의 요청에 충실히 응답하고(response), 다른 객체에게 적극적으로 도움을 요청할 정도로(request) 열린 마음을 지녀야 한다. - 객체는 충분히 자율적이어야 한다.
캐시어는 손님에게 주문을 받으면 행동을 시작하지만, 음료를 만드는 절차나 방법은 스스로 결정한다. 캐시어가 요청에 대해 스스로 판단하고 행동하는 자율적인 사람이듯이 객체도 스스로 판단하고 행동하는 자율적인 존재여야 한다.
👉 이렇듯 객체지향 설계의 묘미는 다른 객체와 조화롭게 협력할 수 있을 만큼 충분히 개방적인 동시에, 협력에 참여하는 방법을 스스로 결정할 수 있을 만큼 충분히 자율적인 객체들의 공동체를 설계하는 데 있다.
👉 즉, 유지보수가 쉽고 재사용이 용이한 시스템을 구축할 수 있냐 없냐로 귀결됨
정리
초반에 개인적으로 정리했던 '객체지향이 무엇인가'에 대한 질문을 이 책을 읽은 후 다시 정리해 봤다.
- 객체지향이란 시스템을 서로 협력하는 자율적인 객체들의 공동체로 바라보고, 객체를 이용해 시스템을 분할하는 방법이다.
- 객체는 시스템의 행위를 구현하기 위해 다른 객체와 협력한다.
- 각 객체는 협력 내에서 정해진 역할을 수행한다.
- 역할은 관련된 책임의 집합이다.
- 객체는 다른 객체와 협력하기 위해 메시지를 전송하고, 메시지를 수신한 객체는 메시지를 처리하기 위해 적합한 메서드를 자율적으로 선택한다.
마냥 저자가 하는 말이 무조건 다 옳다고 생각하는 것에 주의하며 비판적으로 읽으려고 했던 책이었는데, 읽으면서 저자의 생각이 내가 최근에 면접 준비하면서 했던 생각들과 일맥상통해서 무한신뢰가 생겼고 (?) 물 흐르듯이 끄덕끄덕 음 그렇군. 하면서 쉽게 읽은 것 같다. 2장도 빠르게 읽어봐야겠다.
References
'Review' 카테고리의 다른 글
개발자로서의 2024년 회고. 쉬지마 이굥진 닉값 했을까? (10) | 2025.02.04 |
---|---|
[내배캠 Spring 심화 트랙 1기 후기] 배움에 목마른 개발자라면! (8) | 2024.11.01 |
[항해99 취업 리부트 코스 수강 후기] 실력적으로 성장하고 싶은 개발자라면. (7) | 2024.03.10 |