Code/OOP

[오브젝트] 3. 역할, 책임, 협력

noahkim_ 2025. 4. 3. 15:27

조영호 님의 "오브젝트" 책을 정리한 글입니다.


1. 협력

영화 예매 시스템 돌아보기

  • 기능을 완성하기 위해 다앙한 객체들이 메시지를 주고받으면서 상호작용함

 

협력

  • 애플리케이션이 기능을 구현하기 위해 객체 간의 상호작용을 수행하는 과정
요소 설명
메시지 전송 객체 간 협력을 위한 커뮤니케이션 수단
메서드 객체가 메시지를 수신하면 실행하여 요청에 응답
캡슐화
객체가 자율적으로 작업을 수행하기 위해 내부 구현을 숨김

 

객체의 역할
개념 설명
책임 객체가 협력에 참여하기 위해 수행하는 행동
역할 객체들이 협력 안에서 수행하는 책임들의 집합

 

협력이 설계를 위한 문맥을 결정한다

객체의 상태와 행동을 어떤 기준으로 결정해야 하는가?
요소 설명
행동 객체가 참여하는 협력에 의해 결정됨 (객체가 필요한 이유와 행동의 동기를 제공)
상태 객체의 행동 수행에 필요한 정보에 따라 결정됨 (행동이 상태를 정의함)
  • 즉, 협력은 객체를 설계하는데 필요한 문맥을 제공함

 

2. 책임

책임이란 무엇인가

  • 객체가 협력에 참여하기 위해 수행하는 행동

 

책임 할당

객체지향에서 가장 중요한 요소
  • 책임을 적절하게 할당하는 것이 설계의 전체적인 품질을 결정함

 

정보 전문가 패턴
  • 책임을 수행하는데 필요한 정보를 가장 잘 알고 있는 전문가에게 맡기는 것
  • 올바른 책임 할당을 위해 협력의 문맥을 먼저 정의해야 함

 

책임 주도 설계

  • 책임을 찾고 책임을 수행할 적절한 객체를 찾아 책임을 할당하는 방식으로 협력을 설계하는 방법

 

과정
  1. 시스템이 사용자에게 제공하는 기능을 시스템이 담당할 하나의 책임으로 두기
  2. 해당 책임을 더 작은 책임으로 분해하고 적절한 객체에게 할당
    • 단, 모든 책임 할당과정이 해당 정보 전문가에게 할당되지 않음
    • 결합도, 응집도 측면에서 다른 객체에 책임을 할당하는 경우가 더 적절한 경우도 있음
  3. 협력에 참여할 정보전문가 객체간의 인터페이스 구성
    • 시스템의 최종적인 결과물은 인터페이스와 오퍼레이션 목록

 

메시지가 객체를 결정한다

  • 책임을 할당하는데 먼저 필요한 메시지부터 식별하기
  • 메시지를 처리할 객체를 나중에 선택
  • 즉, 메시지가 객체를 선택해야 함

 

장점
장점 설명
최소한의 인터페이스 유지 객체가 꼭 필요한 메시지만 가지게 됨
추상적인 인터페이스 구성 가능
"어떻게"가 아니라 "무엇을 수행할지"에 초점을 맞춤
(무엇을 수행할지에 초점을 맞출 수 있음)
유연한 설계 가능 객체 설계를 유연하게 하여 유지보수가 쉬워짐

 

행동이 상태를 결정한다

구분 데이터 주도 설계 (Data-Driven Design)
책임 주도 설계 (Responsibility-Driven Design)
초점 객체의 상태에 집중 객체의 행동(책임) 에 집중
설계 방식 상태를 먼저 정의하고 필요한 행동을 결정 협력을 고려하면서 객체의 책임을 먼저 정의
캡슐화 저하됨 (내부 구현이 인터페이스에 노출)
강화됨 (구현을 감추고 메시지를 중심으로 설계)
변경의 전파 내부 상태 변경 시 인터페이스도 변경됨 → 유지보수 어려움
구현을 뒤로 미루고 협력을 먼저 고려 → 유연한 설계 가능
객체 설계 접근법 데이터를 중심으로 설계 객체 간 협력을 중심으로 설계

 

3. 역할

역할과 협력

  • 역할: 객체가 어떤 특정한 협력 안에서 수행하는 책임의 집합
  • 협력 모델링: 특정한 객체가 아니라 역할에게 책임을 할당한다고 생각하는게 좋음

 

유연하고 재사용 가능한 협력

역할을 활용한 협력
개념 설명
유연성과 재사용성 확보
역할을 정의하면 객체를 변경하지 않고 협력을 확장 가능
역할을 중심으로 협력 구성
메시지에 응답할 수 있는 대표자를 고려하면 협력을 통합할 수 있음
추상화 활용
역할이 서로 다른 구체적인 객체들을 포괄하여 코드 중복 제거
유연한 협력 가능
새로운 협력을 추가하지 않고도 객체만 추가하면 확장 가능

 

객체 대 역할

구분 객체 (Object) 역할 (Role)
정의 특정 책임을 수행하는 하나의 실체 책임을 수행할 수 있는 자리
(어떤 객체든 이 역할을 수행할 수 있으면 그 자리에 들어갈 수 있음)
사용 조건 협력에서 한 종류의 객체만 참여할 경우 협력에서 여러 종류의 객체가 참여할 경우
유연성 특정 객체에 고정됨 다양한 객체가 역할을 수행할 수 있어 확장 가능
예시 "User" 객체가 로그인 기능 수행 "로그인 가능한 역할"을 여러 객체가 수행 (ex. User, Admin)

 

역할과 추상화

배우와 배역