1. 협력하는 객체들의 공동체
시너지를 생각하라, 전체는 부분의 합보다 크다.
- 객체지향 프로그래밍이란 현실 속에 존재하는 사물을 최대한 유자하게 모방하여 소프트웨어 내부로 옮겨오는 작업
- 객체는 현실 세계에 존재하는 사물에 대한 추상화
- 그러나, 객체 지향의 목표는 실세계를 모방하는 것이 아닌 새로운 세계를 창조하는 것
아래에서는 객체지향에 대해 설명하기 위해 왜 모방을 했는지에 대한 이야기를 합니다.
#
1.1 협력하는 사람들#
커피 공화국의 아침- 역할, 책임, 협력은 삶을 영위하기 위해 모든 곳에서 존재합니다.
- 커피를 사러 커피매장에 들어갔을 때, 손님, 캐시어, 바리스타 모두 각자의 책임과 역할이 있으며 이러한 협력으로 커피를 먹을 수 있습니다.
#
요청과 응답으로 구성된 협력- 요청(request)
- 스스로 해결하지 못하는 문제나 도움을 줄 수 있는 사람에게 도움을 요청합니다.
- 일반적으로 이러한 요청은 연쇄적으로 발생합니다. (손님 -> 캐시어 -> 바리스타)
- 응답(response)
- 일반적으로 요청과 반대순으로 진행됩니다. (바리스타 -> 캐시어 -> 손님)
- 협력(collaboration)
- 요청과 응답을 통해 다른 사람과 협력합니다.
#
역할과 책임- 사람들은 다른 사람과 협력하는 과정 속에서 특정한 역할(role)을 부여받습니다.
- 그러한 역할은 일종의 책임이나 의미를 의미합니다. 즉, 역할은 책임이라는 개념을 내포합니다.
따라서 다음의 중요한 개념을 얻을 수 있습니다.
- 여러 사람이 동일한 역할을 수행할 수 있습니다. (캐시어가 여러명일 수도 있으니)
- 역할은 대체 가능성을 의미합니다. (캐시어는 대체가능합니다. 즉, 대체 가능(substitutable)합니다.)
- 책임은 수행하는 방법은 자율적으로 선택합니다. (바리스타마다 다른 방법이 있을 수 있으므로 이를 다형성이라고 할 수 있습니다.)
- 한 사람이 동시에 여러 역할을 수행할 수 있습니다.
#
1.2 역활, 책임, 협력#
기능을 구현하기 위해 협력하는 객체들- 커피를 주문하는 과정을 객체 지향의 개념으로 바꿀 수 있습니다.
- 사람 -> 객체
- 손님의 요청 -> 메시지
- 손님의 요청을 처리하는 방법 -> 메서드
#
역할과 책임을 수행하며 협력하는 객체들- 협력의 핵심은 특정한 책임을 수행하는 역할들 간의 연쇄적인 요청과 응답을 통해 목표를 달성한다는 것입니다.
- 따라서 시스템의 기능은 객체들이 성실히 협력해서 일궈낸 결실입니다.
- 애플리케이션의 기능은 더 작은 책임으로 분할되고 책임은 적절한 역할을 수행할 수 있는 객체에 의해 수행됩니다.
- 객체지향 설계라는 예술은 적절한 객체에게 적절한 책임을 할당하는 것에서 시작됩니다.
#
1.3 협력 속에 사는 객체- 객체지향의 윤곽을 결정하는 것은 역할, 책임, 협력이지만 실제로 협력에 참여하는 주체는 객체입니다.
- 객체는 애플리케이션의 기능을 구현하기 위해 존재합니다.
- 객체는 다음과 같은 두가지 덕목을 갖춰야합니다.
- 객체는 충분히 협력적이여야합니다.
- 객체는 충분히 자율적이여야합니다.
- 객체의 사회도 인간의 사회와 유사합니다. 협력을 하여 공동의 목표를 달성합니다.
#
상태와 행동을 함께 지닌 자율적인 객체- 객체를 상태(state)와 행동(behavior)을 함께 지닌 실체라고 정의합니다.
- 객체의 자율성은 객체의 내부와 외부를 명확하게 구분하는 것으로 나옵니다. 즉, 객체의 사적인 부분은 스스로 관리하고 외부에서 간섭이되면 안됩니다.
- 과거의 전통적 개발 방식은 데이터와 프로세스를 구분했습니다.
#
협력과 메시지- 다만 인간들의 세상에서는 여러가지의 소통 방법이 있으나 객체지향 세계에서는 메시지만 존재합니다.
- 이때 메시지를 전송하는 객체를 sender, 수신 객체를 receiver라고 합니다.
#
메서드와 자율성- 객체는 다른 객체와 협력하기 위해 메시지를 수행하며 이러한 객체가 수신한 메시지를 처리하는 방법을 메서드(method)라고 합니다.
- 객체지향 프로그래밍 언어에서는 메서드는 클래스 안에 포함된 함수 또는 프로시저를 통해 구현됩니다.
- 메시지와 메서드의 분리는 객체의 협력에 참여하는 객체들 간의 자율성을 증진시킵니다.
#
1.4 객체지향의 본질객체지향의 본질을 간략히 정리하면 다음과 같습니다.
- 객체지향이란 시스템을 상호작용하는 자율적인 객체들의 공동체로 바라보고 객체를 이용해 시스템을 분할합니다.
- 자율적인 객체란 상태와 행위를 함께 지니며 스스로 자기 자신을 책임지는 객체를 의미합니다.
- 객체는 시스템의 행위를 구현하기 위해 다른 객체와 협력합니다. 각 객체는 협력 내에서 정해진 역할을 수행하며 역할은 관련된 책임의 집합입니다.
- 객체는 다른 객체와 협력하기 위해 메시지를 전송하고, 메시지를 수신한 객체는 메시지를 처리하는데 적합한 메서드를 자율적으로 선택합니다.
#
객체를 지향해라.- 객체지향의 세계에서 클래스는 중요한 구성요소이긴 하나, 객체지향의 핵심을 이루는 중심 개념은 아닙니다.
- 예를 들어 JS같은 프로토타입 기반의 객체지향 언어에서는 클래스가 없으며 객체만이 존재합니다. 여기서는 상속이 아닌 위임을 기반으로 진행합니다. 즉, 공동체가 아닌 클래스로 보는 구성도는 독으로 다가올 수 있습니다.
- 객체 지향의 핵심은 적절한 책임을 수행하는 역할 간의 유연하고 견고한 협력 관계를 구축하는 것입니다.
- 클래스는 협력에 참여하는 객체를 만드는 데 필요한 구현 메커니즘입니다.
- 클래스의 구조와 메서드가 아니라 객체의 역할, 책임, 협력에 집중하는 것입니다.