객체지향 패러다임은 지식을 추상화하고 추상화한 지식을 객체 안에 캡슐화함으로써 실세계 문제에 내재된 복잡성을 관리하려고 한다.
객체를 발견하고 창조하는 것은 지식과 행동을 구조화하는 문제다.
객체지향 패러다임은 인간이 인지할 수 있는 다양한 객체들이 모여 현식 세계를 이루는 것처럼 소프트웨어의 세계 역시 인간이 인지할 수있는 다양한 소프트웨어 객체들이 모여 이뤄져 있다는 믿음에서 출발한다.
책의 이상한 나라의 앨리스 파트를 읽고
앨리스는 정원으로 가는길을 가로막고 있는 작은 문을 통과하기에 적당한 상태로 자신의 키를 계속해서 변화시킨 것이다.
앨리스의 키는 시간의 흐름에 다라 계속 변한다. 그렇다고 엘리스의 키가 아무런 이유없이 변하는것은 아니고, 앨리스의 키를 변화시키는것은 앨리스의 행동이다. 앨리스가 하는 행동에 따라 앨리스의 상태가 변하게된다.
행동에 의해 앨리스의 상태가 변경되더라도 앨리스가 앨리스라는 사실은 변하지 않는다. 앨리스는 상태 변경과 무관하게 유일한 존재로 식별가능하다.
- 앨리스는 상태를 가지며 상태는 변경가능하다.
- 앨리스의 상태를 변경 시키는것은 앨리스의 행동이다.
- 행동의 결과는 상태에 의존적이며상태를 이용해 서술할 수있다.
- 행동의 순서가 결과에 영향을 미친다.
- 앨리스는 어떤 상태에 있더라도 유일하게 식별 가능하다.
상태
어떤 행동의 결과는 과거에 어떤 행동들이 일어났느냐에 의존한다. 즉, 상태는 행동에의존한다.
필자는 책의 내용을 이해한 바로는 "자신의 메소드(행동)에 의해 필드(상태)가 변한다." 라고 이해된다.
때로는 단순한 값이 아니라 객체를 사용해 다른 객체의 상태를 표현해야 할 때가 있다.
앨리스가 현재 음료를 들고 있는 상태인지를 표현하고 싶다면 가장 간단하고 직관적인 방법으로 앨리스의 상태 일부를 음료라는 객체를 이용해 표현하는 것이다.
결론적으로 모든 객체의 상태는 단순한 값과 객체의 조합으로 표현할 수 있다. 이때 객체의 상태를 구성하는 모든 특징을 통틀어 객체의 프로퍼티라고 한다. 앨리스의 경우 키, 위치, 음료가 앨리스의 프로퍼티가 된다. 일반적으로 프로퍼티는 변경되지 않고 고정되기 때문에 '정적'이다. 반면 프로퍼티 값은 시간이 흐름에 따라 변경 되기 때문에 '동적'이다.
책의 객체의 상태 정의
상태는 특정 시점에 객체가 가지고 있는 정보의 집합으로 객체의 구조적 특징을 표현한다.
객체의 상태는 객체에 존재하는 정적인 프로퍼티와 동적인 프로퍼티 값으로 구성된다.
객체의 프로퍼티는 단순한 값과 다른 객체를 참조하는 링크로 구분할 수 있다.
객체는 자율적인 존재라는 점을 명심하라. 객쳊비향의 세계에서 객체는 다른 객체의 상태에 직접적으로 접근할 수도, 상태를 변경할 수도 없다. 자율적인 객체는 스스로 자신의 상태를 책임져야한다.
행동
객체의 상태는 저절로 변경되지 않는다. 객체의 상태를 변경하는것은 객체의 자발적인 행동뿐이다.
객체는 자신에게 주어진 책임을 완수하기 위해 다른 객체를 이용하고 다른 객체에게 서비스를 제공한다. 객체는 다른 객체와 적극적으로 상호작용하며, '협력하는 객체들의 공동체'에 참여하기 위해 노력한다.
객체가 다른 객체와 메시지를 통해서만 의사소통할 수 있다는것을 기억하라, 객체가 어떤 행동을 하도록 만드는 것은 객체가 외부로부터 수신한 메시지다. 객체는 수신된 메시지에 따라 적절히 행동하면서 협력에 참여하고 그 결과로 자신의 상태를 변경한다.
객체지향의 세계에서 모든객체는 자신의 상태를 스스로 관리하는 자율적인 존재이다. 앨리스 객체의 키를작게 만드는것은 앨리스 자신이여야하고, 음료의 양을 줄이는것은 음료 자신이여야한다.
위 파트를 처음 읽을때 무슨말인지 이해가 되지않았다. 곰곰이 생각해봤다.
앨리스는 자신의 상태를 변경하고, 이과정에서 앨리스는 자신이 먹은 양만큼 으료의 양을 줄여달라고 메시지를 전송한다.
이 그림에서 앨리스와 음료에게 전송되는 메시지 이름을 주목하면된다. 메시지를 앨리스에게 전송하는 객체이건 음료에게 메시지를 전송하는 앨리스 객체이건 메시지 송신자는 수신자의 상태 변경에 대해서는 전혀 알지 못한다. 이것이 캡슐화가 의미하는것이다.
식별자
객체가 식별 가능하다는것은 객체를 서ㅏ로 구별할 수 있는 특정한 프로퍼티가 객체 안에 존재한다는 것을 의미한다. 이 프로퍼티를 식별자라고 한다. 모든 객체는 식별자를 가지며 식별자를 이용해 객체를 구별 할 수있다.
값은 숫자, 문자, 날짜, 시간, 금액 등과 같이 변하지 않는 양을 모델링한다. 흔히 값의 상태는 변하지 않기 때문에 불변 상태를 가진다고 말한다. 값이 같은지 여부는 상태가 같은지를 이용해 판단한다. 값의 상태가 같으면 두 인스턴스는 동일한 것으로 판단하고 상태가 다르면 두인스턴스는 다른것으로 판단한다. 이처럼 상태를 이용해 구 값이 같은지 판단할 수 있는 성질을 동등성(equality)이라고 한다.
값은 오직 상태만을 이용해 동등성을 판단하기 때문에 인스턴스를 구별하기 위한 별도의 식별자를 필요로 하지 않는다.
객체는 시간에 따라 변경되는 상태를 포함하며, 행동을 통해 상태를 변경한다. 따라서 객체는 가변 상태를 가진다고 말한다. 타입이 같은 두 객체의 상태가 완전히 똑같더라도 두 객체는 독립적인 별개의 객체로 다뤄야한다. 이름이 앨리스이고 키가 동일한 두사람이 함께 있다고 하더라도 어떤 누구도 두 사람을 같은 사람이라고 생각하지 않는다.
어린 나는 현재의 나보다 키도 작고 나이도 적지만 두사람은 동일한 인물이다. 따라서 상태와 무관하게 동일한 사람으로 판단될 수 있는 일종의 식별자를 가지고 있는 개체라고 할 수 있다.
이처럼 식별자를 기반으로 객체가 같은지를 판단할 수 있는 성질을 동일성(identical)이라고 한다.
상태를 기반으로 객체의 동일성을 판단할 수 없는 이유는 시간의 흐름에 따라 객체의 상태가 변하기 때문이다. 어느 한 시점에 두 객체의 상태가 동일하더라도 한 객체의 상태가 변하는 순간 두 객체는 서로 다른 상태가 되어버린다.
행동이 상태를 결정한다.
객체를 설계할때 상태를 중심으로 객체를 바라본다. 객체에 필요한 상태가 무엇인지를 결정하고 그 상태에 필요한 행동을 추가한다.
상태를 먼저 결정하고 행동을 나중에 결정하는 방법은 설계에 나쁜 영향을 끼친다.
첫째, 상태를 먼저 결정할 경우 캡슐화가 저해된다. 상태에 초점을 맞출 경우 상태가 객체 내부로 깔끔하게 캡슐화되지 못하고 공용 인터페이스에 노출 될 확률이 높다.
둘째, 객체를 협력자가 아닌 고립된 섬으로 만든다. 객체가 필요한 이유는 애플리케이션의 문맥 내에서 다른 객체와 협력하기 위해서다.
셋째, 객체의 재사용성이 저하된다. 객체의 재사용성은 다양한 협력에 참여할 수 있는 능력에서 나온다. 상태에 초점을 맞춘 객체는 다양한 협력에 참여하기 어렵기 때문에 재사용성이 저하된다.
가장 중요한 덕목은 상태가 아니라 행동에 초점을 맞추는 것이다. 객체는 다른 객체와 협력하기 위해 존재한다. 객체의 행동은 객체가 협력에 참여하는 유일한 방법이다.
객체지향 설계는 애플리케이션에 필요한 행동을 생각 한 후 행동을 수행할 객체를 선택하는 방식으로 수행된다. 행동을 결정한 후에야 행동에 필요한 정보가 무엇인지를 고려하게되며 이과정에서 필요한 상태가 결정된다. 따라서 먼저 객체의 행동을 결정하고 그 후에 행동에 적절한 상태를 선택하게 된다.