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

주영진·2024년 5월 4일

객체지향과 인지능력

우리의 일상생활 속에서 우리는 어렵지 않게 객체를 구별해낼 수 있다. 그 이유는 인간은 본능적으로 세상을 독립적이고 식별 가능한 객체의 집합으로 바라보기 때문이다. 이것은 우리가 객체지향을 바라보는 기본적인 시선이 될 수 있다.

실생활에서 인간이 직접적으로 지각할 수 있는 대부분의 객체는 물리적인 사물이다. 하지만 단순히 물리적인 객체 뿐만이 아니라, 인간의 인지능력은 개념적으로 경계 지을 수 있는 추상적인 사물까지도 객체로 인식한다. 예를 들어, 주문과 계좌 이체는 물리적인 실체는 존재하지 않지만 인간이 구분해낼 수 있는 개념적인 객체의 일종이다.

즉 객체란, 인간이 분명하게 인지하고 구별할 수 있는 물리적인 개념 또는 개념적인 경계를 지닌 어떤 것이다.

이상한 객체의 나라

객체지향의 세계는 현실세계를 '모방'한다고 하지만, 이는 자칫 객체지향을 오해할 수 있는 위험한 생각이 될 수 있다. 객체지향의 세계를 이 책은 <이상한 나라의 앨리스>라는 유명한 소설의 줄거리를 예로 들어 설명하고 있다.

앨리스는 아름다운 정원으로 들어가기 위해 자신의 몸을 줄여 이상한 나라로 들어간다. 앨리스는 정원으로 들어가는 문을 통과하기 위해 적절한 '상태'로 자신의 키를 변화시킨다.이러한 상태를 결정하는 것은 '행동'이지만, 행동의 결과를 결정하는 것은 '상태'이다. 즉, 앨리스가 한 행동의 결과는 앨리스의 상태에 의존적이다.

앨리스를 하나의 객체라고 인식하면, 객체의 다양한 특성을 효과적으로 이해하는데 도움이 된다. 객체는 상태(state), 행동(behavior), 식별자(identity)를 지닌 실체로 말할 수 있다.

상태

상태를 이용하면 과거의 모든 행동 이력을 설명하지 않고도 행동의 결과를 쉽게 예측하고 설명할 수 있다. 비행기 탑승여부를 항공권 발권 상태를 통해 판단하고, 자판기가 현재까지 투입된 금액의 상태를 기억한다. 이처럼 상태는 근본적으로 세상의 복잡성을 완화하고 인지 과부화를 줄일 수 있는 중요한 개념이다.

앨리스의 이야기에서 객체로 간주할 수 없는, '상태'로 보아야 하는 몇 가지 것들이 있다. 앨리스의 '키'나 '위치', 음료나 케이크의 '양'은 객체가 아닌 상태로 보아야 한다. 이러한 상태는 단순한 값이나 참/거짓으로 표현할 수 있는데, 결론적으로 객체의 상태는 단순한 값과 객체의 조합으로 표현할 수 있다. 다음 그림이 앨리스와 음료 객체와 그 상태를 나타내고 있다.

여기서 중요한 점은, 객체는 자율적인 존재라는 것이다. 객체지향의 세계에서, 객체는 다른 객체의 상태에 직접적으로 접근하거나, 상태를 변경할 수도 없다. 모든 객체는 스스로의 행동에 의해서만 상태가 변경되는 것을 보장함으로써 객체의 자율성을 유지한다.

행동

결국 객체의 상태를 변경시킬 수 있는 것은 객체의 자발적인 행동뿐이다. 이러한 객체의 행동은 '상태'를 변화시키기 때문에, 상태의 영향을 받는다.

객체는 주어진 책임을 완수하기 위해 다른 객체를 이용하고, 협력한다. 객체와 협력하는 유일한 방법은 요청을 보내는 것이다. 오직 메시지를 통해서만 객체끼리 의사소통을 할 수 있고, 이 과정에서 객체는 자기 자신뿐 아니라 다른 객체의 상태를 변화시킬 수 도 있다.

하지만 이런 메시지를 수신하는 과정에서, 그 메시지를 받아들이고 그 메시지대로 행동하는 것은 그 객체의 몫이다. 앞서 말했듯이 객체는 자신 스스로의 상태를 관리하는 자율적이 존재이므로 메시지를 보낸다고 해서 다른 객체의 상태를 직접적으로 변경시킬 수는 없다.

이 그림은 앨리스가 음료를 마시는 과정에서 나타나는 앨리스와 음료 사이의 협력관계에 대한 그림이다. 앨리스는 음료를 마셨으니 음료의 양을 줄여달라는 요청을 전달할 뿐, 그 요청을 받고 음료의 양을 줄일지는 음료 객체의 자율적인 결정에 달려있다.

캡슐화 & 식별자

'캡슐화'는 객체지향에서 굉장히 중요한 개념이다. 앞서 언급한 그림으로 설명하자면, 위 그림에서 메시지 송신자는 수신자가 어떤 상태변경이 일어나는지 전혀 알 수 없다. 이 말은, 각 객체는 자신의 상태를 캡슐 안에 담아둔 채 외부로 노출시키지 않는다. 오직 행동만 외부에 노출시키는데, 이러한 행동은 결과적으로 객체의 자율성을 높이는 것이다. 객체가 자율적이어야 객체의 지능도 높아진다. 이로 인해 객체간의 협력 또한 간결해지고 유연해질 수 있다.

객체는 '식별 가능한' 경계를 가진 모든 사물이라고 하였다. 그렇다면 객체를 서로 구별할 수 있는 특정 프로퍼티(객체의 상태를 구성하는 모든 특징)이 존재해야 하는데, 이 프로퍼티를 식별자라고 한다. 상태는 시간의 흐름에 따라 변경될 수 있기에, 식별자를 통해 객체를 구분지을 수 있다. 예를 들어, 모든 인간은 시간이 지남에 따라 키, 몸무게 등의 상태가 변화하지만 상태가 달라졌다고 해서 다른 객체인 것은 아닌것처럼, 객체는 고유의 식별자를 지니고 있다. 즉, 객체는 어떤 상태에 있더라도 유일하게 식별 가능한 존재이다.

상태보다 '행동'에 집중하라.

객체지향을 설계할 때 쉽게 빠질 수 있는 대표적인 함정에 상태를 중심으로 객체를 바라보는 것이 있다. 이렇게 되면 설계에 몇 가지 부정적인 영향을 끼칠 수 있다.

첫째, 상태를 먼저 결정할 경우 캡슐화가 저해된다.
상태에 초점을 맞추게 되면 상태가 깔끔하게 캡슐화되지 못하고 공용 인터페이스에 노출될 확률이 높아진다.

둘째, 객체를 협력자가 아닌 고립된 섬으로 만든다.
객체간의 협력을 통해 애플리케이션을 구현해내는 것이 목표인데, 상태를 먼저 고려한다면 협력에 적합하지 못한 객체를 창조해내게 된다.

셋째, 객체의 재사용성이 저해된다.
객체의 재사용성은 다양한 협력에 참여할 수 있는 데에서 비롯되는데, 객체간의 협력이 저해된다면 자연스럽게 재사용성이 저해될 수 밖에 없다.

따라서, 상태가 아닌, '행동'에 초점을 맞추어야 한다.
객체지향 설계는 애플리케이션 수행에 필요한 협력을 생각하고 그 협력에 필요한 객체의 행동을 생각하는 과정으로 수행된다. 그 행동에 필요한 정보가 무엇인지를 고려하여 그 상태를 결정하는 것이다. '행동'이란 사실상 객체가 협력에 참여하며 완수해야하는 '책임'을 의미한다. 그렇기에 객체지향 설계의 전반적인 과정에 있어서 객체가 완수해야하는 책임에 초점이 맞춰져서 설계가 이루어져야 한다.

현실 세계의 '은유(metaphor)'

흔히 객체지향은 현실 세계의 객체에서 소프트웨어 객체에 적합한 속성만 추려내는 것이라고 하지만, 이는 소프트웨어 개발에 큰 도움을 주지는 못한다. 그 이유는 실제로는 소프트웨어 객체는 현실 객체와는 다른 특징을 부여하는 것이 보통의 일반적인 형태이기 때문이다. 오히려 현실 속 객체보다 소프트웨어 객체에 더 많은 특징과 능력을 부여한다.

따라서, 현실 세계와 객체지향 세계 사이의 관계를 좀 더 명확히 설명하는 단어는 추상화(abstraction)가 아닌 '은유(metaphor)'이다.

은유는 한 가지 개념을 이용해 다른 개념을 서술하는 형태인데, 예를 들면 '그 여자는 양 같아요'와 같은 대화법을 은유라고 할 수 있다. 이러한 서술의 형태가 현실세계와 객체지향의 세계를 연결시킨다. 소프트웨어에 전화기라는 객체가 있다고 할 때, 이 객체를 묘사하기 위해 현실 속 전화기의 개념을 사용하면 이 객체가 전화를 걸 수 있다는 사실을 쉽게 이해하고 기억할 수 있다. 이처럼 은유관계에 있는 실제 객체의 이름을 소프트웨어 객체의 이름으로 사용하면 표현적 차이를 줄여 소프트웨어의 구조를 쉽게 예측할 수 있다.

결국 다시 한 번 말하지만, 객체지향 설계자로서 우리의 목적은 현실세계의 모방이 아닌 새로운 세계, 이상한 세계를 창조해내는 것이다. 현실 세계와 닮을 필요도 없고, 그러한 의무도 없다. 그저 객체의 특성을 상기시킬 수 있는 현실 세계 객체의 이름을 이용해 객체를 생성하고, 그 객체로 새로운 우리만의 세계를 창조해내면 되는 것이다.

profile
'개발사(社)' (주)영진

0개의 댓글