01 협력하는 객체들의 공동체

최지환·2022년 3월 4일
1

책은 읽어야 좋다

목록 보기
1/4
post-thumbnail

💡 객체 지향에서 가장 중요한 개념 세 가지. 역할, 책임 , 협력

간단한 예로 우리가 치킨집에 가서 치킨을 주문 하는 경우를 생각해 보자.

  1. 고객은 배고픔을 느끼고, 메뉴판을 보고, 자신이 먹고 싶은 치킨을 주문한다.
  2. 주문을 받는 치킨집 사장님은 주방의 요리사에게 치킨을 만들라고 말한다.
  3. 주방에서 열심히 만든 따뜻한 치킨을 사장님이 고객의 테이블에 치킨을 가져다 준다.

이 3 가지의 과정 속에 객체 지향에서 중요한 개념인 역할, 책임, 협력의 개념이 들어 있다.

잘 이해가 되지 않는다면 이렇게 생각해 보자

각각 고객, 주방의 요리사, 치킨집 사장님의 관점에서 본다면 이들은 아래와 같이 자신의 맡은 일을 수행하면, 임무를 완수한 것이다.

고객 → 치킨을 먹기 위해 치킨집 사장에게 주문 후, 음식이 나오면 식사.

사장 → 주문을 받고, 요리사에게 치킨을 요청 후 고객에게 전달

요리사 → 요청받은 치킨을 만들고, 다 만들면 사장에게 전달

이처럼 고객, 치킨집 사장, 요리사는 치킨을 고객에게 전달 하는 '협력'의 과정 속에서 자신의 맡은 '역할'의 '책임'을 다한다.

요청과 응답으로 이루어진 협력

위에서 말 했던 과정은 일종의 '요청'과 '응답'의 과정으로 이루어 진다.

요청을 받은 사람은 자신의 역할 내의 책임을 다하면서, 요청한 사람에게 응답(response)을 한다. 이 과정은 연쇄적으로 일어난다. 또한 치킨을 주문 할 때의 예시에서도 적용이 된다.

손님은 사장님에게 치킨 주문을 '요청'하고, 사장은 요리사에게 치킨 제작을 '요청'한다. 이제 모든 요청이 완료 되었다. 이제 응답을 해주면 된다. 요리사는 치킨을 제작하여 사장님에게 전달 하면서, '응답'을 해준다. 사장님은 고객에게 치킨을 내주며 '응답'을 하면, 이런 협력 관계가 완성되고, 모든 객체는 자신의 임무를 완수한다.

이렇게 각각의 요청과 응답은 '연쇄적'으로 발생한다.

역할과 책임

이제 역할과 책임에 대해 조금 더 자세히 정리해 보겠다.

위에서의 치킨집 사장님은 전화를 받고 주문을 받아야하는 역할을 부여 받았다. 역할의 의미를 들여다 보면 '어떤 협력에 참여하는 특정한 사람이 협력 안에서 차지하는 책임이나 임무를 의미'한다. 즉 역할은 '책임'을 내포하고 있다.

쉽게 설명 하자면, 특정한 역학을 그 객체의 '책임'이 무엇인지 암묵적으로 보여준다.

객체지향에서의 역할과 책임을 통해 알 수 있는 점.

  • 여러 객체(사람)이 동일한 역할을 수행 할 수 있고, 대체 가능성을 의미한다.
    → 손님이 치킨을 주문을 할때, 꼭 사장님이 아니더라도, 점원에게 주문을 할 수도 있다. 손님입장에서는 주문 요청을 받아 줄 수 있다면, 그게 사장이든지, 점원이든지 중요하지는 않다. 즉 '주문을 받는다.'라는 역할은 주문만 받을 수 있다면, 즉, 대체가 가능하다면 누구나 수행할 수 있다.
  • 책임을 수행하는 방법은 자율적으로 수행 할 수 있다.
    → 요청을 받은 객체는 그 요청을 수행하기 위해서, 요청을 처리하는 방식을 자유롭게 할 수 있다. 만약 위에서 요리사가 후라이드 치킨을 주문을 받았다면, 요리사는 손님이 원하는 치킨을 제공하기 위해, 자신만의 비법으로, 혹은 요리책의 레시피로, 아니면 다른 치킨집에 주문을 해서 치킨을 전달 하든, 요청받은 치킨만 주면 된다.
  • 한 사람이 동시에 여러 역할을 수행 할 수 있다.
    → 사장님 입장에선, 손님에게 치킨을 전달해야한다. 이때 요리사에게 요청을 하여 치킨을 받을 수도 있지만, 자신이 직접 치킨을 튀길 수도 있다. 즉, 사장님은 치킨집 사장님인 동시에 요리사 일 수도 있다.

협력 속에 사는 객체

위에서 설명해왔듯이 역할, 책임, 협력은 객체지행에서 중요한 요소이다. 하지만 이것만 강조하다보면, 정작 중요한 '객체'에 대해 생각을 못할 수가 있다. 실제로 협력에 참여하는 주체는 '객체'이기 때문이다.

각각의 객체들이 어떠한 임무를 수행하기위해 서로 요청과 반응을 한다. 그러기 위해서는 객체는 두 가지 조건을 가져야 한다.

  1. 객체는 충분히 '협력적'이어야한다.
    → 객체가 어떠한 다른 객체로부터 요청을 받았을 때, 그 요청을 처리하기 위해 적극적으로 반응을 해야한다. 혹은, 어떠한 객체가 요청을 처리 함에 있어, 혼자서 힘들다고 느껴지고, 다른 객체에게 요청을 해야만 한다면, 다른 객체에게 요청을 할 수 있어여한다.
    만약 혼자서 모든 일을 하기 위해 한 객체가 모든 기능을 갖고 있다면, 그 객체는 내부가 매우 복잡해 결국 자멸 할 것이다.
    위의 치킨집의 예시가 그렇다. 만약 고객이 치킨집에 갔는데 혼자서 주문 받고 치킨을 튀기고 먹는다면, 분명이 문제가 발생할 수 있다.

2. 객체는 충분히 '자율적'이어야 한다.

→ 객체는 어떤 일을 하거나 자기 스스로를 통제하고 절제해야 한다. 객체 들은 공동의 목표를 수행하기 위해 서로 '협력'을 해야한다. 그때마다 자신이 받은 요청을 처리하기 위해, 충분히 '자율'적으로 본인에게 주어진 책임을 수행해야한다. 만약 자율적이지 않는다면, 문제를 처리함에 있어서 또 다른 문제가 발생 할 수 있다.

객체의 자율성

객체의 자율성은 각 객체들의 내부와 외부를 명확하게 하는 것으로 부터 나온다고 한다. 객체는 오로지 본인의 역할을 수행하기 위한 기능들이 있다. 치킨 요리사가 치킨만 튀기고, 사장님은 주문만 받고, 고객은 주문만 한다. 이때, 고객은 어떤 과정으로 치킨을 만드는지, 어떤 과정으로 주문을 받는지는 모른다. 즉, 다른 객체가 '무엇(What)'을 하는지는 알 수 있지만, '어떻게 (how)' 하는지는 알 수가 없다.

단, 각 객체들은 다른 객체가 어떻게 하는지는 몰라도, 자율적인 범위 안에서 자신의 역할과 책임을 수행하면, 이 협력 관계 후에 원하는 결과가 나온다.
→ 만약 한 객체가 다른 객체로 바뀌더라도, 원하는 요청만 해결 할 수 있다면, 협력관계에 있어서 문제가 되지 않는다. 즉, 유지보수가 쉽고, 재사용이 용이하다.

이것은 자율적인 객체로 구성된 공동체라는 개념인 '객체지향'의 장점이 된다.

객체 지향의 본질(요약)

  • 객체지향이란 자율적인 객체들의 공동체
    → 시스템을 상호작용하는 객체들의 공동체로 보고, 이런 객체들을 이용해 시스템을 분할 하는 방법
  • 자율적인 객체
    → 자율적인 객체는 상태와 행위를 함께 지니며 자기 자신의 책임을 다한다
  • 객체들은 서로 '협력'하며, 그 협력 내에서 자신의 '책임'을 수행한다. 이때 이러한 책임의 집합이 '역할'

느낀점

이책을 읽기 전에 객체지향에 대해 생각해보면, 오로지 클래스와 상속 밖에 생각이 나지 않았다. 하지만, 01협력하는 객체들의 공동체 부분을 읽으면서 생각이 바뀌게 되었다. 객체지향은 말 그대로 '객체'지향이지, 클래스지향이 아니라는 것이다.
객체 하나하나가 자신들의 책임들을 서로 협력관계 속에 수행하면서, 결과를 제공해준다. 이런 부분은 객체 지향에 대해 다시 한번 생각 할 수 있었다.
즉 객체 지향에서 가장 중요한 것은 '자율성을 가진 객체들의 협력'이다.

0개의 댓글