iamkanguk.dev

[도서] 객체지향의 사실과 오해 - 01) 협력하는 객체들의 공동체 본문

카테고리 없음

[도서] 객체지향의 사실과 오해 - 01) 협력하는 객체들의 공동체

iamkanguk 2025. 3. 2. 03:32

안녕하세요. 최근에 객체지향에 관심을 가지게 된 이강욱이라고 합니다.

조영호님의 객체지향의 사실과 오해라는 책을 읽어보려고 합니다.

 

책의 서두에서는 객체지향을 처음 접해보는 사람들은 아래와 같은 설명을 보게 된다고 합니다.

1. "객체지향이란, 실세계를 직접적이고 직관적으로 모델링할 수 있는 패러다임"
2. "객체지향이란 현실 속에 존재하는 사물을 최대한 유사하게 모방해서 소프트웨어 내부로 옮겨오는 작업이기 때문에 그 결과물인 객체지향 소프트웨어는 실세계의 투영이다"
3. "객체"란 현실 세계에 존재하는 사물에 대한 추상화

 

하지만, 객체지향의 목표는 실세계를 모방하는 것이 아닌, 새로운 세계를 창조하는 것이라고 합니다.

그럼에도 불구하고 많은 사람들은 객체지향을 실세계를 모방하려고 하는 것일까?

책에서는 객체지향의 다양한 측면을 이해하고 학습하는데 매우 효과적이기 때문이라고 이야기합니다.

 

최근에는 객체지향적인 사고를 하려고 도전해보고, 소스 코드도 객체지향적으로 작성을 해보려고 노력하고 있습니다.

그래도 잘 이해가 되지 않고 있었다. 그런데 지금 곰곰히 생각해보면 실세계와 연결시켜서 객체지향을 이해할 수 있을 것 같다고 생각이 들었습니다.

 

지금부터는 커피 주문 프로세스를 가지고 객체지향 프로그래밍에 대한 개념을 이해해보려고 합니다.

 

협력하는 사람들

1. 손님은 캐셔에게 커피를 주문한다.
2. 캐셔는 손님의 주문을 받고 바리스타에게 주문 내역을 제공한다.
3. 바리스타는 전달받은 주문내역을 가지고 커피를 제조하고 캐셔에게 넘긴다.
4. 캐셔는 완성된 커피를 손님에게 제공한다.

 

위 Flow는 간단한 커피 주문 시나리오입니다. 해당 시나리오에서 손님, 캐셔, 바리스타는 각각의 객체입니다.

즉, 객체를 사람(생명체)에 비유한 것이라고 생각하면 됩니다.

 

또한, 커피라는 요소를 만들고 특정 인물에게 제공되는데 까지 손님, 캐셔, 바리스타가 협력(collaboration)을 하고 있습니다.

협력을 통해 거대하고 복잡한 문제를 해결할 수 있는 공동체를 형성할 수 있게 만드는 것입니다.

 

[역할과 책임]

손님, 캐셔, 바리스타 각 객체(인물)들은 그들 각각의 역할을 부여받습니다.

역할이란 협력 과정에서 각각의 객체들이 맡아서 해야하는 책임 또는 의무를 의미합니다.

마치, 경찰관은 범죄자를 검거할 책임이 있는 것처럼..

 

손님커피를 주문할 책임(?), 캐셔주문 내역을 바리스타에게 넘겨야 할 책임과 손님에게 완성된 커피를 제공해야 할 책임, 바리스타는 커피를 제조할 책임이 있는 것입니다.

 

대학교에서 팀 프로젝트를 하는 것처럼, 사람들이 특정 프로젝트를 마감하기 위해 협력을 하고, 협력을 위해 역할을 맡고, 그에 따른 책임을 수행하는 것입니다.

 

사람들이 협력을 위해 특정한 역할을 맡고 역할에 적합한 책임을 수행한다는 사실은 몇 가지 중요한 개념이 있다고 합니다.

1. 여러 사람이 동일한 역할을 수행할 수 있다
2. 역할은 대체가능성을 의미한다
3. 책임을 수행하는 방법은 자율적으로 선택할 수 있다.
4. 한 사람이 동시에 여러 역할을 수행할 수 있다.

 

역할, 책임, 협력

커피 주문 프로세스에서는 다음과 같이 개념들을 정리할 수 있습니다.

 

- 손님/캐셔/바리스타(사람): 객체

- 각 객체의 요청: 메세지

- 각 객체가 전달받은 요청을 처리하는 방법: 메서드

 

하나의 프로그램에서 객체들은 어떠한 기능(목적)을 구현(달성)하기 위해서 그들의 책임을 성실히 수행하고, 다른 객체들과도 협력합니다.

 

<객체의 역할>

- 여러 객체가 동일한 역할을 수행할 수 있다.
- 역할은 대체가능성을 의미한다.
- 각 객체는 책임을 수행하는 방법을 자율적으로 선택할 수 있다.
- 하나의 객체가 동시에 여러 역할을 수행할 수 있다.

 

협력 속에 사는 객체

객체지향의 윤곽을 결정하는 것은 역할, 책임, 협력입니다.

그렇지만 위 3개 개념에 참여하는 주체는 객체입니다.

우리 사회에 인간이 빠지면 무슨 의미가 있겠는가? 라는 의미입니다.

 

협력이라는 객체의 특징을 기준으로, 객체는 2가지 덕목을 갖춰야 한다.

1. 객체는 충분히 협력적이어야 한다.
   -> 도움이 필요하면 요청하고, 도움 요청에 응답하는 열린 마음을 가져야 한다.
2. 객체는 충분히 자율적이어야 한다.
   -> 책임을 수행하는 방법은 책임을 지키는 선에서 자율적으로 선택한다.

 

계속 똑같은 말만 하는 것 같습니다만, 하나의 프로젝트를 완수한다는 목표를 위해 모든 팀원들이 협력하지만,

그 안에서 어떻게 협력할 지는 책임만 다한다면 방법은 자율적으로 선택한다.

 

[상태와 행동을 함께 지닌 자율적인 객체]

흔히 객체행동(Behavior)과 상태(State)를 함께 지닌 실체라고 정의하고 있습니다.

즉, 객체가 협력에 참여하기 위해 어떤 행동을 해야한다면 그 행동을 하는데 필요한 상태도 함께 가지고 있어야 한다는 것입니다.

(커피를 제작하는 바리스타는 커피를 제작하는 행동을 하기 위해 당연히 커피 제조법을 알고 있는 상태여야 하는겁니다)

 

객체가 협력에 참여하는 과정에서 자율적인 존재가 되기 위해서는 행동과 그에 따른 상태를 한 세트로 같이 지니고 있어야 한다.

객체가 자율적인 존재로 되기 위해서는 독립적인 상태를 스스로 관리함과 동시에 행동을 협력에 제공해야 한다.

 

[협력과 메세지]

현실 세계와 객체지향 프로그래밍 모두 협력이라는 걸 하기 위해서는 서로간의 의사소통이 필요합니다.

여러 의사소통 수단이 있는 현실과는 달리 객체지향 프로그래밍에서는 단 한가지의 수단밖에 없습니다.

 

해당 수단을 메세지(Message) 라고 말하고, 메세지를 송신하는 쪽을 송신자(Sender), 메세지를 수신하는 쪽을 수신자(Receiver) 라고 부릅니다.

 

[메서드와 자율성]

A객체가 B객체로 협력을 위해서 메세지를 보냈습니다.

B객체는 메세지를 수신하면 수신한 메세지에 대해 동작을 해야한다. 이를 메서드라고 합니다.

 

즉, 외부 요청을 표현하는 메세지와 요청을 처리하기 위한 구체적인 방법인 메서드를 분리하는 것은 객체의 자율성을 높이는 핵심 메커니즘이고, 이것은 캡슐화랑 관련이 있습니다.

 

객체지향의 본질

1. 객체지향이란 시스템을 상호작용하는 자율적인 객체들의 공동체로 바라보고 객체를 이용해서 시스템을 분할하는 방법이다.
2. 자율적인 객체란 상태와 행위를 함께 지니며 스스로 자기 자신을 책임지는 객체를 의미한다.
3. 객체는 시스템의 행위를 구현하기 위해 다른 객체와 협력한다. 각 객체는 협력 내에서 정해진 역할을 수행하며 역할은 관련된 책임의 집합이다.
4. 객체는 다른 객체와 협력하기 위해 메세지를 전송하고, 메세지를 수신한 객체는 메세지를 처리하는데 적합한 메서드를 자율적으로 선택한다.

 

[객체를 지향해라]

필자는 평소에도, 글을 쓰는 지금도 원래는 객체지향라고 한다면 Java와 클래스만 생각했습니다.

하지만 객체지향은 단어 그대로 객체를 지향하는 것이지, 클래스를 지향하는 것이 아닙니다.

클래스의 구조와 메서드에 집중하는 것이 아니라, 객체의 역할/책임/협력에 집중해야 합니다.

 

훌륭한 객체지향 설계자가 되기 위해서는 코드를 담는 클래스가 아니라 메세지를 주고 받는 객체의 관점으로 사고를 전환해야 한다고 합니다.

 

후기

코드가 아닌 개념(이론)적인 내용만 기재가 되어있길래 생각보다 처음 이해하는데는 어려웠습니다.

하지만, 객체지향이 무엇인지에 대해서 조금은 알게 된 것 같아서 좋았습니다.

그리고 객체의 책임, 메세지, 협력 이라는 키워드에 대해서도 알게 되었습니다.

 

1장을 읽고는 객체지향에 대해 아주 큰 틀을 어느정도는 이해를 할 수 있던 것 같습니다.

이후 2장부터 쭉쭉 읽으면서 아 이런게 객체지향이고 실제로 프로그램을 작성해보고 싶다는 느낌을 받아보고 싶습니다.