본문 바로가기

개발일지

객체지향의 사실과 오해_1

협력하는 객체들의 공통체

객체지향의 목표는 실세계를 모방하는 것이 아니다

 

실세계의 모방이라는 개념은 훌륭한 프로그램을 설계, 구현하는 실무적 관점에선 부적합하다

하지만 실세계에 대한 비유는 객체지향의 다양한 측면을 이해, 학습하는 데에는 매우 효과적

객체지향에 담긴 기본 사상을 이해하기 까지만 잠시 대응해 보자.

일상 속 객체지향

커피를 주문하는 상황에서 찾아보자

손님

음료를 주문한다

캐셔

주문을 받는다

바리스타

커피를 만든다

여기서 손님, 캐셔, 바리스타는 역할이다

커피 주문이라는 협력에서, 각 역할에 책임을 다한다

역할은 어떤 협력에 참여하는 사람이 그 안에서 차지하는 책임, 의무를 의미한다

역할은 의미적으로 책임이라는 개념을 내포한다

특정한 역할을 수행하는 사람들은 역할에 적합한 책임을 수행하며

역할과 책임은 협력이 원활하게 진행되는데 필요한 핵심 요소다

 

객체는 협력을 위해 특정한 역할을 담당하고, 그 역할에 적합한 책임을 수행한다

 

여러 사람이 동일한 역할 수행 가능

  • 손님 입장에서, 어떤 캐셔가 주문을 받는지는 중요하지 않다

역할은 대체 가능해야 한다

  • 캐셔는 주문을 받고, 완성된 커피를 내어주는 책임을 이행하면 그만이다
  • 일하던 캐셔가 그만둬도, 캐셔를 새로 구하면 된다
  • 두 사람이 동일한 역할을 수행한다면 요청자 입장에서는 둘 중 아무나 역할을 수행해도 상관 없다

책임을 수행하는 방법은 자율적으로 선택할 수 있다

  • 바리스타는 커피를 자신만의 방식으로 다양하게 만들 수 있다(라떼아트 등)
  • 동일한 요청에 대해 서로 다른 방식으로 응답하는 것을 다형성으로 정의한다
  • 네트워크 요청에 대해 서로 다른 방식으로 응답하듯..

하나의 객체가 여러 역할을 수행할 수 있다

  • 캐셔가 커피를 만들 수 있다
시스템은 역할과 책임을 수행하는 객체로 분할되고,
시스템의 기능은 객체 간의 연쇄적인 요청과 응답의 흐름으로 구성된 협력이다

 

 

객체는 충분히 협력적일 것 다른 객체 요청에 충실히 귀 기울이고 다른 객체에게 적극적으로 도움을 요청해야 한다

객체는 스스로 판단하고 결정하여 자율적이어야 할 것 명령에 따라 움직이는 수동적인 존재를 의미하는 것은 아니다 어떤 방식으로 응답할 지는 스스로 행동하고 결정해야 한다

객체는 상태와 행동을 함께 지닌다 객체가 어떤 행동을 해야한다면, 그 행동을 하는데 필요한 상태도 지녀야 한다

다른 객체의 What(무엇)을 알고, How(어떻게)는 모른다

이는 객체마다 행동을 수행하는 방법을 스스로 결정하는 자율적인 존재임을 의미한다

메시지

객체지향 세계에서의 의사소통 수단이다.

인간들이 다양한 매커니즘으로 소통하듯,

객체지향에서는 메시지를 전송하는 송신자

메시지를 받는 수신자로 나뉜다

수신자는 수신된 메시지를 자신만의 방법인 메서드라는 방법으로 처리한다

예를 들어, 바리스타는 커피 제조라는 메시지에 응답하기 위해 자신만의 커피 제조 방법인 메서드를 사용한다

 

객체지향 프로그래밍의 핵심은, 메시지를 수신한 객체가 실행 시간에 메서드를 선택할 수 있다는 것

 

객체지향에 대한 사실

시스템은 자율적인 객체들의 공통체이다
자율적인 객체는 상태와 행위를 함께 가지며 자기 자신을 스스로 책임진다
객체는 행위를 구현하기 위해 협력하고, 협력 내에서 각 책임이 모여진 역할을 수행한다
메시지를 수신한 객체는 적합한 메서드를 자율적으로 선택한다

 

클래스는 객체를 만드는 데 필요한 구현 매커니즘일 뿐, 객체지향의 핵심이라고 오해하지 말자! 객체의 역할, 책임, 협력에 집중하는 것이 객체지향이다