객체지향의 사실과 오해 - 1장 '협력하는 객체들의 공동체'

순서18·2023년 2월 4일
0

목록 보기
2/4

객체지향 이란?

객체지향을 설명할 때는 주로

객체지향이란 실세계를 직접적이고 직관적으로 모델링할 수 있는 패러다임

이라는 표현을 쓴다.

객체지향의 철학적인 개념에는 적합한 설명이지만 실용적인 관점에서는 적합하지 않다.

객체 지향의 목표는 실세계를 모방하는 것이 아니라 '새로운 세계를 창조' 하는 것이다.

하지만 객체지향을 실세계의 모방으로 보는 것이 객체지향의 기본 사상을 이해하는 데는 효과적이기 때문에
1장에서는 해당 관점에서 객체지향을 설명한다.


현실 세계의 사람들이 암묵적인 약속과 명시적인 계약을 기반으로 협력하여 목표를 달성해 나가는 과정은
'메시지'를 주고받으며 공동의 목표를 달성하기 위해 '협력'하는 객체들의 관계와 비슷하다.

한 명의 손님 이 카페에서 커피를 주문하면
캐시어 가 해당 주문을 받고
바리스타 에게 주문을 전달하면
바리스타 가 커피를 만들어서 다시 캐시어에게 주고
캐시어 는 만들어진 커피를 손님에게 전달해주는
일상 속 프로세스를 생각해보자

  • 요청과 응답으로 구성된 협력
    손님은 커피를 스스로 만들 수 없기 때문에 캐시어에게 주문을 요청한다.
    캐시어도 마찬가지로 커피를 스스로 만들 수 없기 때문에 바리스타에게 커피 제작을 요청한다.
    바리스타는 커피를 완성하여 캐시어에게 응답하고
    캐시어는 커피를 받고 손님에게 응답한다.

  • 역할과 책임
    해당 프로세스에는 손님, 캐시어, 바리스타라는 역할이 존재한다.
    그리고 각 역할은 맡아야하는 책임이 있다.
    손님 은 커피를 주문할 책임,
    캐시어 는 주문 내용을 바리스타에게 전달할 책임과 커피가 준비됐다는 사실을 알릴 손님에게 알릴 책임,
    바리스타 는 커피를 제조할 책임이 있다.


협력, 역할, 책임에 대한 몇 가지 중요한 개념

  1. 여러 사람이 동일한 역할을 수행할 수 있다.
    캐시어가 주문을 전달할 때는 커피만 만들 수 있는 바리스타라면 어떤 바리스타든 상관 없다.

  2. 역할은 대체 가능성을 의미한다.
    손님 입장에서 캐시어가 여러명이라면 누가 주문을 받아도 상관 없다.

  3. 책임을 수행하는 방법은 자율적으로 수행할 수 있다.
    바리스타는 커피를 직접 갈아서 만들지, 커피 표면에 무늬를 만들지 원하는 방식대로 커피를 만들 수 있다.
    이처럼 동일한 요청에 대해 서로 다른 방식으로 응답할 수 있는 능력을 다형성이라고 한다.

  4. 한 사람이 동시에 여러 역할을 수행할 수 있다.
    한 사람이 캐시어와 바리스타의 역할을 동시에 수행할 수 있다.


협력 속에 사는 객체

상태와 행동을 함께 지닌 자율적인 객체

객체의 자율성은 객체의 내부와 외부를 명확하게 구분하는 것으로부터 나온다.
객체의 사적인 부분은 외부에서 일체 간섭할 수 없도록 차단해야하고
객체의 외부에서는 접근이 허락된 수단을 통해서만 객체와 의사소통 해야한다.
객체는 다른 객체가 '무엇'을 수행하는 지는 알 수 있지만 '어떻게'에 대해서는 알 수 없다.

협력과 메시지

손님이 말로써 캐시어에게 커피를 주문하듯이
객체지향의 세계에는 유일한 의사소통 수단인 '메시지'가 존재한다.
전송자(sender): 메시지를 전송하는 객체
수신자(receiver): 메시지를 수신하는 객체

메서드와 자율성

수신자는 수신한 메시지를 이해할 수 있는지 여부를 판단하고
정해진 자신만의 방법에 따라 메시지를 처리한다.
이때 메시지를 처리하는 방법을 메서드라고 부른다.
메서드는 클래스 안에 포함된 함수 또는 프로시저를 통해 구현된다.

바리스타로 전달된 커피 제조 요청이 메시지고
커피를 제조하는 구체적인 방법이 메서드인 것이다.


객체지향의 본질

네 가지 문장으로 정리하면 다음과 같다.

객체지향이란 시스템을 상호작용하는 자율적인 객체들의 공동체로 바라보고 객체를 이용해 시스템을 분할하는 방법이다.

자율적인 객체란 상태행위를 함께 지니며 스스로 자기 자신을 책임지는 객체를 의미한다.

객체는 시스템의 행위를 구현하기 위해 다른 객체와 협력한다. 각 객체는 협력 내에서 정해진 역할을 수행하며 역할은 관련된 책임의 집합이다.

객체는 다른 객체와 협력하기 위해 메시지를 전송하고, 메시지를 수신한 객체는 메시지를 처리하는 데 적합한 메서드를 자율적으로 선택한다.


객체를 지향하라

클래스의 구조와 메서드가 아니라
객체의 역할, 책임, 협력에 집중해야한다.
객체지향은 객체를 지향하는 것이지 클래스를 지향하는 것이 아니다.

0개의 댓글