카테고리 없음

객체지향의 사실과 오해 (협력하는 객체들)

혹등고래1호기 2023. 6. 27. 21:29
객체지향의 목표는 실세계를 모방하는 것이 아니다. 
오히려 새로운 세계를 창조하는 것이다.

 

01. 협력하는 객체들의 공동체 

객체지향에 대한 오해

 

흔히들 객체지향을 현실 속에 존재하는 사물을 최대한 유사하게 모방해 소프트웨어 내부로 옮겨오는 작업으로 여겨 객체란 현실 세계에 존재하는 사물에 대한 추상화라고 생각하는 사람들이 많을 것이다. 하지만 이는 객체지향의 철학적인 개념을 설명하는 데는 적합하지만 실용적인 관점에서는 적합하지 않다. 실세계에서는 메뉴판은 그저 메뉴가 적혀 있는 것에 불과하지만 객체지향의 세계에서는 생명을 가진 생명체 처럼 자기 스스로 메뉴 항목을 찾을 수도 있다. 사실상 소프트웨어 객체와 실세계 사물 사이에 존재하는 연관성은 희미하다고 할 수 있다. 

 

 

객체의 역할과 책임 

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

 

객체의 역할, 책임, 협력

객체는 애플리케이션의 기능을 구현하기 위해 존재한다. 아주 작은 기능 조차 객체 혼자 감당하기에는 버거울 정도로 복잡하고 거대하기 때문에 일반적으로 객체는 다른 객체와의 협력을 통해 기능을 구현한다. 

 

협력 공동체의 일원으로 객체는 "두 가지" 의 덕목을 가져야 한다. 

 

1. 객체는 충분히 협력적이여야 한다.

 

객체는 다른 객체에게 적극적으로 도움을 요청할 정도로 열린 마음을 지녀야 한다. 외부의 도움을 무시한채 모든 것을 스스로 처리하려는 전지전능한 객체는 내부에서 자멸해버리고 만다.  결국 객체는 수동적인 존재가 아니다. 다른 객체의 명령에 복종하는 것이 아니라 요청에 응답할 뿐이다. 요청에 대해 응답을 할 지도 객체 스스로 결정할 수 있다.

 

2. 객체는 충분히 자율적이여야 한다. 

 

앞서 첫번째 덕목에서 알 수 있듯이 객체는 수동적인 존재가 아니다. 자기 스스로 원칙에 따라 어떤 일을 하거나 자신을 통제할 수 있는 "자율적" 존재라는 것이다. 

캐시어는 손님이 주문하면 행동을 시작하지만 손님에게 음료를 주문하는 절차나 바리스타에게 접수 내역을 전달하는 방법은 
스스로 결정한다. 손님이 캐시어에게 어떤 질문을 해야 하고 어떤 방식으로 바리스타에게 주문 내역을 전달하라고 하지 않는다. 캐시어는 요청에 대해 스스로 판단하고 행동하는 자율적인 존재이다.

 

 

 

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

 

객체를 상태와 행동을 가진 실체라고 정의한다. 이는 객체가 협력에 참여하기 위해서는 어떤 행동을 해야 한다면 그 행동을 하기 위해 필요한 상태와 행동을 가지고 있어야 한다는 것이다. 바리스타가 커피를 제조하는 법을 모르는 것이 말이 안되는 것처럼 객체도 어떤 행동을 하기 위헤 필요한 상태를 알지 못하는 것은 말이 안된다.

 

객체의 자율성은 객체의 내부와 외부를 명확하게 구분하는 것으로 부터 나온다. 객체의 사적인 부분은 객체 스스로 관리하고 외부에서 일체 간섭할 수 없도록 해야한다. 객체는 다른 객체가(무엇)을 수행하는지는 알 수 있지만 어떻게(how)수행하는 것에 대해서는 알 수 없다(캡슐화)

 

메서드와 자율성 

객체는 다른 객체와 협력하기 위해 메시지를 전송한다. 그리고 객체가 수신된 메시지를 처리하는 방법을 메소서드라고 부른다.

 

커피를 주문을 했을 때 바리스타가 수작업으로 커피를 내리든 커피머신을 이용해서 내리 든 그것은 바리스타의 마음이다. 
즉 커피를 주문하는 것이 메시지이고 커피를 제조하는 것은 메서드라고 할 수 있다. 

 

바리스타가 커피를 어떻게 제조를 하든 간섭하지 않는다. 커피 제조라는 메시지에 응답하기 위해 자율적으로 커피를 만들 수 있다. 이처럼 메시지와 메시지의 처리 방법(method)는 분리하는 것이 객체의 자율성을 높이는 핵심이라고 할 수 있다. 

 

이는 객체지향의 캡슐화와 깊은 연관이 있다.