객체 지향의 사실과 오해라는 책을 읽으며, 메모한 내용을 간단히 옮겨두려고 합니다.
다소 이해되지 않는 내용이 있더라도 단순 메모 정도로 생각해 주시면 감사하겠습니다.
1장 협력하는 객체들의 공동체
요청과 응답으로 구성된 협력
책에서는 커피숍을 예로 들어 아래와 같이 설명 한다.
협력을 커피 주문
으로 가정할 경우
아래 그림과 같이요청과 응답으로 협력
한다.
역활과 책임
역활이란 특정한 사람이 협력 안에서 차지하는 책임이나 의무
를 뜻한다.
손님은 커피 주문할 책임
캐시어는 손님의 주문을 받고 바리스타에게 전달할 책임
바리스타는 주문 받은 커피를 제조할 책임
- 여러 사람이 동일한 역활을 수행할 수 있다.
손님 입장에선 A캐시어든 B캐시어든 주문한 커피가 완성 후 전달되면 된다.
- 역활은 대체 가능성을 의미한다.
캐시어 역활을 여러명이 수행하여도 손님이 원하는 응답(커피)만 받으면 된다.
- 책임을 수행하는 방법은 자율적으로 선택한다.
커피 제조라는 동일한 요청을 받더라도 역활을 수행하는 사람들마다 각자의 방식으로 처리할 수 있다.
A 바리스타는 카푸치노 거품에 무늬를 만들고,
B 바리스타는 거품의 무늬 대신 향을 좀 더 향기롭게 만든다. - 한 사람이 동시에 여려 역활을 수행할 수 있다.
캐시어와 바리스타 역활을 한 사람이 수행할 수 있다.
객체지향의 핵심 개념
- 객체는 사람 또는 사물 (손님, 캐시어, 바리스타)
- 메세지는 요청 (커피 주문, 커피 제조 요청)
- 메서드는 요청을 처리하는 방법 (커피 제조)
협력의 핵심은 특정한 책임을 수행하는 역활들 간의 연쇄적인 요청과 응답을 통해 목표를 달성
한다는 것
"어떠한 객체도 섬이 아니다." 워드 커닝헐, 켄트 벡
시스템은 역활과 책임을 수행하는 객체로 분활되고,
시스템의 기능은 객체 간의 연쇄적인 요청과 응답의 흐름으로 구성된 협력으로 구현된다.
객체지향 설계는 적적한 객체에 적절한 책임을 할당하는 것에서 시작되며, 책임은 객체지향 설계의 품질을 결정하는 가장 중요한 요소
이다.
역활은 관련성 높은 책임의 집합이다. 곧, 역활은 유연하고 재사용 가능한 협력 관계를 구축하는데 중요한 설계 요소
이다.
협력 속에 사는 객체
객체지향 애플리케이션의 윤곽을 결정하는 것은 역활, 책임, 협력이지만, 실제로 협력에 참여하는 주체는 객체
이다.
즉, 객체가 없으면 역활, 책임, 협력이 아무런 의미가 없다.
객체는 애플리케이션의 기능을 구현하기 위해 존재하며, 협력의 품질을 결정하는 것은 객체의 품질
이다.
객체의 두가지 덕목은 아래와 같다.
- 객체는 충분히
협력적
이어야 한다.객체는 다른 객체의 요청에 충실히 귀 기울이고 다른 객체에게 적극적으로 도움을 욫어할 정도로 열린 마음을 지녀야 한다.
다른 객체 요청에 어떤 방식으로 응답할지 스스로 판단한고 결정한다. 심지어 요청에 응할지 여부도 스스로 결정해야 한다. - 객체는 충분히
자율적
이어야 한다.다른 객체와 조화롭게 협력할 수 있을 만큼 충분히 개방적인 동시에 협력에 참여하는 방법을 스스로 결정할 수 있을 만큼 충분히 자율적으로 설계되어야 한다.
상태와 행동을 함께 지닌 자율적인 객체
객체는 상태(state)와 행동(behavior)을 함께 지닌 실체이다. 객체가 협력에 참여하기 위해 어떤 행동을 해야 한다면 그 행동에 필요한 상태도 객체가 함께 지니고 있어야 한다.
객체의 자율성은 객체의 내부와 외부를 명확히 구분하는 것으로 부터 나온다.
객체의 내부는 외부에서 일체 간섭할 수 없도록 차단하고,
객체 외부에서는 접근이 허락된 수단을 통해서만 객체와 의사소통 해야한다. 즉, 객체는 다른 객체가 무엇(what)을 수행하는지는 알아도, 어떻게(how) 수행하는지는 알 수 없어야 한다.
과거의 전통적인 개발 방법은 데이터와 프로세스를 엄격하게 구분하였다면, 객체지향은 데이터와 프로세스를 객체라는 하나의 틀 안에 함께 묶어 자율성을 보장한다.
이것이 전통적인 개발 방법과 객체지향을 구분 짓는 핵심이다.
협력과 메시지
객체지향의 세계에서는 메시지라는 오직 한가지 의사소통 수단이 존재한다, 메시지를 전송하는 객체(sender)와 메시지를 수신하는 객체(receiver)사이의 관계로 협력이 구성된다.
메소드와 자율성
객체가 수신된 메시지를 처리하는 방법을 메서드(method)라고 한다.
어떤 객체에게 메시지를 전송하면 결과적으로 메시지에 대응되는 특정 메서드가 실행 메시지를 수신한 객체가
실행 시간에 메서드를 선택할 수 있다는 것
이 객체지향의 핵심 특징
메시지와 메서드의 분리는 객체의 협력에 참여하는 객체들 간의 자율성을 증진시키며, 이는 캡슐화(encapsulation) 갠념과도 깊이 관여한다.
객체지향의 본질
- 객체지향이란 시스템을 상호작용하는 자율적인 객체들의 공동체로 바라보고 객체를 이용해 시스템을 분할하는 방법
- 자율적인 객체란 상태와 행위를 함께 지니며 스스로 자기자신을 책임지는 객체
- 객체는 시스템의 행위를 구현하기 위해 다른 객체와 협력한다. 각 객체는 협력내에서 정해진 역활을 수행하며 역활은 관련된 책임의 집합이다.
- 객체는 다른 객체와 협력하기 위해 메세지를 전송하고, 메시지를 수신한 객체는 메시지를 처리하는데 적합한 메서드를 자율적으로 선택한다.
객체를 지향하라
- 코드를 담는 클래스의 관점에서 메시지를 주고 받는 객체의 관점으로 사고의 중심을 전환
- 적절한 책임을 수행하는 역활 간의 유연하고 견고한 협력 관계를 구축하는 것
- 클래스의 구조와 메서드가 아니라 객체의 역활, 책임, 협력에 집중하라
마무리
솔직히 책을 읽고 중요하다 싶은 내용을 메모하고 포스팅하는 과정에서도 정확히 이해되지 않는게 많은 것 같습니다.
차분히 다음 장을 읽고 또 내용을 정리하다 보면 언젠간 이해가 되길 바라며..
그럼 이만. 🥕👋🏼🖐🏼