[객체지향의 사실과 오해] 함께 모으기 -2

2025. 4. 12. 18:34·📚 개발자의 서재/객체지향의 사실과 오해
해당 포스팅은 조영호 작가님의  객체지향의 사실과 오해 (P.209~219)를 읽고 정리한 글입니다.

 

커피 전문점 도메인

커피 전문점이라는 세상

1. 객체 식별

커피 전문점 안에는 메뉴판이 존재한다. 객체지향의 관점에서 메뉴판은 하나의 객체다. 메뉴판은 메뉴 항목으로 구성되어 있는데 메뉴 항목들 역시 객체로 볼 수 있다.

 

손님은 메뉴판을 보고 바리스타에게 원하는 커피를 주문한다. 객체의 관점에서 보면 손님 역시 하나의 객체다. 

 

바리스타는 주문을 받은 메뉴에 따라 적절한 커피를 제조한다. 바리스타는 자율적으로 커피를 제조하는 객체로 볼 수 있으며, 바리스타가 제조하는 커피 역시 메뉴판, 메뉴 항목, 바리스타와 구별되는 자신만의 경계를 가지므로 객체로 볼 수 있다.

 

종합해 보면 객체지향의 관점에서 커피 전문점이라는 도메인은 손님 객체, 메뉴 항목 객체, 메뉴판 객체, 바리스타 객체, 커피 객체로 구성된 작은 세상이다.


2. 객체들 간의 관계 파악 

  • 손님은 메뉴판에서 주문할 커피를 선택할 수 있어야 한다 → 손님 - 메뉴판
  • 손님은 바리스타에게 주문을 해야 한다 → 손님 - 바리스타
  • 바리스타는 커피를 제조하는 사람이므로 당연히 자신이 만든 커피와 관계를 맺는다 → 바리스타 - 커피

2.1.  동적인 객체를 정적인 타입으로 추상화

  • 손님 객체 → 손님 타입
  • 바리스타 객체 → 바리스타 타입
  • 아메리카노, 에스프레소, 카라멜 마끼아또, 카푸치노 객체 → 커피 타입
  • 메뉴판 객체 → 메뉴판 타입
  • 네 개의 메뉴 항목 → 메뉴 항목 타입

 

메뉴 항목은 메뉴판에 포함되므로 포함 관계 또는 합성 관계를 가진다. 표시할 때는 메뉴판 타입에서 메뉴 항목 타입 쪽으로 향하는 선에 그려진 속이 찬 마름모로 나타낸다.

 

손님 타입은 메뉴판 타입을 알고 있어야 원하는 커피를 선택할 수 있다. 메뉴판 타입은 손님의 일부가 아니므로 이 관계는 합성 관계가 아니다. 이처럼 한 인스턴스가 다른 타입의 인스턴스를 포함하지 않지만 서로 알고 있어야 할 경우 이를 연관 관계라고 한다. 바리스타 타입은 커피를 제조해야 하므로 커피 타입을 알고 있어야 하므로 이 또한 연관 관계를 가진다.

 

이처럼 도출된 커피 제조와 관련된 객체들을 타입과 관계를 통해 추상화한 모델을 도메인 모델이라고 하며, 이는 소프트웨어가 대상으로 하는 영역인 도메인을 단순화하여 표현한 것이다.

 

도메인을 단순화해서 이해했으므로 이제 초점을 소프트웨어로 옮길 때다.


설계하고 구현하기

커피를 주문하기 위한 협력 찾기

객체지향의 설계의 첫 번째 목표는 훌륭한 객체를 설계하는 것이 아니라 훌륭한 협력을 설계하는 것이다. 협력을 설계할 때는 객체가 메시지를 선택하는 것이 아니라 메시지가 객체를 선택하게 된다. 즉, 메시지를 먼저 선택하고 그 후에 메시지를 수신하기에 적절한 객체를 선택해야 한다는 것을 의미한다.

 

메시지를 처리할 객체를 찾고 있다면 먼저 도메인 모델 안에 책임을 수행하기에 적절한 타입이 존재하는지 살펴봐야 한다.

 

메시지 책임을 수행할 적절한 객체
커피를 주문하라 손님
메뉴 항목을 찾아라 메뉴판 (메뉴 항목 반환)
커피를 제조하라 바리스타 (커피 반환)
커피를 생성하라 커피

 

현실 속에 메뉴판은 자기 스스로 메뉴 항목을 찾지 않고 커피가 스스로 생성되지 않는다. 하지만 객체지향의 세계에서는 모든 객체가 능동적이고 자율적인 존재다. 이렇기 때문에 소프트웨어의 객체는 현실 속의 객체를 모방하거나 추상화한 것이 아닌 단지 의미를 쉽게 유추할 수 있도록 '은유'할 뿐이다.

저작자표시 비영리 변경금지

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

[객체지향의 사실과 오해] 추상화 기법 -1  (0) 2025.04.14
[객체지향의 사실과 오해]함께 모으기 -3  (0) 2025.04.13
[객체지향의 사실과 오해] 함께 모으기 -1  (0) 2025.04.11
[객체지향의 사실과 오해] 객체 지도 -6  (0) 2025.04.11
[객체지향의 사실과 오해] 객체 지도 -5  (0) 2025.04.10
'📚 개발자의 서재/객체지향의 사실과 오해' 카테고리의 다른 글
  • [객체지향의 사실과 오해] 추상화 기법 -1
  • [객체지향의 사실과 오해]함께 모으기 -3
  • [객체지향의 사실과 오해] 함께 모으기 -1
  • [객체지향의 사실과 오해] 객체 지도 -6
l'avenirJun
l'avenirJun
  • l'avenirJun
    오늘도 꾸준히 개발
    l'avenirJun
  • 전체
    오늘
    어제
    • 분류 전체보기 N
      • 📚 개발자의 서재 N
        • 객체지향의 사실과 오해
        • Good Code, Bad Code
        • 도메인 주도 개발 시작하기 N
      • 🔧 트러블 슈팅
      • Java
      • Spring
      • 운영체제
        • 공룡책 학습
      • 알고리즘
      • GIT
      • 면접 지식
      • Spring 단기심화 2기
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    가독성
    코드트리
    specification
    인터페이스
    표현 영역
    코딩테스트
    메시지
    티스토리챌린지
    협력
    DIP
    도메인 모델
    추상화
    애그리거트 루트
    유스케이스
    책임-주도 설계
    타입
    객체
    오블완
    매핑 구현
    역할
    캡슐화
    good code bad code
    도메인 주도 개발 시작하기
    객체지향의 사실과 오해
    애그리거트
    리포지터리
    코딩트리조별과제
    모듈화
    코드 계약
    책임
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
l'avenirJun
[객체지향의 사실과 오해] 함께 모으기 -2
상단으로

티스토리툴바