본문 바로가기

개발 관련 지식

객체지향의 사실과 오해 정리 - 4장. 역할, 책임, 협력

객체지향에 처음 입문하면 대부분 이렇게 시작한다.
“이 클래스는 어떤 속성과 메서드를 가져야 하지?”

틀렸다.

객체지향 설계의 출발점은 개별 객체가 아니다.
여러 객체가 모여 만들어내는 협력이 먼저다.

비록 어떤 객체가 겉보기엔 다소 기묘하거나 비합리적으로 보일지라도,
전체 협력의 맥락 속에서는 꼭 필요한 존재일 수 있다.


협력: 요청과 응답의 흐름

객체지향에서 협력이란, 객체들 사이에서 발생하는 요청과 응답의 연쇄 흐름이다.

예를 들어보자.

  • 고객이 음식을 주문한다 → 서버 객체가 요리사 객체에게 요청한다
  • 요리사가 요리를 만든다 → 다시 서버에게 전달한다
  • 서버는 고객에게 요리를 서빙한다

이처럼 협력은 하나의 기능이 여러 객체를 통해 분산되어 수행되는 과정이다.


책임: “이 요청, 누가 처리할 건가?”

객체는 협력 과정에서 요청을 수신하고,
그 요청을 적절히 처리할 수 있는 지식과 행동을 가질 때 책임을 가진다고 한다.

책임은 두 가지로 나뉜다.

📌 Doing (하는 것)

  • 계산을 수행하거나 값을 만든다
  • 다른 객체의 동작을 유도한다
  • 객체들 사이의 흐름을 조율한다

📌 Knowing (아는 것)

  • 자신의 속성 값
  • 관련된 객체에 대한 정보
  • 파생되거나 계산 가능한 정보

이러한 책임들은 객체의 public interface를 구성한다.
즉, 외부에 공개되는 기능의 목록이자 약속이다.


메시지: 협력을 위한 유일한 수단

객체 간 협력은 메시지 전송을 통해 이루어진다.

  • 요청하는 객체: 송신자
  • 응답하는 객체: 수신자

객체는 메시지를 수신함으로써 협력에 참여하고,
메시지 전송은 객체가 객체에게 말을 거는 유일한 방식이다.


역할: 추상화된 협력자

역할은 협력 안에서 특정 책임들을 수행할 수 있는 추상적 개념이다.

예를 들어, ‘결제 처리자’라는 역할은
신용카드 객체, 페이팔 객체 등 다양한 구현체로 대체될 수 있다.

 

역할이 유용한 이유는 다음과 같다.

  • 유사한 협력 구조를 추상화하여 재사용 가능
  • 복잡한 객체 관계를 단순하게 표현
  • 협력의 유연성과 확장성 확보

💡 오해 금지
하나의 객체가 단 하나의 역할만 수행하는 것은 아니다.
예: GPT는 ‘문서 작성자’, ‘편집자’, ‘조언자’ 역할을 동시에 수행할 수 있다.


설계는 협력, 책임, 메시지에서 시작한다

객체지향 설계에 처음 접근할 때 흔히 묻는다.
“어떤 클래스를 먼저 만들까?”
또는
“데이터를 담기 위해 객체가 필요하다”고 생각한다.

이건 출발부터 잘못된 방향이다.

진짜 중요한 질문은 이것이다.

"이 협력을 위해 어떤 객체가 어떤 책임과 역할을 맡아야 하는가?"

클래스나 상태는 그 다음 문제다.
책임과 역할이 자리를 잡고 나면, 구현은 비교적 단순해진다.


설계 절차 요약

  1. 협력 설계
    시스템이 수행해야 할 기능을,
    역할들 사이의 요청과 응답 흐름으로 표현한다.
    → 이 흐름이 곧 객체가 맡게 될 책임이다.
  2. 책임 할당
    역할을 맡을 적절한 객체들을 선택한다.
  3. 행동 정의
    메시지 흐름 안에서 객체가 수행해야 할 행동을 결정한다.
  4. 데이터 결정
    객체가 행동을 수행하고 협력에 참여하기 위해
    반드시 알고 있어야 할 정보(상태)를 정한다.
  5. 구현 설계
    마지막으로 이 모든 요소를 표현할 클래스와 메서드 구조를 결정한다.

역할-책임-협력 관점에서 유용한 3가지 기법

  1. RDD (Responsibility-Driven Design)
    협력에 필요한 책임을 먼저 식별하고,
    그 책임을 맡을 적절한 객체에게 분배하는 방식
  2. 디자인 패턴
    반복적으로 나타나는 문제를 해결하기 위한,
    전문가들의 검증된 설계 템플릿
  3. TDD (Test-Driven Development)
    테스트 코드를 먼저 작성하면서,
    점진적으로 역할과 책임을 구체화하고
    그것이 적절한지를 즉시 피드백 받는 방식

 

※ 본 글은 『객체지향의 사실과 오해』(조영호 저) 4장을 기반으로 학습 목적으로 요약한 글입니다.

※ 이 글은 책의 내용을 요약한 것으로, 원문 없이 읽을 경우 오해의 여지가 있을 수 있습니다. 정확한 이해를 위해 원서의 정독을 권장합니다.