본문 바로가기
개발 도서

[객체지향의 사실과 오해] 협력하는 객체들의 공동체

by 성건희 2020. 4. 1.
반응형

객체 지향 언어인 JAVA를 사용하면서 '좋은 객체 지향 설계란 무엇일까?'를 항상 고민해 왔었다.

어떤 프로젝트를 설계할 때, 객체간의 협력을 시킨답시고 제대로 된 객체의 속성과 메서드도 정의내리지 못해서

요구사항이 추가되었을 때 바꿔야 할 코드가 많아져서 고생했던 경험이 있다.

올바른 설계에 대한 필요성을 느꼈고 객체 지향의 책으로 유명한 '조영호'님의 '객체지향의 사실과 오해'를 정독하며

객체 지향의 시각을 넓혀볼 예정이다.

 

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

객체지향은 새로운 세계를 창조하는 것

대부분의 사람들은 객체지향을 '현실 세계의 모방' 이라고 말한다.

하지만 객체지향의 목표는 현실 세계를 모방하는 것이 아닌, 새로운 세계를 창조하는 것이다.

 

커피숍 예제

카페 브랜드로 유명한 별벅스를 예로 들어보자

별벅스

 

카페에서는 손님, 바리스타, 캐시어역할을 가진 3개의 객체가 협력하며 이루어진다.

손님은 커피를 주문하는 책임을 가진다.

바리스타는 커피를 만드는 책임을 가진다.

캐시어는 손님이 주문한 음료를 바리스타에게 알려주고, 계산하는 책임을 가진다.

역할과 책임은 협력이 원활하게 진행되는 데 필요한 핵심적인 구성 요소다.

역할, 책임, 협력의 중요한 개념

여러 사람이 동일한 역할 수행 가능

  • 손님은 자신이 커피를 마실 수만 있다면, 어떤 캐시어가 주문을 받는지는 중요하지 않다.
  • 캐시어는 주문 내역에 맞는 커피만 받을 수 있다면, 어떤 바리스타가 커피를 제조하는지는 중요하지 않다.

역할은 대체 가능성을 의미한다

  • 캐시어는 철수와 유리가 있다. 손님 입장에서 캐시어 역할을 수행할 수 있다면, 철수에게 주문을 하든 유리에게 주문을 하든 상관이 없다.

책임을 수행하는 방법은 자율적으로 선택 가능

  • 커피를 제조하는 동일한 요청을 받더라도 서로 다른 방식으로 요청을 처리할 수 있다. (다형성)
  • 바리스타 건희는 카푸치노 거품을 이용해 무늬를 만든다.
  • 바리스타 민지는 아메리카노의 향을 좀 더 향기롭게 만든다.

한 사람이 동시에 여러 역할 수행 가능

  • 위 예제는 바리스타와 캐시어의 역할이 분리되어 있지만, 사실 현실에서는 바리스타가 캐시어의 역할까지 수행한다.

협력 속에 사는 객체

객체가 갖춰야 할 덕목

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

협력적이란?

객체는 다른 객체의 요청에 응답하고, 필요할 경우 다른 객체에게 도움을 요청하여야 함

협력적이라는 말이 다른 객체의 명령에 행동하는 수동적인 존재를 의미하는 것이 아니다.

다른 객체의 요청에 객체 스스로 판단하고 결정하여 응답하는 것이다.

 

자율성이란?

자신의 행동을 스스로 결정하고 책임지는 것

객체의 자율성은 객체 내부와 외부를 명확하게 구분하는 것으로부터 나온다. (캡슐화)

객체는 다른 객체가 무엇(WHAT)을 수행하는지는 알 수 있지만 어떻게(HOW) 수행하는지는 알 수 없다.

 

예전에 최범균 팀장님과 식사를 했을 때
How 보단 What이라는 주제로 얘기를 나눴던 기억이 있었는데 여기서 나오는구나ㅋㅋ

참고 - 최범균 팀장님과의 저녁식사

 

메시지를 전달하라

메시지란 객체지향 세계에서 오직 한 가지 의사소통 수단으로,

한 객체가 다른 객체에게 요청하는 것을 메시지를 전송한다고 말하며

다른 객체로부터 요청을 받는 것을 메시지를 수신한다고 말한다.

 

이 부분은 코드스쿼드를 수강하면서 포비에게 코드리뷰를 받으면서 자주 피드백을 받았던 내용이라

잊지 않고 기억하고 있다.

 

포비피드백

 

Getter를 쓰지 않고 메시지를 전달하는 이유

  1. 객체지향에 어긋난다.

    데이터를 꺼내서 밖에서 처리를 하는 것은 절차지향적인 방식이다.

  2. 중복이 발생한다.

    데이터를 꺼내서 처리하다 보면 중복이 발생한다. 메시지 전달을 하면 중복을 제거할 수 있다.

  3. 의미를 파악하기가 어렵다.

    메시지를 전달하면 개발자가 해당 메시지를 보고 무슨 역할을 하는지 짐작이 가능하다.

    하지만 데이터를 꺼내서 처리하면 한눈에 들어오지 않아 역할을 파악하기가 어렵다.

 

객체지향의 본질

객체지향이란?

  • 객체지향이란 시스템을 상호작용하는 자율적인 객체들의 공동체로 바라보고 객체를 이용해 시스템을 분할하는 방법이다.
  • 자율적인 객체란 상태행위를 가지고 자기 자신을 스스로 책임지는 객체를 의미한다.
  • 객체는 시스템의 행위를 구현하기 위해 다른 객체와 협력한다. 각 객체는 협력 내에서 정해진 역할을 수행하며 역할은 관련된 책임의 집합이다.
  • 객체는 다른 객체와 협력하기 위해 메시지를 전송하고, 메시지를 수신한 객체는 메시지를 처리하는 데 적합한 메서드를 자율적으로 선택한다.

 

사실 위의 개념을 보았을 때, 어느 정도는 이해되는데 단어가 어려워 와닿지는 않는다..

그래서 나만의 용어로 정리한 객체지향의 정의는 다음과 같이 내리기로 했다.

 

객체지향이란 프로그래밍에 필요한 데이터를 추상화해서 상태와 행위를 가진 객체를 만들고,

그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다.

 

객체 지향은 객체를 지향하는 것이지 클래스를 지향하는 것이 아니다.

어떤 클래스가 필요한가가 아니라 어떤 객체들이 어떤 메시지를 주고받으며 협력하는가가 더 중요하다.

클래스는 협력에 참여하는 객체를 만드는 데 필요한 구현 메커니즘일 뿐이다.

 

참고

- 객체지향의 사실과 오해 (~ p.38)

반응형

댓글