Search
📖

[객체 지향의 사실과 오해] 2장. 이상한 나라의 객체

1. 객체지향과 인지 능력

객체란 인간이 분명하게 인지하고 구별할 수 있는 물리적인 또는 개념적인 경계를 지닌 것
그러므로 인간은 소프트웨어 객체도 현실세계와 동일한 맥락으로 이해하려고 함
하지만, 실제 소프트웨어 객체의 속성은 현실세계와 다르다.
ex) 전등이 스스로 불켜기

2. 객체, 그리고 이상한 나라

엘리스는 상태를 가지며 상태는 변경 가능하다.
엘리스의 상태를 변경시키는 것은 엘리스의 행동이다.
행동의 결과는 상태에 의존적이며 상태를 이용해 서술할 수 있다.
행동의 순서가 결과에 영향을 미친다.
엘리스는 어떤 상태에 있더라도 유일하게 식별가능하다.

3. 객체, 그리고 소프트웨어 나라

객체란 식별 가능한 객체 또는 사물이다. 자동차처럼 구체적인 사물일 수도 있고 시간처럼 추상적인 개념일 수도 있다. 객체는 구별가능한 식별자, 특징적인 행동, 변경 가능한 상태를 가진다. 소프트웨어 안에서 객체는 저장된 상태와 실행가능한 코드를 통해 구현된다.

3.1 상태

일반적으로 과거에 발생한 행동의 이력을 통해 현재 발생한 행동의 결과를 판단하는 방식은 복잡하고 번거로우며 이해하기 어렵다.
따라서, 인간은 행동의 과정과 결과를 단순하게 예측하기 위해 상태를 사용한다.
ex) 비행기의 탑승 가능 여부는 항공권의 발권 상태를 보면 알 수 있다.
상태를 이용하면 과거의 모든 행동 이력을 설명하지 않고 행동의 결과를 예측 가능하다.
프로퍼티(property) : 객체의 상태를 구성하는 모든 특징 (정적)
앨리스의 키, 위치, 음료
프로퍼티 값(property value) : 프로퍼티의 값 (동적)
앨리스의 키: 130cm
링크(link) : 객체와 객체 사이의 의미있는 연결
속성(attribute) : 객체를 구성하는 단순 값
상태는 특정 시점에 객체가 가지고 있는 정보의 집합으로 객체의 구조적 특징을 표현한다. 객체의 상태는 객체에 존재하는 정적인 프로퍼티와 동적인 프로퍼티 값으로 구성된다. 객체의 프로퍼티는 단순한 값(속성)과 다른 객체를 참조하는 링크로 구분할 수 있다.
객체는 자율적 존재
객체는 다른 객체의 상태에 직접적으로 접근/ 상태 변경 X

3.2 행동

상태와 행동 사이의 관계
객체의 행동은 상태에 영향을 받는다
객체의 행동은 상태를 변경시킨다.
상태의 개념을 이용해 서술가능한 행동의 두가지 관점
상호작용이 현재의 상태에 어떤 방식으로 의존하는가
예) 엘리스의 키(상태)가 40센티미터 이하여야 문을 통과(행동)할 수 있다.
상호작용이 어떻게 현재의 상태를 변경시키는가
문을 통과(행동)한 후에 엘리스 위치(상태) 정원으로 바뀐다.
협력과 행동
객체 자신의 상태 변경
행동 내에서 협력하는 다른 객체에 대한 메시지 전송
행동이란 외부의 요청 또는 수신된 메시지에 응답하기 위해 동작하고 반응하는 활동이다. 행동의 결과로 객체는 자신의 상태를 변경하거나 다른 객체에게 메시지를 전달할 수 있다. 객체는 행동을 통해 다른 객체와의 협력에 참여하므로 행동은 외부에 가시적이어야 한다.
상태 캡슐화
상태를 캡슐안에 감춰둔 채 외부로 노출하지 않음
예시) drinkBeverage() & drunken(quantity) 메시지로는 앨리스의 키가 줄거나 음료의 양이 줄어드는 상태의 변경을 예상할 수 없음
외부로 노출하는 것은 행동이다. 외부에서 객체에 접근할 수 있는 유일한 방법 역시 행동 뿐이다.
상태를 캡슐화 해야하는 이유?
상태를 잘 정의된 행동 집합 뒤로 캡슐화하는 것이 객체의 자율성을 높이고 협력을 단순하고 유연하게 만들기 때문

3.3 식별자

객체를 서로 구별할 수 있는 특정한 프로퍼티가 식별자
단순한 값은 식별자를 가지지 않음 → 값과 객체의 가장 대표적인 차이점
값(value)
변하지 않는 양을 모델링함
값은 상태가 변하지 않음. 불변 상태(immutable state)
예) 숫자, 문자열, 날짜, 시간 , 금액 등
값이 같은지는 상태가 같은지를 이용하여 판단함
동등성(equality) : 상태를 이용해 두 값이 같은지 판단할 수 있는 성질
값 객체(value object)
객체(object)
시간에 따라 변경되는 상태를 포함하며 행동을 통해 상태를 변경함
객체는 가변 상태(mutable state) 를 가진다고 할 수 있음
동일성(identical) : 식별자를 기반으로 객체가 같은지를 판단할 수 있는 성질
참조 객체(reference object), 엔티티(entity)

3.4 Summary

객체는 상태를 가지며 상태는 변경 가능하다.
객체의 상태를 변경시키는 것은 객체의 행동이다.
행동의 결과는 상태에 의존적이며 상태를 이용해 서술할 수 있다.
행동의 순서가 결과에 영향을 미친다.
객체는 어떤 상태에 있더라도 유일하게 식별가능하다.

4. 기계로서의 객체

객체를 기계로서 바라보는 관점은 상태, 행동, 식별자에 대한 시각적인 이미지를 제공하고 캡슐화와 메시지를 통한 협력 관계를 매우 효과적으로 설명한다.

5. 행동이 상태를 결정한다

5.1 상태를 먼저 결정하고 행동을 결정하는 방법이 설계에 나쁜 영향을 끼치는 요인

1.
캡슐화가 저해됨
상태가 객체 내부로 깔끔히 캡슐화되지 않음
공용 인터페이스에 노출된 확률이 높아짐
2.
객체를 협력자가 아닌 고립된 섬으로 만듬
3.
객체의 재사용성이 저하됨
다양한 협력에 참여하기 어려움
객체의 적합성을 결정하는 것은 상태가 아니라 객체의 행동이다
협력안에서 객체의 행동은 결국 객체가 협력을 참여하면서 완수 해야 하는 책임을 의미한다.
따라서 어떤 책임이 필요한가를 결정하는 과정이 전체 설계를 주도 해야한다.
책임-주도 설계 (Responsibility-Driven Design, RDD)

6. 은유와 객체

현실 객체와 소프트 객체의 가장 큰 차이
현실속에서는 수동적인 존재가 소프트웨어 객체로 구현될 때는 능동적으로 변함
소프트웨어 객체는 현실 객체의 부분적인 특징을 모방하는 것이 아님. 현실 객체가 가지지 못한 추가적인 능력을 보유하게 됨
의인화(anthropomorphism) [소프트웨어 객체의 특징, 레베카 워프스브록]
은유(metaphor)
객체 지향의 세계와 현실세계 사이에 유사성은 존재
다만 모방이나 추상화의 수준이 아니라 은유(metaphor)임
은유 관계에 있는 실제 객체의 이름을 소프트웨어 객체의 이름으로 사용하면 표현적 차이를 줄여 소프트웨어의 구조를 쉽게 예측할 수 있다.
현실 객체 차 - 객체 지향 차 car()
객체지향 지침서 - 현실 세계인 도메인에서 사용되는 이름을 객체에 부여하라고 가이드함