[Object-Oriented] 4. 책임, 역할, 협력

이성민·2024년 3월 20일
post-thumbnail

서론

  • 객체지향에 입문한 사람들의 가장 큰 실수
    → ‘협력’을 고려하지 않고 객체가 뭘 갖고 뭘 할 수 있는지부터 생각하는 것
    객체지향에서 중요한 것은 ‘협력’
    → 객체들이 어떻게 서로 협력해내는지
    → 어떤 협력에 참여하는지 ⇒ 객체가 필요한 행동 결정
    → 객체가 필요한 행동 ⇒ 객체가 가질 상태 결정


협력

요청하고 응답하며 협력하는 사람들

  • 협력은 여러 객체가 참여하며, 연쇄적으로 이루어짐
    → 시작은 한 객체가 도움을 청할 때 시작
    → 처리를 할 수 있을 것 같은 다른 객체에 요청을 보냄

재판 속의 협력

  • 앨리스의 이야기 속에서의 협력
    1. 누군가가 왕에게 재판을 요청
    2. 왕이 하얀 토끼에게 증인을 부를 것을 요청
    3. 요청을 받은 토끼는 모자 장수에게 증인석으로 입장할 것을 요청
    4. 모자 장수는 증인석에 입장함으로써 토끼의 요청에 응답 = 토끼의 왕의 요청에 대한 응답
    5. 왕은 모자 장수에게 증언할 것을 요청
    6. 모자 장수는 알고 있는 내용을 증언하여 왕의 요청에 대해 응답
  • 누군가 ⇒ 왕 : 재판하라
    → 왕은 재판을 수행할 의무가 있음 & 재판에 필요한 지식이 있음

  • 왕 ⇒ 토끼 : 목격자 불러와라
    → 토끼는 목격자에 대해 알고 있음 & 목격자를 부를 의무가 있음

  • 왕 ⇒ 모자 장수 : 증언하라
    → 모자 장수는 증언할 내용을 알고 있음 & 증언할 의무가 있음



책임

책임의 분류

  • 책임 : 객체에 의해 정의되는 응집도 있는 행위의 집합
    객체가 알아야 할는 정보와 객체가 수행할 수 있는 행위에 대해 개략적으로 서술한 문장

  • 책임의 구성

    • 객체가 무엇을 알고 있는가 ( knowing )

      • 개인적인 정보에 관해 아는 것
      • 관련 객체에 관해 아는 것
      • 자신이 유도하거나 계산할 수 있는 것에 관해 아는 것
    • 무엇을 할 수 있는가 ( doing )

      • 객체를 생성하거나 계산을 하는 등의 스스로 하는 것
      • 다른 객체의 행동을 시작시키는 것
      • 다른 객체의 활동을 제어하고 조절하는 것

  • 앨리스의 이야기

      • Doing: 왕은 재판을 집행 / 토끼에게 증인을 불러오도록 요청 / 증인에게 증언하라고 요청
        → “다른 객체들의 활동을 제어하고 조율
        → 하는 것에 관련된 책임을 수행
    • 토끼

      • Knowing: 토끼는 목격자가 모자장수임을 알고 있음
        → “관련된 객체에 대해 아는 것
        → 아는 것에 대한 책임
      • Doing: 증인에게 증인석에 입장하도록 요청
        → “다른 객체의 행동을 시작시키는 것
        → 하는 것에 대한 책임
    • 모자 장수

      • Knowing: 자신이 알고 있는 사실을 증언해야 함
        → “자신이 유도하거나 계산할 수 있는 것에 관해 아는 것
        → 아는 것에 대한 책임
      • Doing: 스스로 증인석에 입장
        → “객체를 생성하거나 계산을 하는 등의 스스로 하는 것
        → 하는 것에 대한 책임

  • 책임은 객체의 외부에 제공해 줄 수 있는 정보와 외부에 제공해 줄 수 있는 서비스의 모음
    → 책임은 객체의 공용 인터페이스

책임과 메시지

  • A객체(송신자) ⇒ B객체(수신자): 요청 전송
    요청 은 수신자의 책임이 수행되게 함
    → 이런 과정을 메시지 전송 이라 함

  • 책임의 수준 ≠ 메시지의 수준
    → 책임은 객체의 협력을 위해 수행해야 하는 것들을 개략적으로 서술한 것
    → 메시지는 이 책임을 필요한 여러 메시지로 분할해서 진행

객체지향 설계의 시작점

협력에 참여하기 위해
어떤 객체가 어떤 책임을 수행해야 하고
어떤 객체로부터 메시지를 수신할 것인지를 결정하는 것



역할

책임의 집합이 의미하는 것

  • 어떤 객체가 수행하는 책임의 집합 = 협력에서 해당 객체가 수행하는 역할

역할이 답이다

  • 모자 장수, 요리사, 앨리스가 증인으로 선택된 상황
    → 총 3 가지의 협력 상황
    → 모자 장수, 요리사, 앨리스를 증인 이라는 역할로 포괄한다면, 단일 협력 상황으로 추상화 가능

  • 추상화된 협력
    1. 누군가가 판사에게 재판을 요청
    2. 판사는 토끼에게 증인을 부를 것을 요청
    3. 판사의 요청을 받은 토끼는 증인에게 증인석으로 입장할 것을 요청
    4. 증인은 증인석에 입장하여 토끼의 요청에 응답
    5. 증인이 증인석에 입장함으로써, 토끼에 대한 판사의 요청에 대한 응답
    6. 판사증인에게 증언할 것을 요청
    7. 증인은 자신이 알고 있는 내용을 증언함으로써 판사의 요청에 응답

  • 역할을 대체할 수 있는 객체는 동일한 메시지를 이해할 수 있는 객체여야 함

  • 메시지가 책임을 의미함
    → 동일한 역할 수행 가능 = 동일한 책임의 집합 수행 가능
    → 동일한 역할 수행 가능 = 동일한 메시지를 수신할 수 있음
    → 동일한 역할 수행할 수 있는 객체들끼리 묶어서 추상화 가능

  • 추상화를 한다면 ( 역할을 부여한다면 )
    → 인지 과부화 줄일 수 있음 = 단순성, Simplicity
    → 협력이 유연해짐 = 유연성, Flexibility
    → 재사용성이 높아짐 = 재사용성, Reusability


협력의 추상화

  • 역할은 여러 객체가 협력에 참여 가능하게 하여 협력을 추상화 할 수 있게 함
  • 협력의 추상화는 협력의 개수를 줄이고, 협력에 참여하는 객체를 추상적인 역할로 대체

대체 가능성

  • 역할은 협력 안에서 구체적 객체로 대체 가능
    → 동일 역할이면, 다른 객체로 대체 가능
    → 동일 역할(동일한 책임의 집합)을 모두 수행할 수 있어야 함

  • 객체는 역할에 주어진 책임 이외에도 다른 책임을 수행할 수 있음
    역할이 암시하는 것 보다 더 많은 책임 가질 수 있음
    → 역할-객체 관계 = 일반화-특수화 관계



객체의 모양을 결정하는 협력

흔한 오류

객체에 대한 선입견

  • 객체의 존재 이유는 데이터를 저장하기 위해
    → 진짜 객체의 존재 이유는 협력에 참여하기 위해
    → 실제로 중요한 것은 객체의 행동(책임)
  • 객체지향이 클래스-클래스 간의 관계를 표현하는 정적인 측면에 집중
    → 객체지향은 협력에 중점을 두고, 객체는 협력에 참여할 때 동적임

협력을 따라 흐르는 객체의 책임

  • 객체를 설계하기 전에 올바른 협력을 설계해야 함
    설계에 참여하는 객체들이 주고받을 요청과 응답의 흐름을 설계해야 함

    1. 객체에게 책임을 할당 = 객체가 외부에 제공할 행동
    2. 해당 행동에 필요할 데이터 결정
    3. 클래스의 구현
  • 협력에 필요한 책임을 얼마나 합리적, 적절하게 설계했는지가 설계의 품질을 결정

협력을 가장 먼저 정의하자



객체지향 설계 기법

  • 책임-주도 설계
    → 책임들을 식별하고 책임을 할당

  • 디자인 패턴
    → 반복적으로 사용하는 해결 방법을 정의해 둔 템플릿

  • 테스트-주도 개발
    → 테스트를 먼저 작성하고 통과하는 것들만 코드로 작성


책임-주도 설계

  • 객체의 책임을 중심으로 시스템을 구축하는 방법
    → 시스템의 기능은 더 작은 책임으로 분할
    → 각 책임은 특정 객체에 할당
    → 특정 책임을 여러 객체가 수행할 수 있다면, 추상화

  • 시스템의 책임 ⇒ 객체의 책임으로 할당
    → 객체가 책임을 수행할 때, 협력자를 찾아 다른 책임을 할당

책임-주도 설계 정리

  • 시스템이 사용자에게 제공해야 하는 시스템 책임을 파악
  • 시스템 책임을 더 작은 책임으로 분할
  • 분할된 책임을 수행할 수 있는 적절한 객체 또는 역할을 찾아 할당
  • 객체가 책임을 수행하는 도중 도움이 필요하면 또 이 도움이라는 책임을 질 다른 객체를 찾음
  • 해당 객체에게 책임을 할당하고, 협력을 이룸

디자인 패턴

테스트-주도 개발



객체지향의 사실과 오해

profile
TIL을 기록하기 위한 게시글들 | 노션에 기록해 둔 것들 옮길 예정 !

0개의 댓글