Books/객체지향의 사실과 오해

객체지향의 사실과 오해 - 협력하는 객체들의 공동체

devmomori 2022. 8. 10. 20:39

객체란 현실 세계에 존재하는 사물에 대한 추상화라는 것 이다.

 

어플리케이션을 개발하면서 객체에 직접적으로 대응되는 실세계의 사물을 발견할 확률은 그다지 높지 않다.

 

객체지향 설계의 핵심 사상인 '연결완전성'을 설명하는 데 적합한 틀을 제공한다.

 

객체지향에서 가장 중요한 개념 세가지

  • 역할
  • 책임
  • 협력

1장에서 나오는 카페에서 커피를 주문 후 커피를 받기까지의 과정

객체지향 사실과 오해 그림 1.2

 

  • 일반적으로 하나의 문제를 해결하기 위해 다수의 사람 혹은 역할이 필요하다.
  • 한 사람에 대한 요청이 또 다른 사람에 대한 요청을 유발하는 것이 일반적이다.
  • 요청은 연쇄적이다.
  • 요청 받은 사람 또한 주어진 책임을 다하면서 지식이나 서비스를 제공한다. 요청의 방향과 반대 방향으로 연쇄적으로 전달된다.

 

역할과 책임

역할이라는 단어는 일반적으로 책임이라는 개념을 내포하고 있다.

- 선생님이라는 역할은 학생을 가르칠 책임이 있다.

 

협력을 위해 특정한 역할을 맡고 적합한 책임을 수행한다는 것은 몇가지 개념을 제시한다.

 

1. 동일한 역할 수행

- 손님은 캐시어가 누구든 상관없이 커피를 주문하고 받을 수만 있으면 된다.

 

2. 대체 가능성

- 캐시어가 두명일 때 누가해도 상관없다.

 

3. 책임을 수행하는 방법은 자율적으로 선택

- 바리스타가 동일한 요청에 대하 서로 다른 방식으로 응답할 수 있는 능력 (다형성)

 

4. 한 사람이 동시에 여러 역할을 수행

- 한 사람이 캐시어와 바리스타의 역할을 동시에 수행

 

실세계의 커피 주문과정을 통해 객체지향을 좀 더 쉽게 설명이 가능하다. 이렇기 때문에 실세계의 모방이라는 은유를 사용한다.

 

역할과 책임을 수행하며 협력하는 객체들

  • 특정한 목표를 이루기 위해 협력하고, 책임을 수행하는 역할들 간의 연쇄적인 요청과 응답을 통해 목표를 달성한다.
  • 목표는 더 작은 책임으로 분할되고 책임을 수행할 수 있는 적절한 역할을 가진 사람에 의해 수행된다.

 

객체는 두 가지를 갖춰야한다.

1. '협력적' 이어야 함

  • 외부의 도움을 무시한 채 모든 것을 스스로 처리하려고 하는 객체는 내부적인 복잡도에 의해 자멸하고 만다.

2. '자율적' 이어야 함

  • 손님에게 음료를 주문하는 절차나, 바리스타에게 관련 내역을 전달하는 방법은 스스로 결정한다.
  •  손님은 캐시어에게 어떤 방식으로 어떻게 주문을 바리스타에게 전달해야하는지 지시하지 않는다.

 

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

행동을 하기 위해서는 필요한 상태를 함께 지니고 있어야한다.

객체 내부와 외부를 명확하게 구분함으로써 스스로 결정하는 자율성을 가지게 된다.

이렇게 구성된 어플리케이션은 유지보수가 쉽고 재사용성이 용이한 시스템을 구축할 수 있는 가능성을 제시해준다.

'Layer Architecture'가 문득 떠올랐다.

 

 

객체지향에서는 오직 한 가지 의사소통 수단만이 존재하는 데 그것을 메시지라 부른다.

전송하는 객체는 Sender - 수신하는 객체는 Receiver

 

객체가 수신된 메시지를 처리하는 방법을 메서드(Method)라고 부른다.

 

객체지향 프로그래밍 언어와 다른 프로그래밍 언어를 구분짓는 핵심적인 특징은 메시지를 수신한 객체가 실행 시간(run-time)에 메서드를 선택할 수 있다는 점이다.

 

외부의 요청이 무엇인지 표현하는 메시지와 요청을 처리하기 위한 메서드를 분리하는 것은 객체의 자율성을 높이는 핵심 메커니즘이다.

이것은 캡슐화와도 관련이 있다.

 

클래스와 객체 지향

클래스가 객체지향 프로그래밍 언어의 관점에서 매우 중요한 구성요소 이지만 핵심을 이루는 중심 개념이라고 말하기에는 무리가 있다.

자바스크립트는 프로토타입 기반의 객체지향 언어이며 클래스가 존재하지 않고(sugar syntax) 객체만이 존재한다.

 

훌륭한 객체지향 설계자가 되기 위해서는 클래스의 관점에서 메시지를 주고받는 객체의 관점으로 사고의 중심을 전환해야한다.

 

클래스는 그저 협력 관계를 코드로 옮기는 도구일 뿐이다.

 

클래스의 구조와 메서드가 아니라 객체의 역할, 책임, 협력에 집중하자.