GO SIWOO!

[객체지향의 사실과 오해] 1장 - 협력하는 객체들의 공동체 본문

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

[객체지향의 사실과 오해] 1장 - 협력하는 객체들의 공동체

gosiwoo 2023. 7. 24. 01:42

'객체지향 프로그래밍'이라는 과목을 수강한 적이 있다. 해당 과목에서는 클래스, 캡슐화, 추상화, 상속, 다형성 등등에 대해 배웠고 객체라는 단어의 의미를 배웠다. 

 

객체, 현실 세계에 존재하는 사물에 대한 추상화

객체는 현실 세계에 대한 투영이며 모방을 한다고 배웠다. 교수님 께서는 그에 대한 예로 자동차를 설명해 주셨던 기억이 있다. 실제 세계에서 차가 있고 이 차는 크게 보아 1개의 몸체, 4개의 휠, 타이어로 구성되어 있다. 이를 객체의 개념인 사물에 대한 추상화를 하면 Car라는 객체가 있고 이 Car에는 1개의 Body, 4개의 Wheel, Tire 등으로 구성이 되어있다고 할 수 있다.

 

하지만 이 책에서는 해당 개념, 현실 세계의 모방을 철학적인 개념을 설명하는 데에 적합하지만 실용적인 관점에서 객체지향 설계, 분석을 설명하는 데에는 적합하지 않다고 한다.

 

1장에서는 전통적인 객체 개념인 현실 세계의 모방에 대해서 한 카페로 예를 들어 설명한다.

 

#1. 카페로 보는 역할, 책임, 협력

카페에 세 종류의 사람이 있다.

손님, 캐셔, 바리스타, 이 셋은 각기 다른 역할과 책임을 지닌다.

손님 역할은 커피를 주문할 책임을 지닌다.

캐셔 역할은 손님에게 커피를 주문받고 바리스타에게 주문을 전달하는 책임을 지닌다.

바리스타 역할은 주문받은 커피를 만드는 책임을 지닌다.

위 셋 역할은 서로 요청과 응답을 주고받으며 협력하여 주어진 복잡한 문제를 해결할 수 있다.

 

 

 

#2. 협력

객체의 세계는 인간의 세계와 유사하다.

서로의 객체가 복잡한 문제를 수행하기 위해 연쇄적인 요청과 응답의 구성으로 이루어진 서로 간의 협력을 한다.

어떤 객체도 섬이 아니다.
by 워드 커닝험, 켄트 벡

#3. 책임

객체지향 설계는 적절한 객체에게 적절한 책임을 할당하는 것에서 시작된다.

책임은 객체지향 설계의 품질을 결정하는 가장 중요한 요소이다.

 

#4. 역할

역할은 관련성 높은 책임의 집합이고 다음과 같은 특징을 지닌다.

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

역할은 유연하고 재사용 가능한 협력 관계를 구축하는 데 중요한 설계 요소이다.

 

#5. 협력 속에 사는 객체가 가져야 할 2가지 덕목

첫째, 객체는 충분히 협력적이어야 한다.

객체는 다른 객체의 요청에 충실히 귀를 기울이고 다른 객체에게 적극적으로 도움과 요청을 주고받을 마음가짐을 지녀야 한다. 혼자서 모든 문제를 해결하는 god object는 너무 복잡해 자멸한다. 

둘째, 객체는 충분히 자율적이어어야 한다.

객체는 스스로가 요청에 응할지를 자율적으로 결정할 수 있어야 한다. 즉, 수동적인 객체이면 안된다.

 

#6. 자율적인 객체의 상태와 행동

객체는 상태(state)행동(behavior)을 함께 지닌 실체이다.

객체는 협력에 참여하기 위해 행동을 해야 한다면 상태를 지녀야 한다.

즉, 자율적인 존재로 객체가 남기위해서는 상태와 행동을 지녀야 한다.

예로 객체(바리스타)가 협력 속에 사는 객체가 되기 위해서 행동(커피 만들기)을 하는데 행동을 위한 상태(커피 만드는 법)를 모른다는건 말이 안된다.

 

  • 객체 - 바리스타
  • 행동 - 커피 만들기
  • 상태 - 커피 만드는 법

 

객체는 다른 객체가 무엇(what)을 하는지 알 수 있지만, 어떻게(how) 수행하는지는 알 수 없다.

예로 우리는 바리스타커피를 만드는지(what)을 알고 있지만 어떤 순서로 커피를 만드는지(how)를 알지 못한다.

 

#7. 협력과 메시지

객체지향의 세계에서 요청과 응답(협력)을 위한 의사소통 수단메시지라 부른다.

 

#8. 메서드와 자율성

객체가 메시지를 처리할 방법메서드라 부른다.

메시지와 메서드를 분리하는 것을 통해 객체의 자율성을 부여할 수 있다.

예로 바리스타(객체)에게 '커피를 만들어라' 라는 메시지를 보내면 바리스타는 '핸드 드립', '머신' 등등의 다양한 메서드를 통해 '커피를 만들어라' 라는 메시지를 처리할 수 있는 자율성을 줄 수 있다.

 

  • 객체 - 바리스타
  • 메시지 - 커피를 만들어라
  • 메서드 - 핸드 드립, 머신

 

#9. 객체지향의 개념 정리

  • 객체지향이란 시스템을 상호작용하는 자율적인 객체들의 공동체
  • 상태행동을 지니며 스스로 책임, 선택하는 객체가 자율적인 객체이다.
  • 객체는 행위를 위해 다른 객체와 협력한다. 각 객체는 협력을 위해 정해진 역할을 수행하며 역할은 관련된 책임의 집합이다.
  • 객체는 다른 객체와 메시지를 통해 협력하며 메시지를 처리하는 방법을 메서드를 통해 선택을 하며 이를통해 자율성을 부여받는다.
  • 클래스의 구조와 메서드가 아니라 객체의 역할, 책임, 협력에 집중하라.