[객체지향의 사실과 오해] Ch1. 협력하는 객체들의 공동체
1-1. 객체와 현실세계의 차이
객체에 대한 비유
- 객체 = 스스로 생각하고 스스로 결정하는 현실 세계의 생명체
- 상태와 행위를 ‘캡슐화(encapsulation)’하는 소프트웨어 객체의 ‘자율성(autonomous)’을 설명하는 데 효과적
- 현실 세계의 사람들의 암묵적인 약속과 명시적인 계약을 기반으로 협력하며 목표를 달성해 나가는 과정
- ‘메세지(message)’를 주고받으며 공동의 목표 달성을 위해 ‘협력(collaboration)’하는 객체들의 관계를 설명하는 데 적합
- 실세계의 사물을 기반으로 SW 객체를 식별하고 구현함
- 객체 지향 설계의 핵심 사상인 ‘연결완전성(seamlessness)’을 설명하는 데 적합한 틀 제공
1-2. 협력하는 사람들
커피 공화국
- 역할
- 커피를 주문하는 손님
- 주문을 받는 캐시어
- 커피를 제조하는 바리스타
- 책임
- 손님은 커피를 주문할 책임 수행
- 캐시어는 손님의 주문을 받는 책임 수행
- 바리스타는 주문된 커피를 제조하는 책임 수행
- 협력
- 커피가 정확하게 주문되고, 주문된 커피가 손님에게 정확히 전달될 수 있도록 협력함
요청과 응답으로 구성된 협력
역할과 책임
- 협력하는 과정에서 특정한
역할
을 부여 받음 - 역할은
책임
개념을 내포협력
에 참여하며 특정한역할
을 수행하는 사람들은 역할에 적합한책임
을 수행하게 됨
몇 가지 중요한 사실
- 여러 사람이 동일한 역할을 수행할 수 있다
- ex) 손님 입장에서는 캐시어가 주문을 받고 커피가 완성됐다는 사실을 통보하는 책임을 성실히 이행할 수 있으면 그만
- 역할은 대체 가능성(substitutable)을 의미한다
- 두 명이 동일한 역할을 수행할 수 있다면 요청자 입장에서 둘 중 어떤 사람이 역할을 수행하더라도 문제가 되지 않는다
- 책임을 수행하는 방법은 자율적으로 선택할 수 있다
- 요청을 받은 사람들은 요청을 처리하는 방법을 자유롭게 선택 가능
- 동일한 요청에 대해 서로 다른 방식으로 응답할 수 있는 능력을
다형성(polymorphism)
이라고 함
- 한 사람이 동시에 여러 역할을 수행할 수 있다
1-3. 협력 속에 사는 객체
- 객체는 섬이 아니다
- 자신이 맡은 역할을 책임지기 위해서 다른 객체들에게 도움을 요청하여 협력
객체지향의 예술은 객체에게 얼마나 적절한 책임을 할당하느냐의 문제
- 객체지향의 예술은 얼마나 객체간의 협력이 얼마나 조화를 이루는지
- 즉 협력의 품질은 객체의 품질로 결정됨
좋은 객체가 되기 위한 조건
- 객체는 충분히 ‘협력적’이어야 한다
- 전지전능한 신같은 객체를 만드는 것이 아닌 다른 객체에 요청도 하면서 자신이 받은 요청을
자율적
으로 처리해야 한다
- 전지전능한 신같은 객체를 만드는 것이 아닌 다른 객체에 요청도 하면서 자신이 받은 요청을
- 객체가 충분히 ‘자율적’이어야 한다
- A객체가 B객체에게 요청을 하면 B객체는 그 요청을 자율적으로 처리할 수 있어야 한다
상태와 행동을 함께 지닌 자율적인 객체
-
객체가 자율적이기 위해서는
상태
와행동
을 가져야 한다 - 객체의 자율성은 객체의 내부와 외부를 명확하게 구분하는 것으로부터
- 객체는 다른 객체가
무엇(what)
을 수행하는지는 알 수 없지만어떻게(how)
수행하는지에 대해서는 알 수 없어야
- 객체는 다른 객체가
- 객체 입장에서 자율성
- 상태를 직접 관리하고 이 상태를 기반으로 스스로 판단하고 행동할 수 있는 것
협력과 메시지
- 객체들간의 협력을 하기 위해서는 요청과 응답을 주고 받아야
- 객체는 오직 한 가지 의사소통 수단,
메시지
를 통해서만 주고받음 - 한 객체가 다른 객체에게 요청하는 것을 메시지 전송(sender)
- 다른 객체로부터 요청을 받는 것을 메시지 수신(receiver)
- 객체는 오직 한 가지 의사소통 수단,
메서드와 자율성
-
객체가 수신된 메시지를 처리하는 방법이
메서드(method)
-
외부의 요청이 무엇인지 표현하는 메시지와 요청을 처리하기 위한 구체적인 방법인 메서드를 분리하는 것이 객체의 자율성을 높이는 핵심 메커니즘
-
메시지와 메서드의 분리는 객체들 간의 자율성 증대시킴
- 객체는 다른 객체로부터 협력을 위해 요청을 받음
- 해당 메시지를 처리하기 위해 객체 스스로 메서드 선택
- 이는
캡슐화(encapsulation)
개념과도 관련
1-4. 객체지향의 본질
객체 지향 4원칙
-
객체지향은 시스템을 상호작용하는
자율적인 객체들의 공동체
로 바라보고, 객체를 이용해 시스템을 분할한다 -
자율적인 객체란
상태
와행위
를 함께 지니며 스스로 자기 자신을 책임진다 -
객체는 시스템의 행위를 구현하기 위해 다른 객체와
협력
한다. 각 객체들은 정해진역할
을 수행하고 역할은책임
의 집합이다 -
객체들은 다른 객체들과
메시지
를 통해서 협력하고,메시지
를 수신한 객체는 자율적으로메서드
를 선택해 이를 처리한다
객체를 지향하라
- 객체지향의 핵심은 Class가 아니다
- 객체 지향적 설계는 class의 상속을 지향하는 설계가 아니다
-
중요한 것은 클래스의 정적인 관계가 아니라, 메시지를 주고 받는 객체들의 동적인 관계
- 어떤 클래스가 필요한가? No
- 어떤 객체들이 어떤 메시지를 주고받으며 협력하는가? Yes
클래스의 구조와 메서드가 아니라 객체의 역할, 책임, 협력에 집중하라!