[Object-Oriented] 1장. 협력하는 객체들의 공동체

이성민·2024년 2월 23일
post-thumbnail

서론

“객체지향 소프트웨어는 실세계의 투영이며, 객체란 현실 세계에 존재하는 사물에 대한 추상화이다.”

하지만, 막상 찾아보면, 애플리케이션을 개발하며 실세계에 직접적으로 대응되는 사물을 발견하긴 힘들다.
즉, 소프트웨어 방화벽과, 실세계의 방화벽의 의미적 거리만큼, 소프트웨어와 실세계 사이에는 어느정도의 의미적 저리가 존재한다

하지만, 실세계의 모방이라는 객체지향의 개념은 실무적인 관점에서는 부적합하지만,
객체지향의 기본 사상을 이해하고 학습하기에는 효과적이다


협력하는 사람들

손님

  • 커피를 마시고 싶어서 커피를 캐시어에게 주문함

캐시어

  • 직장인에게 받은 커피 주문을 바리스타에게 전달함

바리스타

  • 캐시어에게 받은 커피를 자기 나름대로의 방법으로 제작함

‘커피 주문’이라는 협력에 참여하는 손님, 캐시어, 바리스타
주문된 커피가 손님에게 정확히 전달될 수 있도록 맡은 바 역할책임을 다하고 있음

이 역할, 책임, 협력이 객체지향의 핵심적인 3가지 요소

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

사람들은 스스로 해결하지 못하는 문제를 마주치면 이를 해결할 수 있는 사람에게 도움을 요청(request)한다

  • 손님캐시어 : 커피를 주문
  • 캐시어바리스타 : 커피를 제조하라

요청을 받은 사람은 주어진 책임을 다해 필요한 지식이나 서비스를 제공, 즉, 응답(response)한다

  • 바리스타캐시어 : 커피 완성
  • 캐시어손님 : 커피 완성

역할과 책임

사람들은 다른 사람과 협력하는 과정에서 특정한 역할을 부여받음

  • 손님 : 커피를 주문하는 역할
  • 캐시어 : 손님으로부터 커피를 주문받아야 함
  • 바리스타 : 주문된 커피를 제조해야 할 책임이 있음

즉, 역할에는 책임이 내포되어 있음

사람들이 협력을 위해 특정한 역할을 맡고 적합한 책임을 수행한다는 사실은 몇 가지 중요한 개념을 제시

  • 여러 사람이 동일한 역할을 수행할 수 있다
    (캐시어가 일을 그만둔다면, 다른 캐시어를 고용하면 됨)
  • 역할은 대체 가능성을 의미한다
    (손님 입장에서 커피를 받기 위해 어떤 캐시어에게 주문하든 상관 없음)
  • 책임을 수행하는 방법은 자율적으로 선택할 수 있다
    (바리스타가 커피를 핸드드립으로 내릴지, 커피머신으로 내릴지는 자율적으로 선택 가능)
  • 한 사람이 동시에 여러 역할을 수행할 수 있다
    (1인 카페와 같은 경우, 캐시어가 바리스타의 역할을 함께 수행할 수 있음)


역할, 책임, 협력

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

커피를 주문하고 제작해서 손님에게 전달하는 과정을 객체지향으로 돌려보자면,

사람 = 객체

요청 = 메시지

처리하는 방법 = 메서드

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

아리스토텔레스 왈 … “인간은 사회적 동물이다”

→ 하나의 목표를 이루기 위해 사람들협력한다
→ 하나의 목표에는 더 작은 책임으로 분할된다
→ 각 책임은 책임을 수행할 수 있는 적절한 역할을 가진 사람에 의해 수행된다
→ 협력에 참여하는 개인은 책임을 수행하기 위해 다른 사람에게 도움을 요청하기도 한다
→ 이런 연쇄적인 요청과 응답으로 구성되는 협력 관계가 완성된다

→ 하나의 어플리케이션을 위해 여러 객체협력한다
→ 하나의 어플리케이션은 더 작은 책임으로 분할된다
→ 각 책임은 책임을 수행할 수 있는 적절한 역할을 가진 객체에 의해 수행된다
→ 협력에 참여하는 객체는 책임을 수행하기 위해 다른 객체에 도움을 요청하기도 한다
→ 이런 연쇄적인 요청과 응답으로 구성되는 협력 관계가 완성된다

즉, 객체지향 설계는 적절한 객체에게 적절한 책임을 할당하는 것에서 시작되고,
이 책임은 객체지향 설계의 품질을 결정하는 가장 중요한 요소

따라서, 얼마나 적절한 책임을 선택하느냐가 어플리케이션의 아름다움을 결정

‘역할’은 관련성 높은 ‘책임’의 집합
객체의 ‘역할’은 다음과 같은 특징을 지님

  • 여러 객체가 동일한 역할을 수행할 수 있다
  • 역할은 대체 가능성을 의미한다
  • 각 객체는 책임을 수행하는 방법을 자율적으로 선택할 수 있다
  • 하나의 객체가 동시에 여러 역할을 수행할 수 있다

<협력하는 사람들>에서와 동일한 내용인걸로 보아
객체지향을 이해하기 위해, 실세계의 모방은 아주 뛰어난 방법 !


협력 속에 사는 객체

객체지향의 윤곽은 역할, 책임, 협력이지만, 이 협력에 참여하는 주체는 객체

어플리케이션의 핵심을 차지하는 객체가 가져야 할 두 가지 덕목

  • 협력적이어야 함
    → 다른 객체의 요청응답할지 말지, 응답한다면, 어떤 방식으로 응답할지, 객체 스스로 결정
  • 자율적이어야 함
    → ‘자기 스스로의 원칙에 따라 어떤 일을 하거나 자기 스스로를 통제하여 절제하는 것’

객체지향 설계의 묘미는 위 두 가지 덕목을 지키는 객체들의 공동체를 설계하는 데에 있음

상태와 행동을 함께 지닌 자율적인 객체

객체는 상태행동 을 함께 지닌 실체라고 정의함

즉, 객체가 협력에 참여하기 위해 어떤 행동을 한다면,
그 행동을 하는 데 필요한 상태도 함께 지니고 있어야 함

객체가 협력에 참여하는 과정에서 스스로 판단하고 결정하는 자율적인 존재이기 위해

객체의 자율성은 객체의 외부내부를 명확하게 구분하는 데에서 결정됨

  • 객체의 내부는 스스로 관리하고 외부에서 간섭할 수 없도록 차단해야 함
  • 객체의 외부에서는 접근이 허락된 수단을 통해서만 의사소통 해야 함

즉, 객체는 다른 객체가 ‘무엇’을 수행하는지는 알 수 있지만, ‘어떻게’ 수행하는지는 알 수 없어야 함

협력과 메시지

현실세계에서는 사람들 간의 의사소통 방식이 다양함
하지만, 객체지향에서 객체들 간의 유일한 의사소통 방법은 메시지

즉, 객체들은 메시지를 송신, 수신하며 협력해 나가는 존재들

  • 송신자 : 메시지를 전송하는 객체
  • 수신자 : 메시지를 수신하는 객체

메서드와 자율성

객체는 다른 객체에게 요청하기 위해 메시지를 전송
수신자 객체는 처리 여부에 대해 판단한 후, 자신만의 방법으로 자율적으로 처리

이 때 처리하는 방법을 메서드 라고 함

그리고, 메시지와, 메시지의 요청을 처리하기 위한 메서드를 분리하는 것이 객체의 자율성을 높이는 핵심 메커니즘


객체지향의 본질

불완전하고 부정확하긴 하지만, 나름의 객체지향의 개념을 포괄하는 내용들

  • 객체지향이란 시스템을 상호작용하는 자율적인 객체들의 공통체로 바라보고, 객체를 이용해 시스템을 분할하는 방법이다
  • 자율적인 객체란 상태행위를 함께 지니며 스스로 자기 자신을 책임지는 객체를 의미한다
  • 객체는 시스템의 행위를 구현하기 위해 다른 객체와 협력하고, 각 객체는 협력 내에서 정해진 역할을 수행하며 역할은 관련된 책임의 집합이다
  • 객체는 다른 객체와 협력하기 위해 메시지를 전송하고, 메시지를 수신한 객체는 메시지를 처리하는 데 적합한 메서드를 자율적으로 선택한다

객체를 지향하라

객체지향에서 핵심은 ‘클래스’가 아니라,
적절한 책임을 수행한느 역할 간의 유연하고 견고한 협력 관계를 구축하는 것이다


객체지향의 사실과 오해

profile
TIL을 기록하기 위한 게시글들 | 노션에 기록해 둔 것들 옮길 예정 !

0개의 댓글