"객체지향의 사실과 오해(역할, 책임, 협력 관점에서 본 객체지향)"을 읽고 남기는 글입니다. 책 내용을 정리하는것에 목적이 있습니다.
흔히 사람들은 객체지향이 현실세계를 모방하여 소프트웨어 내부로 옮겨오는 것이라고 생각합니다. 객체지향 소프트웨어는 실세계의 투영이며, 객체란 실세계 사물에 대한 추상화라고 생각합니다. 하지만, 객체지향의 목표는 현실세계의 모방이 아니며 오히려 사용자를 만족시킬 수 있는 새로운 세계를 창조하는 것입니다. 그럼에도 불구하고 많은 사람들이 객체지향을 실세계에 비유하는 이유는, 객체지향의 특징을 이해하는데에 효과적이기 때문입니다. 이에 실세계의 모방이라는 개념이 실무에서는 부적합하더라도, 이번 장에서는 실세계의 모방을 통하여 객체지향에 관한 기본적인 내용을 설명합니다.
출근길에 커피를 사는 모습을 상상해 봅시다.
손님은 커피를 주문합니다.
캐시어는 주문을 받습니다.
바리스타는 주문된 커피를 제조합니다.
우리가 매일 아침을 커피를 성공적으로 마실 수 있는 이유는 손님, 캐시어, 바리스타라는 역할이 존재하기 때문입니다.
커피를 사기 위해 일어나는 모든 과정 속에서는 손님, 캐시어, 바리스타 사이의 암묵적인 협력 관계가 존재합니다.
협력하는 과정에서 손님, 캐시어, 바리스타는 각자의 책임을 다합니다. 손님은 커피를 주문하고, 캐시어는 주문을 받고, 바리스타는 커피를 제조합니다.
손님이 커피를 받고 가게를 나서면, 커피 주문이라는 협력 관계는 깔끔히 종료됩니다.
요청과 응답으로 구성된 협력
일상에서 발생하는 대부분의 문제는 복잡해서, 개인이 해결하지 못하기에 문제 해결에 도움을 줄 수 있는 사람에게 도움을 요청(request)합니다. 하나의 문제를 해결하기 위해서는 다수의 역할이 필요해서, 하나의 요청에 또 다른 요청을 유발합니다. 따라서, 요청은 연쇄적으로 발생합니다.
요청을 받은 사람은 책임을 다하며 요청에 응답(response)합니다. 응답 또한 연쇄적으로 발생합니다.
이와 같이 요청과 응답을 통해 우리는 협력(collaboration)하며 문제를 해결합니다.
역할과 책임
역할과 책임은 협력을 위한 필수적인 요소입니다. 협력을 위해 한 사람(객체)이 특정한 역할을 맡고 그에 적합한 책임을 수행하는 것에는 중요한 개념이 존재합니다.
1) 여러 사람(객체)이 동일한 역할을 수행할 수 있다
2) 역할은 대체 가능성을 의미한다
3) 책임을 수행하는 방법은 자율적으로 선택할 수 있다
4) 한 사람(객체)이 동시에 여러 역할을 수행할 수 있다
커피를 주문하는 과정을 객체지향이라는 문맥으로 옮기면, 다음과 같습니다
객체는 애플리케이션의 기능을 구현하기 위해 존재하며, 아주 작은 기능도 하나의 객체가 감당하기에는 복잡합니다. 따라서 각 객체는 다른 객체와 협력하며 기능을 구현하게 됩니다. 이때 객체는 두 가지 덕목을 갖춰야 합니다.
1) 충분히 협력적일 것.
모든 것을 스스로 처리하려는 전지전능한 객체는 내부적인 복잡도에 의해 자멸하고 맙니다. 다른 객체에게 도움을 요청하고, 다른 객체의 요청에 응답해야 합니다.
2) 충분히 자율적일 것.
개방적인 동시에, 협력에 참여하는 방법은 스스로 결정할 수 있어야 합니다. 요청에 응답하는 방법, 요청에 응할지 여부는 객체가 스스로 결정해야 합니다.
객체는 자율성을 위해 상태(state)와 행동(behavior)을 함께 갖고 있습니다. 객체의 내부와 외부는 명확히 구분됩니다. 객체는 다른 객체가 '무엇(what)'을 수행하는지는 알 수 있지만 '어떻게(how)'수행하는지는 알 수 없습니다.
객체지향에서 협력은 메시지로 이루어집니다. 객체(송신자, sender)는 메시지를 전송하여 요청을 하고, 객체(수신자, receiver)는 메시지를 수신하여 요청을 받습니다.
수신된 메시지를 객체가 처리하는 방법을 메서드(method)라고 합니다. 메시지와 메서드의 분리는 객체의 자율성을 높이고 이는 캡슐화(encapsulation)과도 깊은 관련이 있습니다.
1) 시스템을 자율적인 객체들의 공동체로 보며 객체로 시스템을 분할
2) 자율적인 객체는 상태와 행위를 지닌다
3) 객체는 다른 객체와 협력하고, 각 객체는 역할을 수행하며, 역할은 관련된 책임의 집합이다
4) 객체는 협력을 위해 메시지를 전송하고 각 객체는 이를 처리하기 위한 메서드를 자율적으로 선택
많은 사람들은 클래스(class)가 객체지향의 핵심이라고 생각합니다. 클래스는 객체지향에서 중요한 요소이지만, 클래스는 객체 간의 협력 관계를 코드를 옮기는 도구에 불과합니다. 객체지향의 중심에는 객체가 있습니다. 클래스의 구조와 메서드가 아니라, 객체의 역할, 책임, 협력에 집중하세요.