1장 협력하는 객체들의 공동체 [객체지향의 사실과 오해]

지니🧸·7일 전
0

CS 저장소

목록 보기
47/48

이 문서는 <객체지향의 사실과 오해 (조영호 지음)>을 읽으며 작성한 개인 노트입니다.

객체지향 프로그래밍은 현실 속의 사물을 최대한 모방해서 소프트웨어로 가져오는 작업을 의미한다. 즉, 객체는 현실 세계의 사물을 추상화한 것이고, 객체지향 소프트웨어는 실세계를 투영한다.

이는 실제 소프트웨어 개발과 객체지향의 목표인 신세계의 창조와는 사뭇 다른 개념이지만, 실세계와의 비유가 객체지향을 이해하기 편리하기 때문에 현재까지 꾸준히 비교되고 있다.

1. 역할, 책임, 협력

역할, 책임, 그리고 협력은 일상생활의 이벤트에 필수적인 3 요소다.

협력하는 자들 간 요청 (request)와 응답 (response)을 통해 협력이 이뤄지고, 이들은 협력을 통해 보다 크고, 복잡한 문제를 해결할 수 있다.

각 협력자에게는 역할이 존재하고, 각 협력자가 자신의 역할의 책임을 다함으로써 협력을 이룬다.

역할이 수행되는 한, 각 협력자에게는 자율성과 독립성이 보장된다.

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

협력자들을 요청자와 응답자로 나눠 생각했을 때, 요청자는 요청의 역할을, 응답자는 응답의 역할을 성실히 수행하는 한, 나머지는 자유롭다. 그게 대체든, 내부 구현이든, 이중 역할이든.

여기서 인터페이스가 떠올랐다. 각기 다른 컴포넌트간 의존을 인터페이스로 대체하면 내부 구현에 대한 의존도를 줄일 수 있다.

2. 협력의 중심, 객체

역할, 책임, 협력의 핵심은 객체다. 객체가 자신의 역할에 대한 책임을 수행하여 협력을 이룬다.

하나의 거대한 애플리케이션으로 동작하기 위해 여러 객체가 존재하고 협력한다. 애플리케이션도 결국 협력의 결과물이며, 이 협력의 핵심인 객체의 품질에 의해 애플리케이션의 질 또한 결정된다.

그렇다면 좋은 객체란 무엇일까? 이에 대해 책은 '협력적'이고 '자율적'인 성질을 강조한다.

협력적인 객체는 외부의 요청과 응답에 열려있으며, 모든 구현을 독립적으로 처리하지 않는다. 자율적인 객체는 스스로의 결정과 판단에 따라 행동한다.

객체와 DTO의 차이는 목적, 형태, 역할 등 다양하게 존재하지만, 자율성 또한 이 둘의 차이를 재밌게 풀어나갈 수 있는 주제가 될 것 같다.

3. 상태와 행동

흔히 객체를 상태와 행동을 함께 지닌 실체라고 정의한다. 객체는 상태와 행동을 하나의 단위로 묶는다.

객체의 자율성은 객체의 내부와 외부를 명확하게 구분하는 데서 시작한다. 객체의 내부는 외부에서 쉽사리 컨트롤할 수 없어야 하며, 객체가 허용한 수단을 통해서만 소통해야 한다. 객체 간 협력할 때도 서로 무엇을 하는지, 무슨 역할을 수행하는 지에 대한 정보는 알더라도, 이를 어떻게 수행하는 지 내부 구현에 대해서는 모른다.

결국 객체는 자신의 독립적인 상태와 행동을 갖는 자율적인 존재다.

상태 (데이터)와 행위 (프로세스)를 묶어서 하나의 객체를 이루는 점이 이 둘을 분리하던 전통적인 프로그래밍 방식과의 가장 큰 차이기도 하다.

4. 협력을 실현하는 메서드와 메시지

협력자는 요청, 즉 메시지를 보내는지, 받는지 여부에 따라 송신자와 수신자로 구분된다. 수신자는 메시지를 받아 처리하는 메서드를 가지는데, 송신자는 메시지만 잘 보낸다면 이를 처리하는 수신자의 메서드 내부에 대해서는 알 필요가 없다. 이 메서드의 자율성을 통해 객체의 자율성을 다시 한 번 강조한다.

5. 객체지향과 클래스

객체지향을 이야기하는 데 클래스가 한 번도 언급되지 않아 의외라는 생각을 하던 중에, 클래스와 객체지향의 오해가 언급되었다.

흔히들 객체와 클래스를 동의어라 생각한다. 하지만 프로토타입 기반 객체지향 언어인 자바스크립트 등에서는 클래스라는 개념 조차 존재하지 않는다.

단순히 객체를 클래스로 옮겨 담는 것에 집중하기보다는 역할, 책임, 협력의 세 가지 요소를 코드로 어떻게 효과적으로 표현할지 고민해야 한다.


profile
우당탕탕

0개의 댓글