02. 이상한 나라의 객체
객체지향과 인지 능력
객체란 인간이 분명하게 인지하고 구별할 수 있는 물리적인 또는 개념적인 경계를 지닌 어떤 것이다.
소프트웨어의 세계는 인간이 인지할 수 있는 다양한 소프트웨어 객체들이 모여 이뤄져 있다.
객체, 그리고 이상한 나라
- 앨리스의 특징
- 상태를 가지며 상태는 변경 가능
- 앨리스의 상태를 변경시키는 것은 앨리스의 행동
- 행동의 결과는 상태에 의존적이며 상태를 이용해 서술 가능
- 행동의 순서가 결과에 영향을 미침
- 어떤 상태에 있더라도 유일하게 식별 가능
객체, 그리고 소프트웨어 나라
객체의 다양한 특성을 효과적으로 설명하기 위해서는 객체를
상태(state)
,행동(behavior)
,식별자(identity)
를 지닌 실체로 보는 것이 가장 효과적이상한 나라의 앨리스는 상태, 행동, 식별자를 지닌 실체다.
객체란?
식별 가능한 개체 또는 사물이다.
- 객체는 자동차처럼 구체적인 사물일 수도, 시간처럼 추상적인 개념일 수도 있다.
- 객체는 구별 가능한 식별자, 특징적인 행동, 변경 가능한 상태를 가진다.
상태
어떤 행동의 결과는 과거에 어떤 행동들이 일어났었느냐에 의존한다.
상태
를 이용하면 과거에 얽매이지 않고 현재를 기반으로 객체의 행동 방식을 이해할 수 있다.- 객체의 상태를 구성하는 모든 특징을 통틀어 객체의
프로퍼티
라고 한다.- 프로퍼티는 변경되지 않고 고정되어
정적
이다. - 반면 프로퍼티 값은 시간이 프름에 따라 변경되기 때문에
동적
이다.
- 프로퍼티는 변경되지 않고 고정되어
- 객체와 객체 사이의 의미 있는 연결을
링크(link)
라고 한다.- 객체의 링크를 통해서만 메시지를 주고 받을 수 있다.
- 링크는 객체가 다른 객체를 참조할 수 있다는 것을 의미
- 한 객체가 다른 객체의 식별자를 알고 있는 것으로 표현
객체를 구성하는 단순한 값은
속성(attribute)
- 객체의 프로퍼티는 단순한 값인
속성
과 다른 객체를 가리키는링크
라는 두 가지 종류의 조합으로 표현할 수 있다.
객체의 상태란?
특정 시점에 객체가 가지고 있는 정보의 집합으로 객체의 구조적 특징을 표현한다.
- 객체에 존재하는 정적인 프로퍼티와 동적인 프로퍼티 값으로 구성
- 객체의 프로퍼티는 단순한 값과 다른 객체를 참조하는 링크로 구분
행동은 다른 객체로 하여금 간접적으로 객체의 상태를 변경하는 것을 가능하게 한다.
객체지향의 기본 사상은 상태와 상태를 조작하기 위해 행동을 하나의 단위로 묶는 것!
객체는 스스로의 행동에 의해서만 상태가 변경되는 것을 보장함으로써 객체의 자율성을 유지
행동
상태와 행동
- 객체의 행동은 객체의 상태를 변경시키지만 행동의 결과는 객체의 상태에 의존적이다.
- 상태와 행동 사이의 관계
- 객체의 행동은 상태에 영향을 받는다.
- 객체의 행동은 상태를 변경시킨다.
- 상태의 개념을 이용해 행동을 서술
- 상호작용이 현재의 상태에 어떤 방식으로 의존하는가
- 상호작용이 어떻게 현재의 상태를 변경시키는가
- 객체는 다른 객체와 적극적으로 상호작용하며
협력하는 객체들의 공동체
에 참여하기 위해 노력한다.
협력과 행동
- 객체의 행동으로 인해 발생하는 결과
- 객체 자신의 상태 변경
- 행동 내에서 협력하는 다른 객체에 대한 메시지 전송
행동이란?
외부의 요청 또는 수신된 메시지에 응답하기 위해 동작하고 반응하는 활동이다.
- 행동의 결과로 객체는 자신의 상태를 변경하거나 다른 객체에세 메시지를 전달할 수 있다.
- 객체는 행동을 통해 다른 객체와의 협력에 참여하므로 행동은 외부에 가시적이어야 한다.
상태 캡슐화
객체는 상태를 캡슐 안에 감춰둔 채 외부로 노출하지 않는다.
객체가 외부에 노출하는 것, 외부에서 객체에 접근할 수 있는 것은 행동뿐이다.
상태를 잘 정의된 행동 집합 뒤로 캡슐화하는 것은 객체의 자율성을 높이고 협력을 단순하고 유연하게 만든다.
식별자
객체를 서로 구별할 수 있는 특정한 프로퍼티(
식별자
)가 객체 안에 존재한다.값(value)은 불변 상태(immutable state) , 객체는 가변 상태(mutable state)
동등성(equality) : 상태를 이용해 두 값이 같은지 판단할 수 있는 성질
동일성(identical) : 식별자를 기반으로 객체가 같은지를 판단할 수 있는 성질
식별자란?
어떤 객체를 다른 객체와 구분하는 데 사용하는 객체의 프로퍼티
- 값은 식별자를 가지지 않기 때문에 상태를 이용한 동등성 검사를 통해 두 인스턴스를 비교해야 한다.
- 객체는 상태가 변경될 수 있기 때문에 식별자를 이용한 동일성 검사를 통해 두 인스턴스를 비교할 수 있다.
객체의 특성
객체는 상태를 가지며 상태는 변경 가능하다. 객체의 상태를 변경시키는 것은 객체의 행동이다. - 행동의 결과는 상태에 의존적이며 상태를 이용해 서술할 수 있다. - 행동의 순서가 실행 결과에 영향을 미친다. 객체는 어떤 상태에 있더라도 유일하게 식별 가능하다.
기계로서의 객체
- 일반적으로 객체의 상태를 조회하는 작업을
Query
객체의 상태를 변경하는 작업을
Command
라고 한다.- 객체를 기계로서 바라보는 관점은 상태, 행동, 식별자에 대한 시각적인 이미지를 제공하고 캡슐화와 메시지를 통한 협력 관계를 매우 효과적으로 설명한다.
행동이 상태를 결정한다.
- 상태를 먼저 결정하고 행동을 나중에 결정하는 방법은 설계에 나쁜 영향을 끼친다.
- 상태를 먼저 결정할 경우 캡슐화가 저해된다
- 객체를 협력자가 아닌 고립된 섬으로 만든다.
- 객체의 재사용성이 저하된다.
협력에 참여하는 훌륭한 객체 시민을 양성하기 위한 가장 중요한 덕목은 상태가 아니라 행동에 초점을 맞추는 것!
객체의 적합성을 결정하는 것은 상태가 아니라 객체의 행동이다.
- 객체의 행동을 결정하고 그 후에 행동에 적절한 상태를 선택하자.
은유와 객체
의인화
- 현실 속에서는 수동적인 존재가 소프트웨어 객체로 구현될 때는 능동적으로 변한다.
- 현실 객체가 가지지 못한 추가적인 능력을 보유하게 된다.
객체지향 세계는 현실의 모습을 조금 참조할 뿐 궁극적인 목적은 현실과 전혀 다른 새로운 세계를 창조하는 것이다.
- 객체지향의 세계는 현실의 추상화가 아니다. 객체지향 세계의 거리는 현실 속의 객체보다 더 많은 특징과 능력을 보유한 객체들로 넘쳐난다,
은유
- 현실 속의 객체의 의미 일부가 소프트웨어 객체로 전달되기 때문에 프로그램 내의 객체는 현실 속의 객체에 대한
은유
다 - 현실 세계인 도메인에서 사용되는 이름을 객체에게 부여하자.
현실 속의 객체의 이름을 이용해 객체를 묘사하고 우리들 만의 새로운 세계를 창조해보자.