본문 바로가기
도서/프로그래밍

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

by 신발사야지 2023. 12. 27.

 

 

객체지향 패러다임은 지식을 추상화하고 추상화한 지식을 객체 안에 캡슐화함으로써 실세계 문제에 내재된 복잡성을 관리하려고 한다. 객체를 발견하고 창조하는 것은 지식과 행동을 구조화하는 문제다.
-레베카 워프스브록(Rebecca Wirfs-Borck)[Wirts-Brock 1990]

 

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

상태

이상한 나라의 엘리스에서 엘리스는 작은 문을 통과하기 위해 특정 행동을 통해서 몸의 키를 늘리거나 줄인다. 부채질을 하면 키가 20cm 작아지고, 차를 마시면 30cm 커지는 등의 상태 변경이 일어난다. 엘리스의 키를 추정하기 위해서는 이러한 행동의 순서를 모두 기억하고 있다가 이 행동의 순서를 통해서 계산해낼 수 있다. (초기값 - 20 - 20 + 30 …) 그러나 우리는 이렇게 프로그램을 만들지 않는다. 엘리스 객체에게 ‘키’라는 프로퍼티를 설정하고 행위에 따라서 이 값을 변경 시키는 방법을 사용할 것이다. 앨리스 객체의 상태를 나타내는데는 키와 같은 수치가 사용될 수 있고 이름 같은 문자열이 사용될 수 있다. 또는 다른 객체를 통해서 엘리스의 상태를 표시할 수도 있다. 예를 들어서 엘리스가 가지고 있는 음료수를 탄산수 객체를 통해 링크할 수 있다. 값으로 표시되는 상태를 속성(attribute)라고 하고 객체 프로퍼티는 링크라고 한다.

행동

객체의 상태는 저절로 변경되지 않는다. 객체의 상태를 변경하는 것은 객체의 자발적인 행동뿐이다. 객체의 행동에 의해 다른 객체의 상태가 변경되는 것은 부수 효과(side effect)를 초래한 것이다.

협력과 행동

어떤 객체도 섬이다. 어떤 객체도 노예가 아니다. 자신의 상태를 변경 시킬 수 있는 것은 자신 뿐이다.

이를 캡슐화라고 한다. 현실세계는 음료수는 수동적인 존재이지만 객체지향에서의 음료 객체는 능동적으로 자신의 양을 변경한다. 엘리스 객체와 음료 객체는 협력하는 관계이다.

식별자

식별자란 값이 아니라 객체를 구분할 수 있는 고유한 것이다. 상태는 변경 가능하기 때문에 동등성(값이 같음)을 가질 수 있다. 하지만 고유한 같음을 나타내는 동일성은 식별자를 통해서만 구분할 수 있다.

기계로서의 객체

객체지향의 세계를 창조하는 개발자들의 주된 업무는 객체의 상태를 조회(query)하고 객체의 상태를 변경(command)하는 것이다.

행동이 상태를 결정한다

객체지향에 갓 입문한 사람들이 가장 쉽게 빠지는 함정은 상태를 중심으로 객체를 바라보는 것이다.

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

  1. 상태를 먼저 결정할 경우 캡슐화가 저해된다. 상태에 초점을 맞출 경우 상태가 객체 내부로 깔끔하게 캡슐화되지 못하고 공용 인터페이스에 그대로 노출되버릴 확률이 높아진다.
  2. 객체를 협력자가 아닌 고립된 섬으로 만든다.
  3. 객체의 재사용성이 저하된다.

객체는 다른 객체와 협력하기 위해 존재한다. 객체의 행동은 객체가 협력에 참여하는 유일한 방법이다.

은유와 객체

객체지향이란 현실 세계의 모방이라는 것은 잘못된 생각이다.

실제 객체지향의 객체들은 현실과 다르게 능동적이다.

현실에서는 트럼프 카드는 수동적인 존재이지만 객체지향 세계에서는 스스로 섞이고 스스로 패를 나눠주는 능동적인 존재가 된다.

레베카 워프스브록은 현실의 객체보다 더 많은 일을 할 수 있는 소프트웨어 객체의 특징을 의인화(anthropomorphism)라고 부른다.

은유

차라리 현실세계를 은유적으로 객체로 표현하는 것은 다른 사람이 그 객체지향 세계를 이해하는데 도움을 줄 수 있다. 전화기 객체를 만든다면, 이 객체는 현실세계와 다르게 다른 사람에게 스스로 전화를 걸지만, 이 객체가 전화를 건다는 행위를 한다는 것을 은유적으로 쉽게 이해시키고 기억할 수 있게 한다.

바로 이러한 이유로 모든 객체지향 지침서에서는 현실 세계인 도메인에서 사용되는 이름을 객체에게 부여하라고 가이드하는 것이다.

이상한 나라를 창조하라

객체지향 설계자로서 우리의 목적은 현실을 모방하는 것이 아니다. 단지 이상한 나라를 창조하기만 하면 된다. 현실을 닮아야 한다는 어떤 제약이나 구속도 없다. 여러분이 창조한 객체의 특성을 상기시킬 수 있다면 현실 속의 객체의 이름을 이용해 객체를 묘사해라. 그렇지 않다면 자유롭게 여러분만의 새로운 세계를 창조하기 바란다. 엘리스를 매혹시킨 이상한 나라가 그런 것처럼 말이다.