객체의 다양한 특성을 효과적으로 설명하기 위해서는 객체의 상태(state), 행동(behavior), 식별자(identity) 를 지닌 실체로 보는 것이 가장 효과적이다. [Booch 2007]
객체란 식별 가능한 개체 또는 사물이다. 객체는 자동차처럼 만질 수 있는 구체적인 사물일 수도 있고, 시간처럼 추상적인 개념일 수도 있다. 객체는 구별 가능한 식별자, 특징적인 행동, 변경 가능한 상태를 가진다. 소프트웨어 안에서 객체는 저장된 상태와 실행 가능한 코드를 통해 구현된다.
- 객체: 상태(state), 행동(behavior), 식별자(identity) 를 지닌 실체
- 앨리스, 앨리스의 키를 줄이거나 늘리기 위해 사용하는 음료, 케이크, 부채, 버섯
- 프로퍼티: 객체의 상태를 표현하기 위해 사용되는 수단
- 속성, 연관관계
- 프로퍼티는 정적이고 프로퍼티 값은 동적이다.
- 링크: 객체와 객체 사이의 의미 있는 연결 (연관관계는 정적인 관계를 의미하며, 링크는 연관관계의 인스턴스다.)
- 속성(attribute): 객체를 구성하는 단순한 값
- 앨리스의 키, 위치, 케이크의 양
객체의 행동에 의해 객체의 상태가 변경되는것.
객체는 다른 객체와 적극적으로 상호작용하며 '협력하는 객체들의 공동체'에 참여하기 위해 노력한다. 객체가 다른 객체와 협력하는 유일한 방법은 다른 객체에게 요청을 보내는 것이다.
객체는 상태를 캡슐 안에 감춰둔 채 외부로 노출하지 않는다. 객체가 외부에 노출하는 것은 행동뿐이며, 외부에서 객체에 접근할 수 있는 유일한 방법 역시 행동뿐이다.
객체가 식별 가능하다는 것은 객체를 서로 구별할 수 있는 특정한 프로퍼티가 객체안에 존재한다는 것을 의미한다. 이 프로퍼티를 식별자라고 한다.
- 모든 객체가 식별자를 가진다. 객체가 아닌 단순한 값은 식별자를 가지지 않는다.
식별자를 지닌 전통적인 의미의 객체.
- 객체를 상태를 가지며 상태는 변경 가능하다.
- 객체의 상태를 변경시키는 것은 객체의 행동이다.
- 객체는 어떤 상태에 있더라도 유일하게 식별 가능하다.
객체지향의 세계를 창조하는 개발자들의 주된 업무는 객체의 상태를 조회하고 객체의 상태를 변경하는 것이다. [Meyer 2000]
- 쿼리(query): 객체의 상태를 조회
- 명령(command): 객체의 상태를 변경
상태를 먼저 결정하고 행동을 나중에 결정하는 방법은 설계에 나쁜 영향을 준다.
- 상태를 먼저 결정할 경우 캡슐화가 저해된다.
- 객체를 협력자가 아닌 고립된 섬으로 만든다.
- 객체의 재사용성이 저하된다.
협력 안에서 객체의 행동은 결국 객체가 협력에 참여하면서 완수해야 하는 책임을 의미한다. 어떤 책임이 필요한가를 결정하는 과정이 전체 설계를 주도해야 한다.