인간의 인지능력과 객체지향
3개월 정도 된 아기들도 선천적인 인지능력을 가진다.
세상을 뚜렷한 경계를 가진 객체들의 집합으로 본다는 것이다.
인간은 이런 인지능력을 통해 세상을 이해한다.
도로 위에는 수많은 자동차가 존재한다.
제조회사도 다르며, 색깔도 다르고, 문의 개수도 다르다.
그럼에도 우리는 이들을 통틀어 '자동차'라고 한다.
인간은 본능적으로 세상을 독립적이고 식별 가능한 객체의 집합으로 바라본다.
이것이 많은 사람들이 객체지향이 이해하기 쉬운 패러다임이라고 말하는 이유다.
객체지향은 인간의 기본적인 인지능력에 기반을 두고 있기 때문이다.
이렇게 세상을 더 작은 객체로 분해하는 것은 세상의 복잡성을 극복하기 위함이다.
객체지향 패러다임도 마찬가지다.
소프트웨어의 세계 역시 인간이 인지할 수 있는 다양한 소프트웨어 객체들이 모여 이뤄져 있다는 믿음에서 출발한다.
그러나 현실 세계와 객체지향 세계의 유사성은 여기까지다.
객체, 그리고 이상한 나라
'이상한 나라의 엘리스' 에서는 토끼를 뒤쫒던 엘리스가
작은 문에 들어가기 위해 자신의 키를 늘렸다, 줄였다 하는 장면이 나온다.
이 시점에서 엘리스의 상태는 계속 변한다.
문을 통과하기에 적당한 상태로 자신의 키를 계속 변화시킨다.
키를 변화시키는 요인은 병 속의 음료를 마시거나, 부채질을 하거나, 버섯을 먹는 등이다.
즉, 엘리스의 상태(키)를 변화시키는 요인은 행동이다.
또한 엘리스의 상태를 결정하는 것은 행동이지만 행동의 결과를 결정하는 것은 상태이다.
엘리스의 키가 130센티미터이고, 케이크를 먹은 후 20센티가 커진다면 엘리스의 키는 150센티미터가 된다.
그리고 엘리스는 행동에 의해 상태가 변화하더라도 유일하게 식별된다.
아무리 키가 커지거나 작아지더라도 엘리스라는 사람에서 벗어나지 않는다.
엘리스는 소프트웨어 나라의 객체와 중요한 공통점을 몇 가지 공유한다.
엘리스와 객체 모두 상태, 행동, 식별자를 지닌 실체다.
상태
왜 상태가 필요할까?
객체가 주변 환경과의 상호작용에 어떻게 반응하는가는 그 시점까지 객체에 어떤 일이 발생했느냐로 좌우된다.
예를 들어, 자판기로 음료를 구매하려는 경우 자판기에 이전까지 얼마만큼의 돈이 투입되었는지로
음료 구매 가능/불가능 여부를 판단할 수 있다.
즉, 어떤 행동의 결과는 과거에 어떤 행동들이 일어났었느냐에 의존한다는 것이다.
이상한 나라의 엘리스가 문을 통과하기 위해서는 충분히 키를 줄여야 한다.
따라서 과거에 케이크를 먹었는지, 버섯을 먹었는지, 부채질을 했는지를 살펴보아야 한다.
그러나 이 방법은 엘리스가 과거에 했던 행동을 모두 기억해야 하므로 행동의 결과를 설명하는 것은 매우 어려워진다.
그래서 상태를 사용한다. 엘리스의 과거 행동은 기억될 필요가 없다.
단순히 키(상태)가 몇센티미터인지만 안다면, 추후 행동의 결과를 쉽게 유추할 수 있다.
상태를 이용하면 과거에 얽매이지 않고 현재를 기반으로 객체의 행동 방식을 이해할 수 있다.
상태는 근본적으로 세상의 복잡성을 완화하고 인지 과부하를 줄이는 중요한 개념이다.
상태를 나타내는 값들은 객체가 아니다.
숫자, 문자열, 양, 속도, 시간, 날짜 등과 같은 단순한 값들은 객체가 아니라,객체의 상태를 나타내기 위해 사용된다.
하지만 때로는 상태를 나타내기 위해 객체를 사용할 수도 있다.
엘리스가 음료를 들고 있는 것을 '음료 객체'를 가지고 있는 것으로 나타낼 수 있는 것처럼 말이다.
즉, 객체의 상태는 1. 단순한 값과 2. 객체의 조합으로 표현 가능하다.
객체의 조합으로 상태가 표현되는 경우, 객체간의 연결고리를 '링크'라고 한다.
링크가 존재하는 경우에만 객체-객체 사이의 메세지를 주고받는 것이 가능해진다.
즉, 다시 말하면 객체의 상태는 1. 단순한 값인 속성, 2. 다른 객체를 가리키는 링크로 구성된다.
행동
객체의 상태는 저절로 변화하지 않는다.
행동에 의해 변화한다. 행동은 다른 객체로 하여금 간접적으로 객체의 상태를 변경하는 것을 가능하게 한다.
엘리스는 케이크를 먹었기 때문에, 부채질을 했기 때문에, 상태(키)가 변화한다.
객체의 행동을 초래하는 요인은 다른 객체의 행동이다.
객체의 행동을 초래하는 목적은 협력이다.
객체는 협력하는 과정에서 자기 자신의 상태뿐만 아니라 다른 객체의 상태 변경을 유발할 수도 있다.
즉, 객체의 행동으로 인해 발생하는 결과는 두 가지 관점에서 설명할 수 있다.
- 객체 자신의 상태 변경
- 행동 내에서 협력하는 다른 객체에 대한 메세지 전송
다만 여기서 전제되는 점은 상태는 '캡슐화'되어야 한다는 것이다.
객체는 자율적인 존재여야 한다. 행동만을 외부로 노출해야 한다.
행동을 외부로 노출하지만, 상태를 변경할지 말지는 객체 스스로 결정한다.
이렇게 객체의 지능이 높아질수록 협력은 유연하고 간결해진다.
식별자
객체란 인간의 인지 능력을 이용해 식별 가능한 경계를 가진 모든 사물을 의미한다.
객체가 식별 가능한 기준은 프로퍼티다. 프로퍼티는 단순한 값이거나, 객체가 될 수도 있다.
값과 객체의 차이점은 값은 식별자를 가지지 않는다는 점이다.
두 개의 1이라는 숫자가 종이 위에 적혀 있다면 두 숫자는 같다.
이처럼 상태가 같으면 같은 것으로 판단한다. 이런 성질을 동등성이라고 한다.
반면 객체의 경우 가변 상태를 가진다.
즉, 시간과 행동에 따라 상태가 변화한다.
따라서 상태가 완전히 똑같더라도 독립적인 별개의 객체로 다뤄야한다.
반대로 이야기하면, 상태가 다르더라도 식별자가 같다면 같은 객체로 판단할 수 있다.
이런 성질을 동일성이라고 한다.
행동이 상태를 결정한다
객체지향 설계 시 상태는 먼저 결정되어서는 안된다.
이 경우 캡슐화가 저해되고, 객체를 고립된 섬으로 만든다. 또한 객체의 재사용성이 저하된다.
즉, 훌륭한 협력을 만들어내기 위해선 객체를 행동에 초점을 맞춰 만들어내야 한다.
객체는 협력하기 위해 존재한다.
협력 안에서의 객체의 행동은 곧 책임을 의미하기도 한다.
책임-주도-설계(RDD)도 비슷한 맥락에서 등장한 방법론이다.
'행동이 상태를 결정한다'. 이것이 객체지향의 핵심을 관통하는 내용이다.
은유와 객체
객체지향은 실세계의 모방이 아니다.
소프트웨어의 객체는 실세계의 객체와는 전혀 다른 양상을 띤다.
실세계의 객체가 하지 못하는 일을 스스로 수행할 수도 있다.
즉, 소프트웨어 세상의 객체는 자율성을 가진다는 점에서 큰 차이점을 가진다.
현실의 객체보다 소프트웨어의 객체가 더 많은 일을 할 수 있는 특징을 의인화라고 부른다.
소프트웨어 세상의 객체는 현실을 모방한 것이 아니다.
현실을 참조할 뿐, 전혀 다른 세계를 만들어내는 것이다.
객체지향 세계와 현실 세계 사이의 관계를 조금 더 정확하게 설명할 수 있는 단어는 은유이다.
은유는 '그 사람 호랑이 같아요' 처럼 한 특성을 이용해 다른 것을 묘사하는 것을 의미한다.
프로그램 내의 객체는 현실 속의 객체에 대한 은유다.
현실 속의 전화기는 스스로 전화를 걸 수 없지만, 프로그램 내의 전화기는 가능하다.
이상한 나라의 엘리스도 마찬가지이다.
트럼프, 고양이 등 현실 세계와 직접적으로 대응되는 모습은 하나도 존재하지 않는다.
그럼에도 우리가 트럼프, 고양이라고 부르는 이유는 그럴만한 특징을 가지고 있기 때문이다.
이처럼 객체지향 설계도 현실세계에 대한 모방이 아니라 이상한 나라를 창조하기만 하면 된다.
'객체지향' 카테고리의 다른 글
[객체지향의 사실과 오해] 6장: 객체 지도 (0) | 2023.02.23 |
---|---|
[객체지향의 사실과 오해] 5장: 책임과 메세지 (0) | 2023.01.14 |
[객체지향의 사실과 오해] 4장: 역할, 책임, 협력 (0) | 2023.01.13 |
[객체지향의 사실과 오해] 3장: 타입과 추상화 (0) | 2023.01.12 |
[객체지향의 사실과 오해] 1장: 협력하는 객체들의 공동체 (0) | 2023.01.10 |