본문 바로가기

기술 서적/객체지향의 사실과 오해

[객체지향의 사실과 오해] ch2. 이상한 나라의 객체 / 상태 -행동 -식별자

목차

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

2. 객체 : 상태+ 행동+식별자

3. 행동 초점의 객체 설계 : 행동이 상태를 결정한다

4. 소프트웨어는 현실의 모방이 아니다 : 의인화+은유


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

 

>> 앨리스 객체

- 앨리스의 상태(키)를 결정하는 것은 행동임

- 행동의 결과로 상태가 영향을 받음

- 행동의 성공여부(문을 열고 들어감)는 이전에 어떤 행동들이 발생했는지(음료, 케잌 등등)에 영향을 받음

 

요약

1) 앨리스는 상태를 가지며 상태는 변경가능하다
- 키/ 위치 등은 변경가능함

2) 앨리스의 상태를 변경시키는 것은 앨리스의 행동이다.
- 행동의 결과는 상태에 의존하며 상태를 통해 서술가능하다
- 행동의 순서가 결과에 영향을 미친다.

3) 앨리스는 어떤 상태에 있더라도 유일하게 식별가능하다

 


2. 객체 : 상태 + 행동 + 식별자

 

객체는 상태, 행동 식별자를 지닌 실체이다.

 

>> 객체의 정의

- 식별가능한 개체 or 사물
- 물리적 사물 + 추상적인 개념 like 시간
- 구별가능한 식별자 + 특징적인 행동 + 변경가능한 상태를 가짐

 

>> 상태

 

--왜 상태가 필요한가?

: 어떤 행동의 결과는 과거에 어떤 행동이 일어났는가에 의존한다.

: 그 행동의 과정과 결과를 단순하게 기술한 것이 상태이다.

=> 즉, 상태를 이용하면 모든 행동이력을 설명하지 않고도 결과를 쉽게 예측

=> 복잡성을 완화

 

--상태와 프로퍼티

: 객체의 상태 = 단순한 값 + 객체들의 조합

: 프로퍼티 (정적) : 상태를 구성하는 모든 특징  => but, 프로퍼티 값은 시간에 다라 변하기 때문에 동적임

 

ex)

앨리스의 프로퍼티인 키와 위치는 정적이다.

그러나, 앨리스의 키가 가진 '값'은 매번 변하는 동적인 특성이 있다.

 

-- 프로퍼티의 구성 : 링크 + 속성

1) 링크 : 객체 사이의 의미있는 연결 => 메시지를 주고받는 통로

2) 속성 : 객체를 구성하는 단순한 값

 

 


>>행동

 

: 행동은 상태를 변화시킨다. => 부수효과를 초래한다.

: 행동은 상태에 영향을 받는다.

=> 즉, 상호작용에 있어 행동의 원인과 결과에 '상태'가 있다.

 

원인이 되는 상태A  ---------------> 행동 ---------------> 행동의 결과인 상태B

 

-- 협력과 행동

: 객체는 협력하는 객체들의 공동체에 참여하기 위해 노력한다.

: 협력의 유일한 방법은 요청을 보내고 --> 그 요청에 따른 행동을 하는 것

 

[객체의 행동으로 발생하는 결과]
1) 객체 자신의 상태 변경
2) 협력 객체에 메시지 전송

 

 

--상태 캡슐화

: 상태를 외부로 노출시키지 않고 행동을 경계로 감싸는 것

: 모든 객체는 자신의 상태를 스스로 관리하는 자율적 존재

 

ex)

앨리스는 음료의 상태를 변경하지 못한다.

음료에게 마셨다는 메시지만을 전달할 수 있다.

음료의 상태를 변경시키는 것은 음료 객체 자신의 몫이다.

 

: 메시지 송신자는 수신자의 상태 변경에 대해 알지 못한다.

=> 그저 요청을 보낼 뿐

 

: 외부에 노출하는 것은 행동뿐이며, 외부에서 객체에 접근하는 유일한 방법 역시 행동뿐이다.

=> 객체의 자율성을 높임 + 협력을 유연하게 만듦

 

 


>>식별자

: 객체를 서로 구별할 수 있는 특정 프로퍼티

 

1) 동등성(equality) : 상태를 기준으로 같음 여부를 판단 => 단순한 값

2) 동일성(identical) : 식별자를 기준으로 같음 여부를 판단=> 객체

 

: 객체는 상태가 변경가능한 가변상태이기에 식별자를 통해 판단

: 즉, 상태가 같아도 식별자가 다르면 다른 객체임

: 또한, 시간이 지나 상태가 달라도 식별자가 같으면 같은 객체로 판단

 


 

[상태 , 행동, 식별자 요약]

1)  객체는 상태를 가지며 상태는 변경가능하다 ex) 앨리스의 키

2) 행동은 상태를 변경한다.
- 행동의 결과는 상태 의존적이며 상태를 이용해 서술가능하다
- 행동의 순서가 결과에 영향을 미친다.

3) 객체는 어떤 상태에 있더라도 유일하게 식별가능하다

3. 행동 초점의 객체 설계 : 행동이 상태를 결정한다

 

: 초보들의 가장 큰 실수는 상태를 중심으로 객체를 바라보는 것

: 상태를 결정 -> 상태에 따른 행동을 결정하는 태도

[상태를 먼저 결정하면 겪게 되는 문제점]

1. 캡슐화 저해
: 공용 인터페이스에 그대로 노출되어 버릴 확률이 높음
=> 기능에 따라 public이나 getter로 접근해야하는 경우가 많아짐

2. 객체의 협력 저해
: 협력이라는 문맥에서 벗어난 설계가 될 가능성이 높아짐

3. 객체의 재사용성 저하
: 재사용성 from 다양한 협력에 참여할 수 있는 능력
: 상태에 초점이 맞추어진 객체는 다양한 협력에 참여가 힘듦 (기능이 아닌 상태기 때문에)

 

=> 따라서, 객체는 행동에 초점을 맞추어야 함

 

: 어떤 행동을 원하느냐가 어떤 객체가 적합한지를 결정함

ex) 원하는 기능에 따른 큐/ 스택 등 자료구조의 선택

객체지향 설계는 애플리케이션에 필요한 1)협력을 생각하고,
협력에 필요한 2)행동을 생각한 후,
행동을 수행할 3)객체를 선택하는 방식으로 수행된다.

 

즉, 협력 => 협력에 필요한 행동 => 행동 초점의 객체 순으로 설계

=====> "행동이 상태를 결정하기 때문"


4. 소프트웨어는 현실모방이 아니다 : 의인화 + 은유

 

: 객체지향의 세계는 현실의 단순한 모방이 아니다.

: 궁극적인 목적은 현실과 전혀 다른 새로운 세계를 창조하는 것

 

>> 의인화

: (현실)수동적인 존재 => (소프트웨어) 능동적 존재

: 즉, 현실에서 가지지 못한 추가적인 능력을 보유하게 됨

 

>>은유 : 표현적 차이 + 의미적 차이

: 현실 속 객체의 의미 일부가 소프트웨어 객체로 전달됨

=> 객체의 이름을 현실 객체로 하여 표현적 차이를 줄여 구조를 쉽게 예측 가능

=> 창조한 객체의 특성을 상기시키는 이름을 이용해 객체를 묘사

=> 객체지향 지침서에서 현실 세계인 도메인에서 사용되는 이름을 객체에 부여하라고 가이드하는 이유