1장. 협력하는 객체들의 공동체
객체란 현실 세계에 존재하는 사물에 대한 '추상화' 라는 것이다.
애플리케이션을 개발하면서 객체에 직접적으로 대응되는 실세계의 사물을 발견할 확률은 그다지 높지 않다.
사실, 객체지향의 목표는 실세계를 모방하는 것이 아닌 새로운 세계를 창조하는 것이다. 실세계에 대한 비유는 단지, 객체지향의 다양한 측면을 이해하고 학습하는데 효과적이기 때문인 것을 인지하자.
객체지향의 기본적인 개념
객체지향에서 가장 중요한 개념 3가지 : 역할, 책임, 협력
카페에서 손님, 캐셔, 바리스타 3명이 어떻게 역할과 책임, 협력을 하는지 파악해보자.
요청과 응답으로 구성된 협력
사람들은 스스로 해결하지 못하는 문제를 다른사람에게 도움을 요청(request) 한다. 또한 이러한 요청은, 연쇄적인 반응을 일으키는게 일반적이다.
손님은 캐셔에게 커피를 주문(요청)한다.
캐셔는 바리스타에게 커피를 제조하는 것을 요청한다.
또한, 요청을 받은 사람은 주어진 책임을 다하며 요청에 대해 응답(response) 한다. 응답 또한 요청과 반대 방향으로 연쇄적으로 전달된다.
바리스타는 커피를 제조한 후 완성되었음을 캐셔에게 알리는 것으로 응답한다.
캐셔는 진동벨을 울려 손님에게 주문한 커피가 완성되었음을 알리는 것으로 응답한다.
이러한 요청과 응답을 통해 다른사람과 협력(Collaboration) 하며 복잡한 문제를 해결한다.
역할과 책임
이러한 협력이라는 과정 속에서 각자 역할(role) 을 부여받게 된다.
역할(role): 특정한 사람이 협력 안에서 차지하는 책임이나 임무
책임(responsibility): 역할이라는 단어에 내포된 개념인 것이다.
즉, 특정한 역할은 특정한 책임이 부여된 상태를 의미하게 된다.
역할, 책임, 협력
흔히, 객체지향을 실세계의 모방이라고 하는 것은 앞에서
사람이라는 단어를 '객체'로,
요청을 '메시지'로,
요청을 처리하는 방법을 '메서드'로 바꾸면
객체지향과 실세계에서 타인과 관계를 맺으며 협력하는 과정은 매우 유사하기 때문이다.
역할과 책임을 수행하며 '협력'하는 객체들
협력의 핵심은 특정한 책임을 수행하는 역할들 간의 연쇄적인 요청과 응답을 통해 목표를 달성한다는 것이다.
협력 속에서 객체는 다른 객체에게 도움을 요청하기도 하며, 다른 객체로부터 요청을 받기도 한다. 이로써, 연쇄적인 요청과 응답으로 구성되는 '협력 관계'가 완성된다.
사용자가 인식하는 시스템의 기능은 객체들이 성실히 협력해서 일궈낸 결실 이다.
결론적으로 시스템은 역할과 책임을 수행하는 객체로 분할되고 시스템의 기능은 객체 간의 연쇄적인 요청과 응답의 흐름으로 구성된 협력으로 구현된다.
가장 중요한 내용은 객체지향 설계라는 것은 적절한 책임을 할당하는 것 이 가장 중요하다.
책임은 객체지향 설계의 품질을 결정짓는 가장 중요한 요소
책임이 불분명할 경우 애플리케이션의 미래 또한 불분명하게 만든다.
얼마나 적절한 책임을 선택하느냐가 애플리케이션의 아름다움을 결정한다.
협력 속에 사는 객체
협력 공동체 일원으로서 객체는 다음과 같은 덕목을 지녀야 한다.
객체는 충분히 협력적이어야 한다.
객체가 충분히 자율적이어야 한다.
위의 내용이 무슨 의미일까?
1. 객체는 충분히 '협력적'이어야 한다?
단순하게 설명하자면, 스스로 모든 것을 처리하려고 한다면 내부 복잡도에 의해 자멸한다.
객체는 다른 객체의 요청에 응답할 뿐이다.
다른 객체의 명령에 복종하는 것이 아닌 점을 기억하자.
또한, 어떻게 응답할 것인지 객체 스스로 판단하고 결정한다.
심지어 요청에 대해 응할지 여부도 객체 스스로 판단해야 한다.
2. 객체가 충분히 '자율적'이어야 한다?
여기서의 자율은 스스로의 원칙에 따라 어떤 일을 하거나 자기 스스로를 통제하여 절제하는 것을 의미한다.
간단하게 예시를 들자면,
손님은 음료를 주문할 때나 바리스타에게 접수 내역을 전달하는 방법은 스스로 결정한다.
캐셔는 손님의 주문을 받은 후 어떤 방식으로 바리스타에게 전달할지 스스로 판단한다.
객체지향 설계의 묘미는 다른 객체와 조화롭게 협력할 수 있을 만큼 충분히 개방적인 동시에, 협력에 참여하는 방법을 스스로 결정할 수 있을 만큼 충분히 자율적인 객체들의 공동체를 설계하는 데 있다.
상태와 행동을 지닌 자율적인 객체
흔히 객체를 상태(state)와 행동(behavior)을 지닌 실체라고 정의한다.
객체가 어떤 행동을 하기 위해 필요한 상태를 알지 못한다면 말이 되지 않는다.
자율적인 존재이기 위해 필요한 행동과 상태를 지니고 있어야 한다.
또한, 객체의 외부에서는 접근이 허락된 수단을 통해서만 객체와 의사소통 해야한다. 다른 객체가 무엇(what)을 수행하는지는 알 수 있지만, 어떻게(how) 수행하는지에 대해서는 알 수 없다.
협력과 메시지
객체지향의 세계에서는 메시지라는 의사소통 수단만이 존재한다.
메시지 전송: 다른 객체에게 요청하는 것을 의미한다. (송신자, sender)
메시지 수신: 다른 객체로부터 요청을 받는 것을 의미한다. (수신자, receiver)
메서드와 자율성
이처럼 객체가 수신한 메시지를 처리하는 방법은 메서드(method) 라고 부른다.
객체지향 프로그래밍 언어에서는 클래스 안에 포함된 함수 또는 프로시저를 통해 구현된다.
메시지와 메서드의 분리는 객체의 협력에 참여하는 객체들 간의 자율성을 증진시킨다.
바리스타를 예시로,
메시지: 커피 제조 요청
메서드: 커피를 제조하는 구체적인 방법
즉, 바리스타는 커피 제조라는 메시지에 응답하기 위해 자신만의 자율적인 방법에 따라 커피 머신기를 사용할 것인지 핸드 드립으로 제조할 것인지 선택할 수 있다.
캡슐화(encapsulation)라는 개념과 깊이 연관이 되어있다는 것도 알아두자.
객체지향의 본질
그래서 객체지향이 무엇이라고 정의할 수 있을까?
객체지향이란 시스템을 상호작용하는 자율적인 객체들의 공동체로 바라보고 객체를 이용해 시스템을 분할하는 방법
자율적인 객체란 상태와 행위를 함께 지니며 스스로 자기 자신의 책임지는 객체
객체는 다른 객체와 협력하며 시스템의 행위를 구현 한다.
각 객체는 협력 내에서 정해진 역할을 수행 하며 역할은 관련된 책임 의 집합이다.
객체는 다른 객체와 협력하기 위해 메시지 를 전송한다.
메시지를 수신한 객체는 메시지를 처리하는데 적합한 메서드를 자율적으로 선택한다.
객체를 지향하라
객체지향에서 '객체'가 아닌 클래스를 중심으로 여기는 것은 객체지향 설계의 본질을 오해하는 것이다.
클래스가 객체지향 프로그래밍 언어의 관점에서 매우 중요한 구성요소(construct)이지만 객체지향의 핵심을 이루는 중심 개념이라고 말하기에는 무리가 있다.
코드를 담는 클래스의 관점에서 메시지를 주고받는 객체의 관점으로 사고의 중심을 전환하자
적절한 책임을 수행하는 역할 간의 유연하고 견고한 협력 관계를 구축하자
Last updated
Was this helpful?