[객체지향의 사실과 오해] 01_협력하는 객체들의 공동체
01_협력하는 객체들의 공동체
“객체들의 패러다임의 핵심은 자율적인 객체들의 협력”
객체지향의 목표는 실세계를 모방하는 것이 아니라,
고객과 사용자를 만족시키는 신세계를 창조하는 것.
협력하는 사람들
요청-응답-협력, 역할-책임
역할, 책임, 협력
적절한 객체에게 적절한 책임을 할당하는 것.
책임은 객체지향 설계의 품질을 결정하는 가장 중요한 요소.
객체의 역할
- 여러 객체가 동일한 역할을 수행할 수 있다.
- 역할은 대체 가능성을 의미한다.
- 각 객체는 책임을 수행하는 방법을 자율적으로 선택할 수 있다.
- 하나의 객체가 동시에 여러 역할을 수행할 수 있다.
협력 속에 사는 객체
객체는 어플리케이션의 기능을 구현하기 위해 존재한다.
객체지향 어플리케이션의 아름다움을 결정하는 것 → 협력
협력이 얼마나 조화를 이루는 가를 결정하는 것 → 객체
결국, 협력(어플리케이션)의 품질을 결정하는 것은 객체의 품질
이를 위해, 객체가 갖춰야 할 덕목
- 객체는 충분히 ‘협력적’이어야 한다. 스스로 모든 것을 처리하려는 객체는 내부적인 복잡도에 의해 자멸하고 만다.
- 다른 객체의 요청, 다른 객체에게 요청에 열려 있어야 한다.
- 객체는 충분히 ‘자율적’이어야 한다.
- 다른 객체가 요청한 응답 여부나, 응답 방식은 객체 스스로 판단하고 결정한다.
객체지향 설계의 묘미
다른 객체와 조화롭게 협력할 수 있을 만큼 충분히 개방적인 동시에
협력에 참여하는 방법을 스스로 결정할 수 있을 만큼 충분히 자율적인 객체들의 공동체를 설계하는 것!
과거의 전통적인 개발 방법과는 다른 객체지향의 핵심은,
데이터(상태)와 프로세스(행동)를 객체라는 하나의 틀 안에 함께 묶어 객체의 자율성을 보장한다.
이러한 자율적인 객체로 구성된 공동체는 유지보수가 쉽고,
재사용이 용이한 시스템을 구축할 수 있는 가능성을 제시한다.
객체 간의 의사소통 수단: 메시지
수신된 메시지를 처리하는 방법: 메서드
다른 프로그래밍 언어와 구별되는 핵심적인 특징
메시지를 수신한 객체가 실행 시간에 메서드를 선택할 수 있다.
메시지와 메서드의 분리 → 객체의 협력에 참여하는 객체들 간의 자율성 증진.
캡슐화(encapsulation)와 깊은 관련.
객체지향의 본질
“객체”지향 어플리케이션이란,
역학을 가진 객체들이 그 책임을 다하며, 메시지를 주고받으며 협력하는 동적인 관계.
클래스는 이를 구현하는 메커니즘일 뿐!
사실, C++ 이전에 C#을 배울 때까지만 해도 객체 지향에 대하여 전혀 알지 못했다고 생각한다.
객체 지향? SOLID 원칙? 이라고 생각했던 것 같다.
사실상 길어봤자 6개월인 학원들에서는 기본 문법을 빠르게 익힌 후, Unity C#으로 넘어갔다.
객체 지향 이상의 컴포넌트 지향 언어라는 C#을 배우며,
부끄럽지만 public과 private을 단지 에디터 공개/비공개 정도로만 알았다.
그 과정에서 Getter/Setter는 Singleton 패턴에서만 보고, 사용해 보았다.
이후에 C++을 제대로(기초부터) 공부하며, 함수, 메서드, 메시지가 무엇인지 알게 되었고,
강사님이 추천해 주신 이 '객체지향의 사실과 오해'라는 책을 읽으며 객체가 무엇인지,
객체들은 어떻게 상호작용 하는지 그려지는 것 같다.
나는 본질적으로 언어를 익히며 왜?라는 의문을 해결해야 나의 의도를 명확하게 담아 정말 프로그래밍할 수 있다고 생각한다. 그렇기에 이제야 코더에서 프로그래머가 되었다고 생각한다.
사실상 객체 지향 언어를 배우기 이전에, 이 책을 읽고 공부했다면
훨씬 전체적인 구조를 생각하는 것에 도움이 많이 되었을 것이라고 생각한다.