02. 이상한 나라의 객체
작가가 말하는 객체란?
-> 하나의 개별적인 실체로 식별 가능한 물리적, 개념적인 사물은 모두 객체이다.
객체를 상태, 행동, 식별자를 지닌 실체로 바라보자.
객체의 행동 결과를 예상하기 위해, 상태라는 개념을 고안함.
행동의 결과를 모두 기억하고
이를 통해 다음 행동의 결과를 예측하려는 시도는 너무 번거롭다는 배경 속에서 탄생함.
- 특정 시점에 객체가 가지고 있는 정보의 집합으로 객체의 구조적 특징을 표현한다.
- 프로퍼티(property)
- 객체의 상태를 구성하는 모든 특징(ex. 키, 몸무게, 위치 정보 등)
- 프로터피는 정적이다(변경되지 않는다.)
- 프로퍼티 값(property value)
- 객체의 상태를 나타내는 값
- 프로퍼티 값은 동적이다(변경 가능하다.)
- 링크(link)
- 객체와 객체 사이의 의미 있는 연결
- 객체와 객체 사이에는 링크를 통해 메세지를 주고받을 수 있다.
- 상태는 외부에 숨겨져 있다. 상태의 변경 여부를 결정하는 것은 오직 객체 자신이기 때문이다.
다른 객체가 보낸 메세지를 해결하기 위해, 행동이라는 개념도 등장하게 되었다.
- 객체의 행동은 객체의 상태를 변경시킬 수 있다.
- 하지만 객체의 행동은 상태에 영향을 받는다.
- 행동의 결과로 다른 객체에게 메세지를 전달할 수 있다. 55p
- 객체는 행동을 통해 다른 객체와의 협력에 참여하므로 행동은 외부에 가시적이다.
상태를 외부에 노출시키지 않고, 행동을 경계로 캡슐화하는 노력은
객체의 자율성을 높일 수 있다.
객체를 서로 구별하기 위한 특정한 프로퍼티를 식별자 라고 한다.
- 모든 객체는 식별자를 가지지만, 객체가 아닌 단순한 값은 식별자를 가지지 않는다.
- 값(value)는 불변 상태를 가지며 동등성(equality) 비교를 통해 값들이 같은지 판별할 수 있다.
- 객체는 가변 상태를 가지며 동일성(identical) 검사를 통해 두 객체가 같은지 판별할 수 있다.
설계 시에는 행동에 초점을 두어라.
작가는 상태를 먼저 결정하고 행동을 나중에 결정하는 것은 객체지향의 관점에서 큰 실수라고 말한다.
나도 저렇게 설계했던 경험이 있다. 설계 과정에서 만들고자 하는 객체를 떠올리면서, 그 객체가 어떤 field를
가져야 하는지 먼저 고민했는데, 결과적으로 객체들 간에 협력이 잘 이루어지지 않았다.
상태에 초점을 둔 설계의 단점은,
1. 상태를 먼저 결정할 경우 캡슐화가 저해된다. 64p
2. 객체를 협력자가 아닌 고립된 섬으로 만든다.
3. 객체의 재사용성이 저하된다.
재사용성이란, 다양한 협력에 참여할 수 있는 능력에서 기인되기 때문이다.
결국 객체는 다른 객체와 협력하기 위해 존재하며, 객체가 협력에 참여하는 방법은 오직 행동 뿐이다.
다시 말해서, 어떤 책임이 필요한가를 결정하는 과정이 전체 설계를 주도해야 하며,
이를 책임-주도 설계(Responsibility-Driven Design, RDD)라고 한다.
다시 현실 세계와 객체지향의 이야기로 돌아와서..
현실 속의 객체와 소프트웨어 세계의 객체의 가장 큰 차이점이 하나 있다.
그것은 바로, 현실 속에서는 수동적인 객체들도 소프트웨어 상에서는 능동적으로 변한다는 것이다.
예를 들어, 사람 객체와 주스 객체가 있다고 가정해 보자.
현실 세계에서는 주스를 마실지 말지 결정하는 것과, 남은 주스의 양을 결정하는 결정권이 모두 사람에게 있다.
하지만, 소프트웨어 상에서의 객체는 주스를 마시려고 하는 사람 객체의 메세지에 대해
자신의 상태를 변경하는 것을 주스 객체가 능동적으로 결정할 수 있다.
이런 맥락에서 소프트웨어 객체는 현실 세계의 모방에 그치지 않고,
오히려 현실 객체가 갖지 못한 추가적인 능력을 보유하게 된다. 67p
이런 특징을 두고 레베카 워프스브룩은 이를 객체의 '의인화(anthropomorphism)' 라고 말했다.
결국 현실 세계와 객체 지향 사이의 관계는 은유(metaphor)라고 말하며 2장을 마무리한다.
2장을 읽고..
이번 2장을 읽고서, 객체지향과 현실 세계 사이의 차이를 보다 명쾌하게 알 수 있어서 속이 후련했다.
객체지향의 설계에서 상태가 초점이 아니라, 행동에 초점을 맞추어서 설계해야 함을 알게 되었다.
책임-주도 설계(RDD)라는 단어가 등장했다. 근래에 TDD, DDD 등 설계에 관한 많은 방법들을 들어본 적이 있는데
여러 방법론들도 구글링 해볼 생각이다.
'Books' 카테고리의 다른 글
객체지향의 사실과 오해 : 1장 (0) | 2022.08.02 |
---|