< 객체지향과 인지능력 > 


인간이 직접적으로 지각할 수 있는 대부분의 객체는 물리적인 경계를 지닌 구체적인 사물

그러나 인간의 인지능력은 개념적으로 경계 지을 수 있는 추상적인 사물까지도 객체로 인식할 수 있게 한다.


ex) 주문과 계좌이체

물리적인 실체는 없지만 인간이 쉽게 구분하고 하나의 단위로 인지할 수 있는 개념적인 객체의 일종


즉, 객체란?

인간이 분명하게 인지하고 구별할 수 있는 물리적인 개념 또는 경제적인 경계를 지닌 어떤 것.



객체지향 패러다임의 목적

- 현실 세계를 모방하는 것이 아니라 현실 세계를 기반으로 새로운 세계를 창조하는 것






< 객체, 그리고 이상한 나라 > (앨리스로 설명)


앨리스 객체

ex) 앨리스는 케이크를 먹거나 버섯을 먹으면 커지거나 작아지고 

먹는 행동에 따라 앨리스의 상태가 변한다.


- 즉,  앨리스의 상태를 결정하는 것은 행동, 행동의 결과를 결정하는 것은 상태다


ex) 부채질을 하면 키가 20센티 줄어든다.

키가 280이였는데 20센티 줄어들면 260이 된다.



- 앨리스가 먹거나, 부채질을 하기 전의 키가 얼마였느냐가

  먹거나 부채질을 한 후의 앨리스의 키를 결정한다

- 따라서 앨리스가 한 행동의 결과는 앨리스의 상태에 의존적이다.


 ex) 앨리스의 키가 커지든 작아지든 사람들은 앨리스라 부른다.

- 앨리스는 상태 변경과 무관하게 유일한 존재로 식별 가능하다.



앨리스의 특징 (객체의 특성)

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

2. 상태를 변경시키는 것은 행동이다.

행동의 결과는 상태에 의존적이며 상태를 이용해 서술할 수 있다.

행동의 순서가 결과에 영향을 미친다.

3. 어떤 상태에 있더라도 유일하게 식별이 가능하다.






< 객체, 그리고 소프트웨어 나라 >


객체의 특성을 효과적으로 설명하기 위해서

객체를 상태(state), 행동(behavior), 식별자(identity)를 지닌 실체로 보는 것이 효과적



!!! 이 책에서의 객체의 정의 !!!

- 객체란 식별 가능한 개체 또는 사물이다.

- 객체는 만질 수 있는 구체적인 사물일 수도 있고, 시간처럼 추상적인 개념일 수 도 있다.

- 객체는 구별가능한 식별자, 특징적인 행동, 변경 가능한 상태를 가진다.

소프트웨어 안에서 객체는 저장된 상태와 실행 가능한 코드를 통해 구현된다.



상태 (state)


왜 상태가 필요한가


ex)  항공권 발권해야 비행기 탑승

자판기에 돈 넣어야 음료수 선택가능

엘리베이터의 버튼을 눌러야 층 이동

티비 전원을 켜야 채널변경 가능

운전하려면 시동 걸어야 함


- 어떤 행동의 결과는. 과거에 어떤 행동들이 일어났었느냐에 의존한다.

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

- 상태를 이욯하면. 과거에 얽매이지 않고 현재를 기반으로 객체의 행동 방식을 이해할 수 있다.

- 상태는 근본적으로 세상의 복잡성을 완화하고 인지 과부하를 줄일 수 있는 중요한 개념


상태와 프로퍼티

세상에 존재하는 모든 것들이 객체인 것은 아니다.


ex) 객체가 아닌것 

- 앨리스의 키와 위치, 음료의 양, 문이 열려있는 여부, 토끼가 달려가는 속도


그 자체로 독립적인 의미를 가지기보다 다른 객체의 상태를 표현하는데 사용되는 것

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


프로퍼티는 변경되지 않고 고정되기 때문에 정적

프로퍼티 값은 변경되기 때문에 동적




ex) 앨리스 (키 : 130cm, 위치:통로) --------  음료 (양 : 0.5L)


앨리스의 키와 위치는 단순한 값으로 표현되기 때문에 속성(attribute)

객체의 프로퍼티는 단순한 값인 속성과 다른 객체를 가리키는 링크라는 두 가장 종류의 조합으로 표현



!!! 이 책에서의 객체의 상태 !!!

- 상태는 특정 시점에 객체가 가지고 있는 정보의 집합으로 객체의 구조적 특징을 표현

- 객체의 상태는 객체에 존재하는 정적인 프로퍼티동적인 프로퍼티 값으로 구성

- 객체의 프로퍼티는 단순한 값과 다른 객체를 참조하는 링크로 구분할 수 있음




행동 (behavior)


상태와 행동


- 객체의 상태를 변경하는 것은 객체의 자발적인 행동뿐

- 객체가 취하는 행동은 자신의 상태를 변경시킨다.


ex) 음료를 마시고 커지거나 작아짐


- 객체의 행동에 의해 객체의 상태가 변경된다는 것은 

  행동이 부수효과(side effect)를 초래한다는 것을 의미




상태와 행동사이의 관계

- 객체의 행동은 상태에 영향을 받는다.

ex) 마시는 이유는 문보다 키가 커서


- 객체의 행동은 상태를 변경시킨다.

ex) 마셔서 키가 작아졌다


협력과 행동

객체가 다른 객체가 협력하는 유일한 방법은 다른 객체에게 요청을 보내는 것


!!! 이 책에서의 행동의 정의 !!!

- 행동이란, 외부의 요청 또는 수신된 메시지에 응답하기 위해 동작하고 반응하는 활동

- 행동의 결과로 객체는 자신의 상태를 변경하거나, 다른객체에게 메시지를 전달 할 수 있다.

- 객체는 행동을 통해 다른 객체와의 협력에 참여하므로 외부에 가시적이어야 한다.



상태 갭슐화

ex) 앨리스가 음료를 마신다.


여기서 음료는 스스로 아무것도 할 수 없는 수동적인 존재이지만

객체지향의 세계에서 모든 객체는 자신의 상태를 스스로 관리하는 자율적인 존재다.


키를 작게 만드는 것이 앨리스 자신인 것처럼, 음료 객체의 양을 줄이는 것은 음료 자신이여야 한다.


앨리스는 자신이 마신 양만큼 음료의 양을 줄여달라고 메시지를 전송한다.

음료의 양이 줄어들 것인지는 수신한 음료가 결정한 사항이고, 엘리스와 무관하다.

단지 앨리스는 음료의 양이 줄어들것이라고 믿고 요청할 뿐이다.



--- drinkBeverage() -->  [앨리스] --- drunken(quantity)---> [음료]



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

이것이 캡슐화


객체는 상태를 캡슐안에 감춰둔 채 외부로 노출하지 않는다.

객체가 노출하는 것은 행동뿐이며, 외부에서 객체에 접근할 수 있는 유일한 방법도 행동뿐이다.


상태를 외부에 노출하지 않고 행동을 경계로 캡슐화하는 것은

결과적으로 객체의 자율성을 높인다.

자율정인 객체는 스스로 판단하고, 스스로 결정하기 대문에 객체의 자율성이 높아질수록 지능도 높아진다.

협력에 참여하는 객체들의 지능이 높아질 수록 협력은 유연하고 간결해진다.


즉, 상태를 캡슐화해야하는 이유는

상태를 잘 정의된 행동 집합 뒤로 캡슐화 하는 것은 

객체의 자율성을 높이고 협력을 단순하고 유연하게 만든다. 


식별자 (identity)

객체를 서로 구별할 수 있는 특정한 프로퍼티를 식별자라고 한다.

모든 객체는 식별자를 가지고, 객체가 아닌 단순한 값은 식별자를 가지지 않는다.



식별자란

- 어떤 객체를 다른 객체와 구분하는데 사용하는 객체의 프로퍼티 값은 식별자를 가지지 않기때문에 

  상태를 이용한 동등성 검사를 통해 두 인스턴스를 비교해야 한다.

- 객체는 상태가 변경될수 있기 때문에 식별자를 이용한 동일성 검사를 통해 두 인스턴스를 비교할 수 있다.


객체의 특성 ( 앨리스의 특징과 동일 )

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

2. 상태를 변경시키는 것은 행동이다.

행동의 결과는 상태에 의존적이며 상태를 이용해 서술할 수 있다.

행동의 순서가 결과에 영향을 미친다.

3. 어떤 상태에 있더라도 유일하게 식별이 가능하다.




< 행동이 상태를 결정한다 >

상태를 먼저 결정하고 행동을 나중에 결정하는 방법은 설계에 나쁜 영향을 준다.


1. 상태를 먼저 결정할 경우 캡슐화가 저해된다.

- 상태가 객체 내부로 깔끔하게 캡슐화되지 못하고 공용 인터페이스에 그대로 노출되버릴 확률이 높다.

2. 객체를 협력자가 아닌 고립된 섬으로 만든다.

3. 객체의 재사용성이 저하된다.


행동에 초점을 맞춰라. 객체는 다른 객체와 협력하기 위해 존재한다.

+ Recent posts