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

객체지향의 사실과 오해 - 이상한 나라의 객체

devmomori 2022. 8. 17. 21:05

여러 개념들을 머릿속에서 잘 정립하지 않은 상태에서, 혹은 '개념을 정확히 이해하지 못한 채로 애플리케이션 설계를 하고 있지 않았나?' 반성해본다. 이전에는 뭉뚱그려서 자의적으로 해석했던 여러 개념들을 다시 한번 차곡차곡 정리할 수 있었다. 특히, 상태에 대한 개념과 애플리케이션 설계에서 행동을 중심으로 고민하고 프로그램을 설계해 나아가야 한다는 것이 굉장히 와닿았다. 같이 스터디를 한 친구들도 마찬가지인 것 같다. :) 잘못된 설계는 결국 많은 시간을 더 소요하도록 만드는데, 이런 가장 기본적인 개념이 설계를 함에 있어서 더 좋은 방향으로 가이드해주는 것이 아닐까?

들어가며,

물체가 여러 부분으로 구성되어 있더라도 함께 움직일 경우 그 물체를 하나의 유기적인 단위로 인식한다. 세상을 더 작은 객체로 분해하는 것은 본질적인고 세상이 포함하고 있는 복잡성을 극복하기 위한 인간의 작은 몸부림이다.

 

그러나 현실 세계와 소프트웨어 세계 사이의 유사성은 한계가 있다.

 

실행 중인 객체지향 애플리케이션의 내부를 들여다볼 수 있다면 겉으로는 우리가 알고 있는 세계와 유사해 보이지만 본질적으로는 이질적인 모습이 될 것이다.

 

앨리스 객체

책에서 이상한 나라의 앨리스 줄거리를 예시로 객체에 대해 설명

  • 문을 통과하기 위하여 자신의 키를 계속해서 변화 시킴
  • 결국 특정 시점의 앨리스의 상태란 특정 시점에서의 앨리스의 키를 의미
  • 키를 변화시킨 것은 앨리스의 행동
  • 앨리스의 행동에 따라 앨리스의 상태가 변화

 

즉, 어떤 행동의 성공 여부는 이전에 어떤 행동들이 발생했는지에 영향을 받는다.

 문을 통과하려면 음료나 케이크를 먹는 행동이 선행되어야 함

 

 

상태, 행동, 식별자

객체의 다양한 특성을 효과적으로 설명을 하기 위해서는 객체를 상태(state), 행동(behavior), 식별자(identity)를 지닌 실체로 보는것이 가장 효과적이다 - Booch 2007

 

모든 객체의 상태는 단순한 값과 객체의 조합으로 표현된다. 상태를 구성하는 모든 특징을 객체의 프로퍼티(property)라고 지칭한다. 객체와 객체 사이의 의미 있는 연결을 링크(link)라고 한다.

서로 연관이 있는 객체를 선으로 표시
변경된 상태로, 객체 간의 링크가 없을 때를 표현

 

이러한 링크는 객체가 다른 객체를 참조할 수 있다는 것을 의미하고, 한 객체가 다른 객체의 식별자를 알고 있는 것으로 표현된다.

 

더불어, 객체의 상태는 저절로 변경되지 않는다. 객체가 취하는 행동이 객체 자신의 상태를 변경시키며 이런 행동은 부수 효과(side effect)를 초래하는 것이다.

예시) 앨리스가 케이크를 먹음 -> 키를 작게 변화 -> 케이크의 양을 줄임

객체의 행동은 상태를 변경시키지만 행동의 결과는 객체의 상태에 의존적이다. 음료를 마신 후의 앨리스의 키는 마시기 전보다 작아야 한다.

 

 

상태를 이용하여 객체의 행동을 쉽고 우아하게 표현하기

[앨리스가 통과해야 하는 문의 크기는 40센티]

  • 앨리스의 키가 40센티미터 이하라면 문을 통과할 수 있음
  • 문을 통과한 이후에는 앨리스의 위치가 정원으로 바뀌어야 함

 

객체가 다른 객체는 메시지를 통해서만 의사소통할 수 있는 것을 기억하자. 객체가 어떤 행동을 하도록 만드는 것은 객체가 외부로부터 수신한 메시지다. 이를 통해 협력에 참여하고 상태를 변경한다. 객체의 행동을 통해 발생하는 결과는 두 가지 관점에서 설명이 가능하다

  • 객체 자신의 상태 변경
  • 행동 내에서 협력하는 다른 객체에 대한 메시지 전송

메시지를 통한 앨리스와 음료 사이의 협력 관계

메시지 송신자는 메시지 수신자의 상태 변경에 대해서는 전혀 알지 못한다. 이것이 캡슐화가 의미하는 것. 상태를 외부에 노출시키지 않고 행동을 경계로 캡슐화하는 것은 객체의 자율성을 높이고 각 객체 간의 협력이 유연해지고 간결해질 수 있다.

 

객체는 시간에 따라 변경되는 상태를 포함한다. 타입이 같은 두 객체의 상태가 완전히 똑같더라도 두 객체는 독립적인 별개의 객체이며, 이름이 같고 키가 동일한 두 사람이 함께 있다 하더라도 어떤 누구도 같은 사람이라고 생각하지 않는다.

 

행동이 상태를 결정한다.

상태를 먼저 결정하고 행동을 나중에 결정하는 방법은 설계에 나쁜 영향을 끼친다.

 

앨리스 객체 설계 시

  • 상태 (키, 장소)를 추가 후 -> 행동에 대해 고민 ( X )
  • 행동 -> 상태 ( O )

WHY?

  1. 캡슐화를 저해한다.
  2. 협력에 적합하지 못한 객체를 창조하게 된다. (상태를 먼저 고려한다는 것은 협력이라는 문맥에서 멀리 벗어난 채 객체를 설계하기 때문이다.)
  3. 재사용성이 저하된다.

 

은유와 객체

현실 속의 객체와 소프트웨어 객체 사이의 가장 큰 차이점은? 현실 속에서의 수동적인 존재가 소프트웨어 객체로 구현될 때는 능동적으로 변한다는 것이다. (의인화)

 

현실 속의 전화기는 스스로 전화를 걸 수 없지만, 우리가 알고 있는 전화기라는 개념을 이용해 소프트웨어 객체를 묘사하면 그 객체가 전화를 걸 수 있다는 사실을 쉽게 이해하고 기억할 수 있게 된다. (은유)