객체지향의 사실과 오해 - 1장

HyeBin, Park·2022년 6월 1일
0
post-thumbnail

객체지향의 사실과 오해 - 1장

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

시너지를 생각하라. 전체는 부분의 합보다 크다. - 스티븐 코비**

🤔 객체지향은 실세계의 모방 ?

  • 철학적인 개념을 설명하는 데는 적합하지만, 유연하고 실용적인 관점에서 객체지향 분석, 설계를 설명하기에는 적합하지 않다.
  • 애플리케이션을 개발하면서 객체에 직접적으로 대응되는 실세계의 사물을 발견할 확률은 낮다.
  • 객체와 사물 간의 개념적 거리는 유사성을 찾기 어려울 정도로 매우 먼 것이 일반적이다.

실세계의 방화벽과 네트워크의 방화벽

  • 방화벽이 화재의 확산을 막는 것이 아닌 네트워크 침입을 막는다고해서 문제될 것이 있는가?

  • 실세계의 방화벽이 건물과 연관되어 있다고 해서 네트워크 방화벽이 건물과 연관될 필요가 있을까?
    => 의미적 거리만큼이나 소프트웨어 객체와 실세계 사물 사이에 존재하는 연관성은 희미하다.

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

  • 고객과 사용자를 만족시킬 수 있는 신세계를 창조하는 것이 개발자의 역할
  • 소프트웨어 시스템이 해결하려고 하는 실재는 잘해봐야 먼 친척밖에는 되지 않는다. -버트란드 마이어
    => 소프트웨어의 세계와 실세계 사이의 거리가 멀다는 것

🤔 비현실적인 실세계의 모방이라는 개념을 반복적으로 재생산하는 이유는 뭘까?

  • 객체의 상태와 행위를 캡슐화하는 소프트웨어 객체의 자율성을 설명하는데 효과적이다.
  • 메시지를 주고받으며 공동의 목표를 달성하기 위해 협력하는 객체들의 관계를 설명하는데 적합하다.
  • 연결완전성을 설명하는 데 적합한 틀을 제공한다.
  • 객체지향이라는 용어에 담긴 기본 사상을 이해하고 학습하는 데는 매우 효과적이다.

🤖 협력하는 사람들

  • 일반적으로 하나의 문제를 해결하기 위해 요청은 연쇄적으로 발생한다.
  • 커피 주문이라는 협력은 손님이 캐셔에 주문하면서 시작되고 손님이 캐셔에게 커피를 요청한다.
  • 캐셔는 주문을 받고 바리스타에게 커피 제조를 요청한다.

  • 요청을 받는 사람은 주어진 책임을 다하면서 필요한 지식이나 서비스를 제공한다.
  • 다른 사람의 요청에 응답하고, 요청이 연쇄적이기 때문에 응답 역시 요청의 반대 방향으로 연쇄적으로 전달된다.
  • 바리스타는 커피를 제조한 후 캐셔에게 커피 제조가 완료 되었음을 알리고, 캐셔는 커피가 준비 되었음을 진동벨로 손님에게 알린다.

  • 요청과 응답을 통해 다른 사람과 협력할 수 있는 능력은 인간으로 하여금 거대하고 복잡한 문제를 해결할 수 있는 공동체를 형성할 수 있게 만든다.
  • 협력의 성공은 특정한 역할을 맡은 각 개인이 얼마나 요청을 성실히 이행하는가에 달려있다.

🐢 역할

  • 협력하는 과정 속에서 사람들은 특정한 역할을 부여는다.
  • 역할은 어떤 협력에 참여하는 특정한 사람이 협력 안에서 차지하는 책임이나 임무이다.
  • 손님은 커피를 주문하는 임무, 캐셔는 주문을 받아야하는 임무, 바리스타 역할을 맡은 사람은 주문된 커피를 제조해야하는 책임
  • 역할이라는 단어는 의미적으로 책임이라는 개념을 내포한다.

🥦 책임

  • 특정한 역할은 특정한 책임을 암시한다.
  • 선생님은 역할은 학생을 가르칠 책임이 있다.
  • 범죄자를 검거할 책임을 거부하는 사람에게 경찰관이라는 역할을 부여할 수 없다.
  • 프로그래머라는 역할을 맡을 수 있는 이유는 훌륭한 프로그램을 개발할 책임을 기꺼이 받아들이기 때문이다.
    => 즉, 해당 역할이 가진 책임을 다 해야 역할을 맡을 수 있다.

📕 협력을 위한 역할과 책임에서 알 수 있는 중요한 개념

1. 여러 사람이 동일한 역할을 수행할 수 있다.

  • 손님의 입장에서는 어떤 캐셔인지, 캐셔의 입장에서는 어떤 바리스타인지는 중요하지 않다.
  • 캐셔나 바리스타가 책임을 성실히 이행할 수만 있다면 그만이다.

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

  • 손님 입장에서 캐셔는 대체 가능하다.
  • 두 명이 동일한 역할을 수행할 수 잇다면 요청자 입장에서 어떤 사람이 역할을 수행해도 문제가 되지 않는다.

3. 책임을 수행하는 방법은 자율적으로 선택할 수 있다.

  • 요청을 받은 사람들은 요청을 처리하는 방법을 자유롭게 선택할 수 있다.
  • 동일한 요청에 때해 서로 다른 방식으로 응답할 수 있는 능력을 다형성이라고 한다.

4. 한 사람이 동시에 여러 역할을 수행할 수 있다.

  • 한 사람이 캐셔와 바리스타의 역할을 동시에 수행하는 것도 가능하다.
  • 회사에 출근하면 사원이라는 역할, 집에서는 아이의 부모로서의 역할과 누군가의 배우자라는 역할을 수행한다.

👨‍👩‍👧‍👦 협력 속에 사는 객체

어떤 객체도 섬이 아니다. -켄트 벡

  • 객체 공동체 안에 살고 있는 성실한 객체 시민은 자신에게 주어진 역할과 책임을 다하는 동시에 시스템의 더 큰 목적을 이루기 위해 다른 객체와도 적극적으로 협력한다.
  • 시스템역할과 책임을 수행하는 객체로 분할되고 시스템의 기능객체 간의 연쇄적인 요청과 응답의 흐름으로 구성된 협력으로 구현된다.
  • 객체지향 설계는 적절한 객체에서 적절한 책임을 할당하는 것에서 시작된다.
    => 책임은 객체지향 설계의 품질에 가장 중요한 요소

객체의 역할

  • 여러 객체가 동일한 역할을 수행할 수 있다.
  • 역할은 대체 가능성을 의미한다.
  • 각 객체는 책임을 수행하는 방법을 자율적으로 선택할 수 있다.
  • 하나의 객체가 동시에 여러 역할을 수행할 수 있다.
  • 역할은 유연하고 재사용 가능한 협력 관계를 구축하는데 중요한 설계 요소

🎅 협력 공동체의 일원으로서 객체가 가져야할 덕목

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

  • 다른 객체의 요청에 충실히 응답하고 다른 객체에게 적극적으로 도움을 요청할 정도로 열린 마음을 지녀야 한다.
  • 객체는 다른 객체의 명령에 복종하는 것이 아닌 요청에 응답할 뿐이다.

2. 객체는 자율적이어야한다.

  • 자율적 : 자기 스스로의 원칙에 따라 어떤 일을 하거나 자기 스스로를 통제하여 절제하는 것
  • 어떤 식으로 응답할지는 객체 스스로 판단하고 결정하며 요청에 응할지 여부도 스스로 결정할 수 있다.
  • 객체 공동체에 속한 객체들은 공동의 목표를 달성하기 위해 협력에 참여하지만 자율적인 존재다.
  • 객체는 다른 객체가 무엇을 수행하는지는 알 수 있지만 어떻게 수행하는지에 대해서는 알 수 없다.

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

  • 자신의 상태를 직접 관리하고 상태를 기반으로 스스로 판단하고 행동할 수 있음
  • 객체는 행동을 위해 필요한 상태를 포함하는 동시에 특정한 행동을 수행하는 방법을 스스로 결정할 수 있어야 한다.
  • 객체는 상태와 행위를 하나의 단위로 묶는 자율적인 존재
  • 자율적인 객체로 구성된 공동체는 유지보수가 쉽고 재사용이 용이한 시스템을 구축할 수 있는 가능성을 제시한다.

🎫 메시지

  • 객체지향세계에서 존재하는 유일한 의사소통 수단
  • 객체지향세계에서 협력은 메시지를 전송하는 객체와 메시지를 수신하는 객체 사이의 관계로 구성된다.
  • 메시지를 전송하는 객체는 송신자, 수신하는 객체는 수신자라고 부름

💎 메서드

  • 객체가 수신된 메시지를 처리하는 방법
  • 클래스 안에 포함된 함수 또는 프로시저를 통해 구현된다.
  • 메시지를 수신한 객체가 실행 시간에 메서드를 선택할 수 있다
    => 다른 프로그래밍 언어와 다른 객체지향 프로그래밍 언어의 특징
  • 메시지와 메서드의 분리로 객체들 간의 자율성을 증진시킨다.
    => 커피 제조 메시지에 응답하기 위해 자율적인 방법에 따라 제조할 수 있다.
    => 캡슐화와 관련있다.

🧸 객체지향 정리하기

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

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

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

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

0개의 댓글