[객체지향] 1. 협력하는 객체들의 공동체
기존의 객체지향을 설명할때, 대부분의 사람들은 객체지향이란 실세계를 모델링하는 패러다임이라고 설명한다.
그러나 저자는 이게 잘못된 설명이라고 한다.
개발을 하며 객체에 직접적으로 대응되는 실세계의 사물은 그다지 없다는 이유에서이다.
그러면서 객체지향의 목표가 실세계의 모방이 아닌, 새로운 세계를 창조하는 것이라고 한다. 고객과 사용자를 만족시킬 수 있는 신세계를 창조하는 것이, 소프트웨어 개발자의 역할이라는 것이다.
실세계의 모방이라는 개념을 이용하는 이유는 객체지향이라는 용어에 담긴 기본 사상을 이해하고 학습하기에 효과적이기 때문이라고 한다.
실세계인 카페에서의 예시를 들면서 객체지향에서 가장 중요한 개념을 설명한다. 바로 역할, 책임, 협력이다.
현실에서 사람들이 협력을 위해 각자가 특정한 역할을 맡고, 역할에 적합한 책임을 수행한다는 것이다.
현실이 아닌 컴퓨터의 세계에서, 이런 협력관계에서 협력에 참여하는 주체는 객체이다. 카페에서 사람이 역할, 책임, 협력을 하듯이, 객체지향 세계에서는 객체를 통해 협력한다는 것이다. 객체지향이라는 이름을 쓰는 것 또한 패러다임의 중심에 객체가 있기 때문이다.
협력 공동체의 일원으로 객체는 두 가지 덕목을 갖춰야 한다.
1. 객체는 충분히 협력적이어야 한다. 외부의 요청에 응답할 수 있어야 한다.
2. 객체는 충분히 자율적이어야 한다. 스스로의 원칙에 따라 어떤 일을 하거나 스스로를 통제하여 절제해야 한다.
그래서 객체지향의 본질은 무엇인가. 저자는 객체지향의 주요 개념을 아래와 같이 간략하게 정리한다.
- 객체지향이란 시스템을 상호작용하는 자율적인 객체들의 공동체로 바라보고 객체를 이용해 시스템을 분할하는 방법이다.
- 자율적인 객체란 상태와 행위를 함께 지니며 스스로 자기 자신을 책임지는 객체를 의미한다.
- 객체는 시스템의 행위를 구현하기 위해 다른 객체와 협력한다. 각 객체는 협력 내에서 정해진 역할을 수행하며 역할은 관련된 책임의 집합이다.
- 객체는 다른 객체와 협력하기 위해 메시지를 전송하고, 메시지를 수신한 객체는 메시지를 처리하는 데 적합한 메서드를 자율적으로 선택한다.
객체를 지향해야 한다.
많은 사람들이 객체지향이라는 말을 들으면 클래스라는 단어를 떠올린다. 물론 클래스도 중요한 요소이긴 하지만, 자바스크립트와 같이 프로토타입 기반의 객체지향 언어에는 클래스가 존재하지 않고 객체만이 존재한다. 지나치게 클래스를 강조하는 프로그래밍 언어적인 관점은 객체의 캡슐화를 저해한다.
따라서 훌륭한 객체지향 설계자가 되기 위해서는. 코드를 담는 클래스의 관점에서 메시지를 주고받는 객체의 관점으로 사고의 중심을 전환해야 한다. 중요한 것은 어떤 객체들이 어떤 메시지를 주고받으며 협력하는가이다. 클래스는 객체들의 협력 관계를 코드로 옮기는 도구에 불과하다.
객체지향의 핵심은 클래스가 아니다. 핵심은 적절한 책임을 수행하는 역할 간의 유연하고 견고한 협력 관계를 구축하는 것이다. 객체지향의 중심은 클래스가 아닌 객체가 위치하며, 중요한 것은 객체들의 동적인 관계이다. 객체의 역할, 책임, 협력에 집중해라.
느낀점
나 또한 객체지향을 떠올릴 때, 클래스 중심적인 생각을 했었다.
객체지향 개념에서 유명한 비유인 붕어빵 틀 - 붕어빵을 떠올리며, 객체지향이란 클래스라는 틀을 만들어 객체를 생성하는것 정도로 생각했다. 그러나 저자는 클래스가 아닌 객체를 중심적으로 생각하라고 일갈한다.
중요한 것은 객체의 역할, 책임, 협력이라고 몇번이나 강조한다.
책을 다 읽고나서 어떻게 생각이 변할지 모르겠지만, 클래스가 아닌 객체를 중심으로 생각해야겠다고 확실히 느꼈다.