반응형
Notice
Recent Posts
Recent Comments
Link
«   2026/01   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

지식조각모음

협력하는 객체들의 공동체 본문

책/객체지향의 사실과 오해

협력하는 객체들의 공동체

y00 2023. 8. 1. 17:15
반응형
  • ‘실세계의 모방’이라는 개념이 정말 객체지향을 설명 할 수 있는가?
    • 소프트웨어 객체와 실세계 사물 사이에 존재하는 연관성은 희미하다.
    • 객체와 현실 세계의 생명체는 아래와 같은 유사성이 있다.
      • 캡슐화
      • 자율성
      • 메시지를 주고 받는다
      • 공동의 목표를 달성하기 위해 협력한다.

 


 

협력하는 사람들

커피 공화국의 아침

    • 커피를 주문하는 과정
      • 손님이 커피를 주문한다
      • 캐시어가 주문을 받는다
      • 바리스타가 커피를 제조한다
      • -> 암묵적인 협력 관계가 존재한다
중요한 개념 세 가지: 역할, 책임, 협력


요청과 응답으로 구성된 협력

문제 해결을 위해 각 사람(객체)들은

  • 요청하고
  • 응답한다

이 과정을 ‘협력’이라고 한다

역할과 책임

  • 역할: 어떤 협력에 참여하는 특정한 사람이 협력 안에서 차지하는 책임이나 임무. 책임을 내포한다
  • 각자 역할을 맡고 있고 역할에 적합한 책임을 수행한다는 것은
    • 요청과 응답에 문제가 없다면 역할을 수행하는 것은 누가 되어도 상관 없다는 것이다
    • 책임을 수행하는 방법은 자율적으로 선택할 수 있다
      • 동일한 요청에 다른 방식으로 응답할 수 있다(다형성)
    • 한 사람이 동시에 여러 역할을 수행할 수 있다
      • 사실 이건 잘 이해가 가지 않는다. 그러면 SRP를 어기는게 아닐까?

 


 

역할, 책임, 협력

기능을 구현하기 위해 협력하는 객체들

  • 사람 -> 객체
  • 요청 -> 메시지
  • 책임 수행 방법 -> 메서드
약간 아쉬운 부분
사람은 특정 사람을 뜻할수도 있기 때문에 오히려 역할을 수행하는 대상의 범위가 좁아지는 느낌이다. 예를 들어 캐시어 A, B, C, 사장이 있다면 현실세계에 비유해서 상상해서 그런지 특정 A를 ‘사람’이라고 생각했고, 이걸 옮기다면 객체를 A라고 했을 것이다. 사실 캐시어를 담당할 수 있는 사람이라면 누구나 상관 없다. 그렇지만 그대로 옮겨서 구현한다면 Cacher a = new Cacher();로 구현해야 할 것이다. 사람이라는 말 대신 그냥 담당자라고 했으면 어떨까?

 


역할과 책임을 수행하며 협력하는 객체들

결론적으로 시스템은 역할과 책임을 수행하는 객체로 분할되고 시스템의 기능은 객체 간의 연쇄적인 요청과 응답의 흐름으로 구성된 협력으로 구현된다 (p. 30)

적절한 객체에게 적절한 책임을 할당해야 한다. 책임이 불분명한 객체는 애플리케이션의 미래 역시 불분명하게 만든다

 


 

협력 속에 사는 객체

객체

  • 객체: 실제로 협력에 참여하는 주체로 상태(state)와 행동(behavior)을 함께 지닌 실체
    • 행동을 해야 한다면 상태도 함께 지니고 있어야 한다.
    • 상태? 어떤 상태? 그걸 어떻게 가지고 있고 알수 있지?
  • 객체의 자율성: 객체의 내부와 외부를 명확하게 구분하는 것으로부터 나온다.
    • 자신의 행동을 스스로 결정하고 책임진다.
    • 내부: 객체 스스로 관리하고 외부에서 간섭할 수 없다.
    • 외부: 접근이 허락된 수단을 통해서만 의사소통해야 한다.
    • 무엇을 수행하는지는 알 수 있지만 어떻게 수행하는지에 대해서는 알 수 없다.
  • 전통적인 개발 방법과 객체지향의 차이: 데이터와 프로세스를 어떻게 분리하는가

협력과 메시지

  • 메시지: 요청하고 응답하는 방법. 객체들의 의사소통 수단
    • 어떤 메시지? 응답의 기준이 뭘까? void로 구현된 메서드는 응답하지 않는걸까?
  • 메세지를 전송하는 송신자와 수신하는 수신자로 나뉜다.

메서드와 자율성

  • 메서드: 객체가 수신된 메시지를 처리하는 방법
  • 어떤 메시지를 전송하면 메시지에 대응되는 특정 메서드가 실행된다.
    • 음 이건 메서드 호출이랑 다른 개념인가보네. 여태 그냥 메서드를 콜한다고 상상하고 있었는데….. 그럼 어떻게 메시지를 전송하지???
  • 메시지를 수신한 객체가 실행시간에 메서드를 선택할수 있다
  • 캡슐화: 외부의 요청이 무엇인지를 표현하는 메시지와 요청을 처리하기 위한 구체적인 방법인 메서드를 분리

 


 

객체지향을 설명할 때 현실세계에 대한 비유는 사실상 적절하지 않다. 하지만 그렇지만 이해하기 쉽기 때문에 이런 비유를 사용한다.
가장 중요한 개념은 역할, 책임, 협력이다. 객체도 사실 현실세계처럼 각자의 역할이 있으며 그 역할을 수행할 책임을 가진다. 그리고 이를 수행하기 위해 요청하고 응답하는 방식으로 협력하여 공동의 목표를 달성한다.

반응형

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

객체 지도  (0) 2023.09.06
책임과 메시지  (0) 2023.08.31
역할, 책임, 협력  (0) 2023.08.17
타입과 추상화  (0) 2023.08.14
이상한 나라의 객체  (0) 2023.08.08