권예진
코딩 공부
권예진
전체 방문자
오늘
어제
  • 분류 전체보기 (57)
    • Git과GitHub (3)
    • 개발상식 (0)
    • Back-End (20)
      • JAVA (3)
      • Spring (2)
      • CI&CD (0)
      • 부스트코스 (15)
    • PS (20)
      • 백준 (20)
    • TIL (0)
    • 회고 (3)
      • 우아한테크코스 (3)
    • 개발 도서 (8)
      • 객체지향의 사실과 오해 (8)
      • 좋은 코드, 나쁜 코드 (0)
    • 일상 (2)
      • 내가 보려고 만든 맥북 꿀팁 (2)
    • etc (1)
      • C (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 우테코
  • 백엔드
  • Jacoco
  • github
  • 우아한테크코스5기
  • 백준
  • github-actions
  • 단계별로풀어보기
  • 스프링
  • 우테코5기
  • 자바
  • ps
  • 객체지향의사실과오해
  • 맥북
  • C언어
  • 스프링부트
  • 윤성우의열혈C프로그래밍
  • 독서
  • 프로젝트세팅
  • 부스트코스
  • git
  • 우아한테크코스

최근 댓글

최근 글

hELLO · Designed By 정상우.
권예진

코딩 공부

[객체지향의 사실과 오해] 04장 : 역할, 책임, 협력
개발 도서/객체지향의 사실과 오해

[객체지향의 사실과 오해] 04장 : 역할, 책임, 협력

2023. 3. 13. 09:51
반응형

협력

  • 중요도 : 개별 객체의 품질 < 여러 객체들이 모여 이뤄내는 협력의 품질
  • 어떤 협력에 참여하는지가 객체에 필요한 행동을 결정하고, 필요한 행동이 객체의 상태 결정
  • 협력은 다수의 연쇄적인 요청과 응답의 흐름으로 구성됨

 

책임

  • 객체에 의해 정의되는 응집도 있는 행위의 집합으로, 객체가 알아야 하는 정보와 객체가 수행할 수 있는 행위에 대해 서술한 문장
  • 객체가 '무엇을 알고 있는가(knowing)'와 '무엇을 할 수 있는가(doing)'으로 구성됨
    • 아는 것 (knowing) : 외부에 제공해줄 수 있는 정보
      • 개인적인 정보에 관해 아는 것
      • 관련된 객체에 대해 아는 것
      • 자신이 유도하거나 계산할 수 있는 것에 관해 아는 것
    • 하는 것 (doing) : 외부에 제공해 줄 수 있는 서비스
      • 객체를 생성하거나 계산을 하는 등의 스스로 하는 것
      • 다른 객체의 행동을 시작시키는 것
      • 다른 객체의 활동을 제어하고 조절하는 것
  • 책임은 객체의 공용 인터페이스 (public interface)를 구성 ⇒ 캡슐화 (공용 인터페이스에 대해서는 5장에 자세히 나옴)
  • 다른 객체로부터 요청이 전송됐을 경우에만 자신에게 주어진 책임 수행
    • 메시지 전송 : 책임을 수행하도록 요청을 보내는 것
    • 메시지 : 협력을 위해 한 객체가 다른 객체로 접근할 수 있는 유일한 방법

 

역할

  • 어떤 객체가 수행하는 책임의 집합
  • 역할을 이용해 협력을 추상화했기 때문에
    역할을 수행할 수 있는 어떤객체라도 협력에 참여할 수 있음 (동일한 메시지 수신 및 동일한 책임 수행 가능)
    ⇒ 설계의 단순성(simplicity) ↑, 협력의 유연성(flexibility) ↑, 재사용성(reusability) ↑
  • 협력의 추상화
    • 하나의 협력 안에 여러 종류의 객체가 참여 가능
    • 협력의 개수를 줄이고 구체적인 객체를 추상적인 역할로 대체함으로써 협력의 양상 단순화 가능
  • 대체 가능성
    • 역할 = 협력의 추상화 ⇒ 여러 객체가 동일한 책임 수행 가능 ⇒ 행위 호환성  ⇒ 역할 대체 가능

 

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

흔한 오류

  • 오류 1 : 시스템에 필요한 데이터를 저장하기 위해 객체가 존재한다.
    • 반박 : 데이터는 객체가 행위를 수행하는 데 필요한 재료일 뿐이고, 중요한 것은 객체의 행동 즉, 책임이다.
  • 오류 2: 객체지향이 클래스와 클래스 간의 관계를 표현하는 시스템의 정적인 측면에 중점을 둔다.
    • 반박 : 클래스는 단지 시스템에 필요한 객체를 표현하고 생성하기 위해 프로그래밍 언어가 제공하는 구현 메커니즘일 뿐이고,
               중요한 것은 객체가 협력 안에서 어떤 책임과 역할을 수행할 것인지를 결정하는 것이다.

 

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

  • 올바른 객체를 설계하는 방법
    1. 협력 설계
    2. 객체들이 주고받을 요청과 응답의 흐름(=책임) 결정
    3. 책임을 수행하는 데 필요한 객체 선택 & 객체에 책임 할당 (책임=행동)
    4. 행동을 수행하는 데 필요한 데이터 고민
    5. 클래스의 구현 방법 결정

 

객체지향 설계 기법

책임-주도 설계 (Responsibility-Driven Design)

  • 객체의 역할, 책임, 협력을 고안하기 위한 방법과 절차 제시
  • 협력에 필요한 책임들을 식별하고 적합한 객체에 책임을 할당하며 시스템을 구축하는 설계 방법
  • 시스템의 책임을 객체의 책임으로 변환하고,
    각 객체가 책임을 수행하는 중에 필요한 정보나 서비스를 제공해줄 협력자를 찾아
    해당 협력자에게 책임을 할당하는 순차적인 방식으로 객체들의 협력 공동체 구축
  • 객체지향 시스템을 설계하는 절차
    1. 시스템이 사용자에게 제공해야 하는 기능인 시스템 책임 파악
    2. 시스템 책임을 더 작은 책임으로 분할
    3. 분할된 책임을 수행할 수 있는 적절한 객체 또는 역할을 찾아 책임 할당
    4. 객체가 책임을 수행하는 중에 다른 객체의 도움이 필요한 경우 이를 책임질 적절한 객체 또는 역할 탐색
    5. 해당 객체 또는 역할에게 책임을 할당 (⇒ 두 객체가 협력하게 됨)

 

디자인 패턴 (Design Patter)

  • 책임-주도 설계의 결과물인 동시에 지름길 
  • 특정한 상황에서 설계를 돕기 위해 전문가들이 반복적으로 사용하는 해결 방법을 정의해 놓은 설계 템플릿 (역할, 책임, 협력)의 모음
  • 반복해서 일어나는 특정한 상황에서 어떤 설계가 왜 더 효과적인지에 대한 이유 설명

 

테스트-주도 개발 (Test-Driven Development)

  • 테스트를 먼저 작성하고 테스트를 통과하는 구체적인 코드를 추가하면서 애플리케이션을 완성해나가는 방식
  • 테스트 작성이 핵심이 아니고, 구체적인 코드를 작성해나가면서 역할•책임•협력이 적합한지를 피드백 받는 것이 목적
  • 테스트라는 안전장치를 통해 좀 더 빠르고 견고한 방법으로 책임-주도 설계의 목적지에 도달할 수 있게 해줌
  • 객체가 어떤 메시지를 수신할 때 어떤 객체와 협력하고 어떤 결과를 반환할 것인지에 대한 기대를 코드의 형태로 작성하는 것
  • 테스트-주도 개발의 흐름
    1. 실패하는 테스트 작성
    2. 테스트를 통과하는 가장 간단한 코드 작성 (중복이 있어도 무방)
    3. 리팩터링을 통해 중복 제거
  • 테스트-주도 개발을 통해 응집도가 높고 결합도가 낮은 클래스로 구성된, '깔끔한 코드'를 얻을 수 있음
반응형
저작자표시 (새창열림)

'개발 도서 > 객체지향의 사실과 오해' 카테고리의 다른 글

[객체지향의 사실과 오해] 06장 : 객체 지도  (0) 2023.03.31
[객체지향의 사실과 오해] 05장 : 책임과 메시지  (0) 2023.03.13
[객체지향의 사실과 오해] 03장 : 타입과 추상화  (0) 2023.03.13
[객체지향의 사실과 오해] 02장 : 이상한 나라의 객체  (0) 2023.03.13
[객체지향의 사실과 오해] 01장 : 협력하는 객체들의 공동체  (0) 2023.03.13
    '개발 도서/객체지향의 사실과 오해' 카테고리의 다른 글
    • [객체지향의 사실과 오해] 06장 : 객체 지도
    • [객체지향의 사실과 오해] 05장 : 책임과 메시지
    • [객체지향의 사실과 오해] 03장 : 타입과 추상화
    • [객체지향의 사실과 오해] 02장 : 이상한 나라의 객체
    권예진
    권예진

    티스토리툴바