- Published on
2024.03.20
객체지향의 사실과 오해 - 02. 이상한 나라의 객체
객체지향과 인지 능력
인간이 직접적으로 지각할 수 있는 대부분의 객체는 물리적인 경계를 지닌 구체적인 사물이지만, 인간의 인지 능력은 물리적인 한계를 넘어 개념적으로 경계 지을 수 있는 추상적인 사물도 객체로 인식할 수 있다. 실체가 없는 주문 내역이나 계좌 이체도 인간이 하나의 단위로 인지할 수 있는 개념적인 객체의 일종이다. 객체지향 패러다임의 목적은 현실 세계의 모방이 아닌 현실을 기반으로 한 새로운 세계의 창조이다. 소프트웨어 세계에서 살아가는 객체는 현실 세계의 객체와는 전혀 다른 모습을 보이게 된다.
상태를 결정하는 것은 행동이지만, 행동의 결과를 결정하는 것은 상태다
객체의 행동에 따라 객체의 상태가 변하게 된다. 상태를 결정하는 것은 행동이지만 행동의 결과를 결정하는 것은 상태로, 행동의 결과는 상태에 의존적이다.
- 객체는 상태를 가지며 상태는 변경 가능하다.
- 객체의 상태를 변경시키는 것은 객체의 행동이다.
- 행동의 결과는 상태에 의존적이며 상태를 이용해 서술할 수 있다.
- 행동의 순서가 결과에 영향을 미친다.
- 객체는 어떤 상태에 있더라도 유일하게 식별 가능하다.
객체, 그리고 소프트웨어 나라
하나의 개별적인 실체로 식별 가능한 물리적이거나 개념적인 사물은 어떤 것이라도 객체가 될 수 있다. 인간의 인지 능력 안에서 개수를 셀 수 있거나, 다른 사물과 구분할 수 있으며, 생성 시점을 알 수 있고, 독립적인 하나의 단위로 인식할 수 있는 모든 사물은 객체다. 객체의 다양한 특성을 설명하기 위한 효과적인 방법은, 객체를 상태
, 행동
, 식별자
를 지닌 실체로 보는 것이다.
상태
왜 상태가 필요한가
객체가 주변 환경과의 상호작용에 어떻게 반응하는지는 객체에 그동안 어떤 일이 발생했느냐에 좌우된다. 어떤 행동의 결과는 과거에 어떤 행동들이 일어났었느냐에 의존한다는 것이다. 그런데 일반적으로 과거에 발생한 행동의 이력으로 현재 발생한 행동의 결과를 판단하는 것은 복잡하고 이해하기 힘들다. 또 과거에 했던 모든 행동을 기억해야 하므로 행동의 결과를 설명하는 것을 매우 어렵게 만든다. 그래서 행동의 과정과 결과를 단순하게 기술하기 위해 상태
라는 개념을 고안했다. 상태
를 이용하면 과거의 모든 행동 애력들을 설명하지 않아도 행동의 결과를 쉽게 에측하고 설명할 수 있다. 상태
를 이용하면 현재를 기반으로 객체의 행동 방식을 이해할 수 있다. 상태
는 근본적으로 복잡성을 완화하고 인지 과부하를 줄일 수 있는 중요한 개념이다.
상태와 프로퍼티
숫자, 문자열, 양, 속도, 시간, 날짜, 참/거짓과 같은 단순한 값들은 객체가 아니다. 단순한 값들은 그 자체로 독립적인 의미를 가지기보단, 다른 객체의 상태
를 표현하기 위해 사용된다. 객체의 상태
는 단순한 값과 객체의 조합으로 표현할 수 있다. 객체의 상태
를 구성하는 모든 특징을 통틀어 객체의 프로퍼티
라고 한다. 일반적으로 프로퍼티
는 정적이고, 프로퍼티 값
은 동적이다.
객체와 객체 사이의 의미 있는 연결을 링크라고 한다. 링크는 객체가 다른 객체를 참조할 수 있는 것을 의미하며, 일반적으로 다른 객체의 식별자를 알고 있는 것으로 표현된다. 객체의 프로퍼티
는 단순한 값인 속성과 다른 객체를 가리키는 링크라는 두 가지 종류의 조합으로 표현할 수 있다. 행동은 간접적으로 다른 객체의 상태
를 변경하는 것을 가능하게 한다.
행동
객체는 행동을 통해 다른 객체와의 협력에 참여하므로 행동은 외부에 가시적이어야 한다.
상태와 행동 객체가 취하는 행동
은 객체 자신의 상태
를 변경시킨다. 객체의 행동
에 의해 객체의 상태
가 변경된다는 것은 행동
이 부수 효과
(side effect)를 초래한다는 것을 의미한다.
상태
와 행동
사이에는 다음과 같은 관계가 있다.
- 객체의
행동
은상태
에 영향을 받는다 - 객체의
행동
은상태
를 변경시킨다
상태
라는 개념을 이용해 행동
을 두 가지 관점으로 서술할 수 있다.
- 상호작용이 현재의
상태
에 어떤 방식으로 의존하는가 - 상호작용이 어떻게 현재의
상태
를 변경시키는가
협력과 행동
객체의 행동
으로 인해 발생하는 결과는 두 가지 관점에서 설명할 수 있다.
- 객체 자신의
상태
변경 행동
내에서 협력하는 다른 객체에 대한 메시지 전송
상태 캡슐화
객체는 상태
를 캡슐 안에 감춰둔 채 외부로 노출하지 않는다. 외부에 노출되는 것은 행동
뿐이며, 외부에서 객체에 접근할 수 있는 유일한 방법이 행동
이다. 상태
를 외부에 노출시키지 않고 행동
을 경계로 캡슐화하는 것은 객체의 자율성을 높인다. 협력에 참여하는 객체들의 자율성이 높아질수록 협력이 유연하고 간결해진다.
식별자
어떤 객체를 다른 객체와 구분하는 데 사용하는 객체의 프로퍼티
객체가 식별 가능하다는 것은 객체를 서로 구별할 수 있는 식별자
가 객체 안에 존재한다는 것을 의미한다. 값과 객체의 가장 큰 차이는 값은 식별자
를 가지지 않지만 객체는 식별자
를 가진다는 점이다.
값은 변하지 않는 양으로, 값의 상태
는 변하지 않기 때문에 불변 상태를 가진다고 한다. 그래서 값은 두 인스턴스의 상태
가 같다면 두 인스턴스를 같은 것으로 판단한다. 값의 같은지는 상태
가 같은지를 이용해 판단하는데, 값의 상태
가 같으면 동일한 것으로 판단하고 상태
가 다르면 다른 것으로 판단한다. 이처럼 상태
를 이용해 두 값이 같은지 판단할 수 있는 성질을 동등성이라 한다.
객체는 가변 상태를 가진다고 한다. 타입이 같은 두 객체의 상태
가 완전히 같아도 각자는 독립적인 별개의 객체로 다뤄야 한다. 두 객체의 상태
가 달라도 식별자
가 같다면 두 객체를 같은 객체로 판단할 수 있다. 이렇게 식별자
를 기반으로 객체가 같은지를 판단할 수 있는 성질을 동일성이라 한다.
상태
를 기반으로 객체의 동일성을 판단할 수 없는 이유는 시간이 경과함에 따라 객체의 상태
가 변하기 때문이다. 한 객체의 상태
가 변하는 순간 두 객체는 서로 다른 상태
가 되어 버린다. 상태
가 가변적인 객체의 동일성을 판단하기 위해서는 별도의 식별자를 이용할 수밖에 없다.
- 참조 객체, 엔티티 : 식별자를 지닌 전통적인 의미의 객체
- 값 객체 : 식별자를 가지지 않는 값
행동이 상태를 결정한다.
상태를 중심으로 객체를 바라보면 안된다. 상태를 먼저 결정하고 행동을 나중에 결정하는 방법은 설계에 나쁜 영향을 끼친다.
- 상태를 먼저 결정할 경우 캡슐화가 저해된다.
- 객체를 협력자가 아닌 고립된 섬으로 만든다.
- 객체의 재사용성이 저하된다.
은유와 객체
현실의 객체보다 더 많은 일을 할 수 있는 소프트웨어 객체의 특징을 의인화라고 부른다.
은유
모방이나 추상화의 수준이 아닌 현실 세계와 객체지향 세계 사이의 관계를 더 정확하게 설명할 수 있는 단어는 은유다. 은유 관계에 있는 실제 객체의 이름을 소프트웨어 객체의 이름으로 사용하면 표현적 차이를 줄여 구조를 쉽게 예측할 수 있다.
객체를 행동과 상태의 측면에서 바라보며, 객체지향의 대표적인 오해 중 하나인 '객체지향이란 현실 세계의 모방'이라는 점에 대해 차이점을 통해 설명하고, 비유와 예제를 통해 객체라는 개념에 대한 이해를 많이 도운 챕터였다. 특히 상태와 행동의 관계성을 앨리스를 통한 비유로 설명한 점이 직관적이지 않은 개념을 직관적으로 설명해 좋았다. 이 내용이 이어져 챕터의 후반부 은유에 대한 얘기가 나올 때에는, 내가 읽고 이해한 이 부분이 바로 은유였구나~ 하면서 마지막으로 이해를 도왔다.