사람은 물리적인 경계를 지닌 구체적인 사물 뿐만이 아니라 개념적으로 경계 지을 수 있는 추상적인 사물까지도 객체로 인식한다.

이러한 현실세계의 객체를 그대로 모방하는 것은 객체지향 패러다임의 목적이 아니다.

현실세계를 기반으로 새로운 세계를 창조하는 것이 목적이다.

새로운 세계에서는 객체가 자율적으로 행동한다. 

ex) 주문 객체가 자신의 금액을 계산하고 자동차가 스스로 시동을 걸 수 있다.

이처럼 현실과는 확실히 다른 모습을 보이는 것이 일반적이다.

 

 

객체는 상태를 갖고 있다.

그리고 그 상태는 행동에 의해 변하게 된다.

상태를 결정하는 것은 행동이지만 행동의 결과는 기존의 상태에 영향을 받는다.

(음식을 먹으면 몸무게가 증가하지만, 음식을 먹기전에 몸무게가 몇 kg이었는지에 따라 최종 몸무게가 달라진다)

또한 행동의 순서에 따라 결과가 달라질 수 있다.

(살을 찌우려면 음식을 먹는 행동이 선행되어야 한다)

하지만 상태가 달라지더라도 객체는 유일하게 식별이 가능하다.

(몸무게가 늘었다고 내가 다른 사람이 되는 것은 아니니까)

 

 

객체는 상태(state), 행동(behavior), 식별자(identity)를 지닌다.

객체에 왜 상태가 필요할까?

상태를 이용하면 과거의 모든 행동 이력을 설명하지 않고도 행동의 결과를 쉽게 예측하고 설명할 수 있다.

즉, 과거에 얽매이지 않고 현재를 기반으로 객체의 행동 방식을 이해할 수 있다.

=> 단순히 현재의 상태를 알고 있다면 어떠한 행동을 했을 때 그 결과가 어떻게 나올지 예측할 수 있다.

 

- 상태

모든 객체의 상태는 단순한 값과 객체의 조합으로 표현할 수 있다.

객체의 상태를 구성하는 모든 특징을 통틀어 객체의 프로퍼티(property)라고 한다.

ex) 사람의 성별, 나이, 키 등등...

프로퍼티 자체는 일반적으로 변하지 않지만(정적) 프로퍼티 값은 변경되기도 한다(동적).

그리고 객체와 객체 사이의 의미있는 연결을 링크(link)라고 한다.

(객체가 다른 객체를 참조하는 경우를 의미, 인스턴스 변수로 객체를 갖는 경우로 기억하자)

 

- 행동

객체의 상태는 기존의 상태에 영향을 받으며, 행동에 의해 변경된다.

또한 다른 객체에 메세지를 전송하는 행동을 하기도 한다.

 

- 캡슐화

어떤 객체가 다른 객체에 대해 메세지를 전송하게 되었을 때,

메세지를 전송한 객체는 메세지 수신자의 상태가 어떻게 되는지 전혀 알지 못한다.

즉, 상태를 외부에 노출하지 않고 행동을 경계로 캡슐화 하게 된다.

송신측은 그냥 메세지만 전달할 뿐 메세지를 수신한 쪽에서 어떻게 처리할지 스스로 결정한다(객체의 자율성).

 

 

- 식별자

값은 숫자, 문자열, 날짜, 시간, 금액 등과 같이 변하지 않는 양을 모델링한다.

값의 상태는 변하지 않기 때문에 불변 상태(immutable state)를 가진다고 말한다.

값이 같은지 판단할 수 있는 성질을 동등성(equality)이라고 한다.

객체는 시간에 따라 변경되는 상태를 포함하며, 행동을 통해 상태를 변경한다.

따라서 가변 상태(mutable state)를 가진다고 말할 수 있다.

그러나 객체는 상태와 무관하게 두 객체를 동일하거나 다르다고 판단할 수 있는 식별자를 가진다.

식별자를 기반으로 객체가 같은지를 판단할 수 있는 성질을 동일성(identical)이라고 한다.

 

 

정리하면,

1. 객체는 상태를 가지며 변경 가능하다.

2. 행동을 통해 객체의 상태를 변경시킬 수 있다(행동 전 상태에 따라 결과가 달라진다).

3. 객체는 상태와 무관하게 식별 가능하다(식별자를 통해).

 

 

 

객체를 설계할 때 상태를 먼저 결정하기보다는 행동을 먼저 결정해야 한다.

객체의 행동은 객체가 협력에 참여하는 유일한 방법이다.

따라서 필요한 행동이 무엇인지 먼저 생각한 후 그에 맞는 객체의 상태를 선택하는 것이 순서가 되어야 한다.

 

 

앞서 말했지만 소프트웨어 객체는 현실세계를 기반으로 새로운 세계를 창조한 것이다.

현실세계에서 일부를 은유(옮겨서)해서 객체를 만드는 것이다.

+ Recent posts