본문 바로가기
👨‍👩‍👦‍👦 OOP

📔 협력하는 객체들의 공동체 (객사오 1장)

by kukim 2021. 11. 15.
객체지향의 중심은 클래스나 상속이 아니다.
객체지향 패러다임의 핵심은 '자율적인 객체들의 협력'이다.

 

들어가며

객체지향이란 현실 속 존재하는 사물을 최대한 유사하게 모방해 소프트웨어 내부로 옮겨오는 작업이다. 현실 세계에 존재하는 사물에 대한 추상화라는 것이다. 하지만 애플리케이션 개발하면서 객체에 직접 대응되는 실세계 사물을 발견하기란 어렵다. 객체지향의 목표는 실세계를 모방한다기보다는 오히려 새로운 세계를 창조하는 것이다. 개발자의 역할은 실세계를 소프트웨어로 옮겨 담는 것이 아니라 고객과 사용자를 만족시킬 수 있는 신세계를 창조하는 것이다. 실세계 모방이라는 객체지향 개념은 실무적으로 부적합하지만 객체지향이라는 용어에 담긴 기본 사상을 이해하는 데 효과적이기 때문이 이번 장에서는 객체지향은 실세계 모방을 전제하에 진행한다.

협력하는 사람들

커피 공화국의 아침

한 카페가 있다. 모든 음료 주문은 손님이 커피를 주문하고, 캐셔가 주문을 받고, 바리스타가 커피를 제조하는 과정을 거친다. 손님이 커피를 음미하며 테이블에 앉는 과정 속에는 손님, 캐시어, 바리스타 사이의 암묵적인 협력 관계가 존재한다. 손님, 캐시어, 바리스타 역할이 존재한다. 손님, 캐시어, 바리스타는 주문한 커피를 손님에게 제공하기 위해 협력하는 과정에서 자신이 맡은 바 책임을 다한다. 커피 주문이라는 협력에 참여하는 모든 사람들은 커피가 정확하게 주문되고 주문된 커피가 손님에게 전달될 수 있도록 역할과 책임을 다하고 있다. 협력, 역할, 책임은 객체지향의 가장 중요한 개념이다. 

요청과 응답으로 구성된 협력, 역할과 책임

고객은 커피(서비스)를 받기 위해 캐시어에게 주문을(도움을) 요청(request)한다. 캐시어는 주문을 받고 바리스타에게 커피 제조를 요청한다. 요청을 받은 사람은 요청한 사람에게 응답한다. 바리스타는 캐시어에게 커피 완성 응답을 보내고 캐시어는 고객에게 커피 완성되었다고 응답해준다. 요청, 응답을 통해 다른 사람과 협력(collaboration) 할 수 있다.

사람들은 협력하는 과정속에서 특정한 역할(role)을 부여받는다. 손님, 캐시어, 바리스타 역할이 있고 각 역할을 맡은 사람은 임무, 책임(responsibility)이 있다. 사람 간 요청, 응답을 하기 위해 협력이 필요하고 협력하는 과정 속에서 각자의 역할과 그에 맞는 책임이 있다.

여러 사람이 동시에 역할을 수행할 수 있다. 손님 입장에서 커미를 마실 수만 있다면 어떤 캐시어가 주문을 받든, 어떤 바리스타가 커피를 만들든 상관 없다.이는 역할은 대체 가능성을 의미한다. 책임을 수행하는 방법은 자율적으로 선택할 수 있다. 바리스타가 커피 주문을 받았을 때 바리스타마다 커피 만드는 스타일이 다를 수 있다. 동일한 요청에 서로 다른 방식의 응답할 수 있는 능력을 다형성(polymorphism)이라고 한다. 한 사람이 동시에 여러 역할을 할 수 있다. 캐시어는 캐시어이자 바리스타가 될 수 있다.

역할, 책임, 협력

위의 커피 예제는 객체지향의 핵심적이고 중요한 개념을 포함하고있다. 사람 → 객체, 요청 → 메시지, 요청 처리방법 → 메서드로 바꾸면 객체지향이라는 문맥으로 옮길 수 있다.

협력의 핵심은 요청과 응답을 통해 목표를 달성한다. 사람들의 협력과 객체들의 협력의 차이점은 객체의 경우 애플리케이션 기능을 구현하기 위해 협력한다는 점이다. 객체지향 설계는 객체에게 적절한 책임을 할당하는 것에서 시작된다. 객체에게 얼마나 적절한 책임을 선택하느냐가 설계 품질의 가장 중요한 요소이다. 역할은 협력에 참여하는 객체에 대한 일종의 페르소나이다. 주의사항으로 역할은 고정이 아니라 유연하고 재사용 가능한 협력 관계를 구축해야 한다. 왜냐하면 여러 객체가 동일한 역할을 수행할 수 있고 역할은 대체 가능하며 하늬 객체가 동시에 여러 역할을 할 수 있기 때문이다. 이는 객체지향 패러다임의 다형성과도 깊이 연관돼있다.

협력 속에 사는 객체

객체는 '협력적'인 존재이다. 스스로 존재하는 것이 아니다. 다른 객체에게 도움을 요청하거나 요청에 응답해주어야한다. 객체는 '자율적'이어야 한다. 자율적이란 말은 자기 스스로의 원칙에 따라 어떤 일을 하거나 통제하여 절제하는 것이다. 객체는 다른 객체가 '무엇(what)'을 수행하는지 알 수 있지만 '어떻게(how)' 수행하는지 알 수 없다. 커피 주문하는 협력 과정에서 손님, 캐시어, 바리스타는 외부의 간섭을 받지 않고 요청에 자율적으로 행동하여 응답할 뿐이다. 전통적인 개발 방법은 데이터와 프로세스를 엄격하게 구분한다. 이에 반해 객체지향에서는 데이터와 프로세스를 객체라는 틀 안에 함께 묶어 객체의 자율성을 보장한다. 이것이 전통적인 개발 방법과 객체 지향을 구분 짓는 핵심적인 차이이다. 객체 간 메시지를 전송하는 객체를 송신자(sender)라고 부르고 메시지를 수신하는 객체를 수신자(receiver)라고 부른다. 손님이 캐시어에게 커피 주문한다면 송신자는 손님이고 수신자는 캐시어이다. 수신된 메시지를 처리하는 방법을 메서드(method)라고 한다. 이때 손님은 캐시어가 나의 주문을 어떻게 처리하는지 모른다. 외부의 요청이 무엇인지 표현하는 메시지와 요청을 처리하기 위한 구체적인 방법인 메서드를 분리하는 것은 객체의 자율성을 높이는 핵심 메커니즘이다. 이는 캡슐화(encapsulation)라는 개념과도 깊이 관련돼 있다.

객체지향의 본질

객체지향의 핵심은 클래스가 아니다. 적절한 책임을 수행하는 역할 간의 유연하고 견고한 협력 관계를 구축하는 것이다. 클래스의 구조와 메서드가 아니라 객체의 역할, 책임, 협력에 집중하라. 객체지향은 객체를 지향하는 것이지 클래스를 지향하는 것이 아니다.

 

댓글