[Panda] 객체지향의 사실과 오해 2장
2장 이상한 나라의 객체
객체지향과 인지능력
소프트웨어 세계 역시 인간이 인지할 수 있는 다양한 객체들이 모여 구성되지만 객체지향 패러다임의 목적은 현실 세계를 기반으로 새로운 세계를 창조하는 것이기 때문에 두 세계에 존재하는 객체를 일반적으로 서로 전혀 다른 모습을 보인다.
이번 장은 심리학자인 엘리자베스 스펠크와 필립 켈만이 어린 아기들이 물체를 인지하는 방법을 연구하기 위해 실행한 실험으로 시작한다. 이 실험으로 알 수 있는 것은 사람은 태어난지 얼마 안 된 시기부터 함께 행동하는 물체를 하나의 개념으로 인지한다는 사실이다.
물체가 여러 부분으로 구성되어 있더라도 함께 움직일 경우 그 물체를 하나의 유기적인 단위로 인식한다는 것.
인간의 인지능력은 물리적인 경계를 넘어 추상적인 사물까지도 객체로 인식한다.
객체지향 프로그래밍에서 객체를 "물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지고 있으면서 다른 것과 식별가능한 것" 이라고 정의할 수 있다.
이렇게 객체지향 패러다임이 세상을 자율적이고 독립적인 객체들로 분해할 수 있는 인간의 기본적인 인지 능력에 기반을 두고 있기 때문에, 우리는 객체지향을 비교적 쉽게 이해할 수 있다.
객체지향 프로그래밍이 인간의 인지 및 사고과정과 닮아있는 또 다른 이유는 세상(전체)을 더 작은 객체로 분해하고자하는 것에 있다.
Computer Language 시간에 교수님이 자바 프로그래밍에서 중요한 것은 역할과 기능등을 잘 분리하는 것이라고 언급한 적이 있다. 만약 메소드나 클래스 이름을 분명하게 정하기가 힘이 든다면 기능을 제대로 분리하여 구현하지 않은 것이기 때문에 다시 구현할 필요가 있다고 언급하셨다.
이는 인간이 복잡성을 극복하기 위해 큰 객체를 더 단순한 객체들로 분해하는 것과 같다.
여기 분명히 기억해야하는 것은 현실 세계와 소프트웨어 세계가 인간이 인지할 수 있는 다양한 객체들이 모여 구성한다는 점에서는 비슷하지만 객체지향 패러다임의 목적은 현실 세계를 모방하는 것이 아니라 이를 기반으로 새로운 세계를 창조하는 것이기 때문에 소프트웨어 세계에서 살아가는 객체들은 현실 세계에 존재하는 객체와 전혀다른 모습을 보이는 것이 일반적이다.
객체, 그리고 이상한 나라
책에서는 객체를 설명하기 위해 이상한 나라의 앨리스 이야기를 사용한다.
이상한 나라의 앨리스 책에서 앨리스의 키는 시간의 흐름에 따라 앨리스의 행동(음료수, 케이크, 버섯 섭취 등)에 의해 계속 변한다.
이때 앨리스의 특징은 다음과 같이 요약할 수 있다.
- 앨리스는 상태를 가지며 상태는 변경 가능하다.
- 앨리스의 상태를 변경시키는 것은 앨리스의 행동이다.
- 행동의 결과는 상태에 의존적이며 상태를 이용해 서술할 수 있다.
- 앨리스가 행동을 하기전 앨리스의 키가 얼마였는지가 행동 이후 앨리스의 키를 결정
- 행동의 순서가 결과의 영향을 미친다.
- 우선 문을 통과한다는 행동의 결과는 앨리스의 위치라는 상태를 통해 설명 가능
- 문을 통과하기 위해서는 음료나 케이크를 먹어 키를 조절하는 행동이 선행되어야 함
- 행동의 결과는 상태에 의존적이며 상태를 이용해 서술할 수 있다.
- 앨리스는 어떤 상태에 있더라도 유일하게 식별가능하다.
위 내용에세 앨리스의 특징은 객체들의 특징과 공통점 몇 가지를 공유한다,
객체, 그리고 소프트웨어 나라
하나의 개별적인 실체로 식별 가능한 물리적인 또는 개념적인 사물은 어떤 것이라도 객체가 될 수 있다.
객체는 상태(state), 행동(behavior), 식별자(identity)를 지닌 실체로 보는 것이 가장 효과적이다.
소프트웨어 안에서 객체는 저장된 상태와 실행 가능한 코드를 통해 구현된다.
상태
객체가 주변 환경과의 상호작용에 어떻게 반응하는가는 그 시점까지 객체에 어떤일이 발생했느냐에 좌우된다.
이 방식은 복잡하기 때문에 행동의 과정과 결과를 단순하게 기술하기 위해 상태라는 개념을 고안했다.
상태를 이용하면 현재를 기반으로 객체의 행동방식을 이해할 수 있다.
복잡성을 완화하고 인지 과부화를 줄일 수 있는 것이다.
상태와 프로퍼티
앨리스, 문, 토끼 등등 모두 객체이다. 이들은 뚜렷한 경계를 가지며 식별가능하고 상태와 행동을 지니고 있다.
세상에 존재하는 모든 것들이 객체인 것은 아니다.
숫자, 문자열, 양, 속도, 시간, 날짜, 참/거짓과 같은 단순한 값은 객체가 아니라 객체의 특성을 표현하는데 사용된다.
앨리스의 키를 숫자로 나타내는 것이 그것이다.
때로는 객체를 사용해 다른 객체의 상태를 표현해야할 때가 있다.
앨리스가 현재 음료를 들고 있는 상태인지를 표현하고 싶다면 앨리스의 상태 일부를 음료라는 객체를 이용해 표현할 수 잇을 것이다. 앨리스 객체와 음료 객체를 연결시키는 것이다.
모든 객체의 상태는 단순한 값과 객체의 조합으로 표현할 수 있다.
객체의 상태를 구성하는 모든 특징을 통틀어 객체의 프로퍼티(property)라고 한다. 일반적으로 프로퍼티는 변경되지 않고 고정되기 때문에 정적이다. 반면 프로퍼티 값(property value)은 시간이 흐름에 따라 변경되기 때문에 동적이다.
만약 앨리스가 음료를 더이상 가지지 않는다면
이렇게 연결이 끊어진 상태로 표현할 수 있다. 이처럼 객체와 객체 사이 의미있는 연결을 링크(link)라고 한다.
객체와 객체 사이에 링크가 존재해야만 요청을 보내고 받을 수 있다.(= 메세지를 주고 받을 수 있다.)
링크는 한 객체가 다른 객체를 참조할 수 있다는 것, 일반적으로 한 객체가 다른 객체의 식별자를 알 고 있는 것으로 표현된다.
앨리스의 키, 위치와 같이 단순한 값으로 표현되는 것을 속성(attribute)라고 한다.
객체의 프로퍼티는 단순한 값인 속성과 다른 객체를 가리키는 링크라는 두 종류의 조합으로 표현할 수 있다.
행동
객체는 자율적인 존재이므로 다른 객체의 상태에 직접적으로 접근할 수 도, 상태를 변경할 수 도 없다.
외부의 객체가 다른 객체의 상태를 변경하거나 조회할 수 있는 간접적인 방법이 필요한데 그것이 행동이다.
객체는 스스로의 행동에 의해서만 상태가 변경되는 것을 보장하므로써 객체의 자율성을 유지한다.
(상태 + 상태를 조작하기 위한 행동이 하나의 단위)
상태와 행동
상태와 행동사이에는 다음과 같은 관계가 있다.
- 객체의 행동은 상태에 영향을 받는다.
- 객체의 행동은 상태로 변경시킨다.
상태라는 개념을 이용해 행동을 다음 두 가지 관점에서 서술할 수 있다.
- 상호작용이 현재의 상태에 어떤 방식으로 의존하는가
- ex) 앨리스의 키가 40cm 이하라면 문을 통과할 수 있다.
- 상호작용이 어떻게 현재의 상태를 변화시키는가
- ex) 문을 통과한 후에 앨리스의 위치는 정원으로 바뀌어야한다.
협력과 행동
객체는 책임을 완수하기 위해 다른 객체들과 적극적으로 상호작용하며 협력한다.
객체가 다른 객체와 협력하는 방법은 다른 객체에게 요청을 보내는 것이다.
요청(메세지)을 수신한 객체는 요청을 처리하기 위해 적절히 행동하면서 협력에 참여하고 자신의 상태를 변경한다.
객체는 협력에 참여하는 과정에서 자기 자신의 상태뿐만 아니라 다른 객체의 상태 변경을 유발할 수도 있다.
객체의 행동으로 인해 발생하는 결과는 두 가지 관점에서 설명할 수 있고 이 두가지 관점의 부수효과를 명확히 서술해야한다.
- 객체 자신의 상태변경
- 행동 내에서 협력하는 다른 객체에 대한 메세지 전송
상태 캡슐화
현실 시계에서는 앨리스처럼 능동적인 존재, 음료처럼 수동적인 존재로 나누지만, 객체지향 세계에서 모든 객체는 자신의 상태를 스스로 관리하는 자율적인 존재다.
현실 세계에서 음료 양을 줄이는 즉 음료의 상태를 변경시키는 주체는 앨리스이지만 객체지향 세계에서 음료 객체의 양을 줄이는 것은 음료 자신이어야한다.
앨리스는 음료 를 마션다는 메세지만 전달 할 수 있을 뿐이다.
여기서 집중해야하는 것은 메세지 송신자는 메세지 수신자의 상태 변경에 대해서는 전혀 알지 못한다.
상태를 캡슐 안 감춰둔 채 외부로 노출하지 않고 행동만 노출한다. 외부에서 객체에 접근할 수 있는 유일한 방법도 행동이다. 이것이 캡슐화이다.
외부로부터 전달 된 메세지는 객체의 행동을 유발만 할 뿐 객체 상태 변경 여부는 객체 스스로 결정한다.
상태를 외부에 노출시키지 않고 행동을 경계로 캡슐화하는 것은 결과적으로 객체의 자율성을 높인다.
자율적인 객체는 스스로 판단하고 결정하기 때문에 자율성이 높아질수록 객체의 지능도 높아진다. 그리고 지능이 높을 수록 협력은 유연하고 간결해진다.
결론적으로 객체를 캡슐화하는 것은 객체의 자율성을 높이고 협력을 단순화하며 유연하게 만든다.
식별자
객체가 식별 가능하다는 것은 객체를 구분할 수 있는 특정한 프로퍼티가 객체안에 존재한다는 것.
이 프로퍼티를 식별자라고 한다.
값과 객체의 큰 차이점은 식별자의 유무이다. 시스템을 설계할 때는 이런 단순한 값과 객체의 차이점을 명확히 구분하고 명시적으로 표현하는 것이 중요하다.(단순한 값은 식별자를 가지지 않는다.)
값(value)이란?
값은 숫자, 문자열, 날짜, 시간 금액 등과 같이 변하지 않는 양을 모델링한다.
데이터를 표현하는데 사용되며 한번 생성된 후에는 그 상태가 변하지 않는다.(불변 상태 immutable state)
값이 같은지 여부는 각 인스턴스 상태가 같은지를 이용해 판단한다.
상태를 이용해 두 값이 같은지 판단할 수 있는 성질을 동등성(equality)이라고 한다. 이가 가능한 이유느