본문 바로가기

카테고리 없음

객체지향의 사실과 오해 (이상한 나라의 객체)

객체지향은 세상을 자율적이고 독립적인 객체들로 분해할 수 있는
인간의 기본적인 인지 능력을 기반으로 두고 있다.

 

객체지향과 인지 능력

인간은 직접적으로 지각할 수 있는 대부분의 객체는 물리적인 경계를 지닌 구체적인 사물이다. 그러나 인간의 인지 능력은 물리적인 한계를 넘어 추상적인 사물까지도 객체로 인식할 수 있다. 
거래라는 객체는 물리적으로는 존재하지는 않지만 인간이 쉽게 구분하고 하나의 단위로 인지할 수 있는 개념적인 객체의 일종이다.

 

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

 

객체지향의의 목적은 현실 세계를 모방하는 것이 아닌 현실 세계를 기반으로 한 새로운 세계를 기반으로 새로운 세계를 창조하는 것이다. 따라서 소프트웨어 세계에서 살아가는 객체는 현실 세계에 존재하는 객체와는 전혀 다른 모습을 보이는 것이 일반적이다.

 

객체 그리고 이상한 나라

객체의 상태는 왜 필요한가 

 

객체가 주변 환경과의 상호작용에 어떻게 반응하는가는 그 시점까지 객체에 어떤 일이 발생했느냐에 좌우된다. 

취업을 위해 스펙을 쌓는 것 또한 상태라고 할 수 있다. 어떤 학교를 졸업했는지 , 어떤 자격증을 가지고 있는지 등 
취업 담당자 입장에서는 지원자를 한명한명씩 그 사람의 인생을 살펴보는 것은 매우 힘들다 그렇기 때문에 그런 과정을 한 번에 압축할 수 있는 스펙이라는 상태를 보이는 것이다. 

 

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

 

하지만 일반적으로 과거에 발생한 행동의 이력을 통해 현재 발생한 행동의 결과를 판단하는 방식은 복잡하고 번거롭다.

따라서 인간은 행동의 과정과 결과를 단순하게 기술하기 위해 상태라는 것을 고안했다. 

 

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

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

 

상태와 프로퍼티

 

세상에 존재하는 모든 것들이 객체인 것은 아니다. 케이크의 "양", 문이 열려있는지 "여부" 는 객체가 아니다.
숫자, 문자열, 양 , 속도 , 시간 , 날짜, 참 /거짓과 같은 단순한 값들은 객체가 아니다.  

이러한 단순한 값들은 그 자체로 독립적인 의미를 가지는 것이 아니라 다른 객체의 특성을 표현하는 데 사용된다. 

다시 말해 객체의 상태를 표현하기 위해 사용된다.

 

모든 객체의 상태는 단순한 값과 객체의 조합으로 표현할 수 있다. 이때 객체의 상태를 구성하는 특징을 통들어 객체의

프로퍼티(property)라고 한다. 

일반적으로 프로퍼티는 변경되지 않고 고정되기 떄문에 "정적"이지만 프로퍼티의 값은 시간의 흐름에 따라 변경되기 때문에 "정적"이다. 

 

상태와 행동 

 

객체의 상태는 저절로 변경되지 않는다. 객체의 상태를 변경시키는 것은 객체의 자발적인 행동 뿐이다. 

객체가 취하는 행동은 객체 자신의 상태를 변경시킨다. 객체의 행동을 통해 객체의 상태가 변경된다면 부수 효과

가 발생한다는 것을 인지하라 

 

사람이 문을 통과하는 행동은 사람의 위치를 변화시키는 부수 효과를 초래한다. 하지만 사람의 키가 너무 크다면 문을 통과할 수 없을 것이다. 따라서 상태와 행동의 사이에는 다음과 같은 관계가 있다. 

 

  • 객체의 행동은 상태에 영향을 받는다.
  • 객체의 행동은 상태를 변경시킨다.

 

협력과 행동 

 

어떤 객체도 섬이 아니다. 객체는 자신에게 주어진 책임을 완수하기 위해 다른 객체들과 충분히 협력적이여야 한다. 

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

요청을 수신한 객체는 요청을 처리하기 위해 적절한 방법에 따라 행동한다. 

 

객체는 다른 객체와 메시지를 통해서만 의사소통할 수 있다는 것을 기억하라. 

 

객체는 협력에 참여하는 자신 뿐만아니라 협력에 참여하는 다른 객체의 상태 변경을 유발할 수 있다. 

앨리스가 음료를 마시면 자신의 키가 작아지는 동시에 엘리스가 먹은 양만큼 음료의 양이 줄어들어야 한다. 

 

객체의 행동은 두 가지 관점의 부수효과를 명확하게 서술해야 한다. 

 

  • 객체 자신의 상태 변경
  • 행동 내에서 협력하는 다른 객체에 대한 메시지 전송 

 

상태 캡슐화 

 

현실 세계와 객체 지향 세계의 중요한 차이점은 음료수를 마시는 앨리스는 능동적인 존재이지만 음료는 스스로 아무것도 할 수없는 수동적인 존재이다.

 

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

즉 음료를 마신 앨리스는 음료의 상태를 변경시킬 수 없다 단지 메시지만 던질 뿐이다.  음료의 양을 줄이는 것은 음료 본인의 몫이다. 

 

 

위의 그림을 보고 앨리스의 키가 변한다거나 음료의 양이 줄어든다는 상태 변경을 예상할 수 있는가? 메시지 송신자는 메시지 수신자의 상태 변경에 대해서는 전혀 알지 못한다. 

 

이것이 캡슐화가 의미하는 것이다. 객체의 상태를 캡슐 안에 감춰둔 채 외부로 노출하지 않는다. 객체가 외부에 노출하는 것은 행동 뿐이다. 

 

객체의 상태를 외부에 유출시키지 않는 캡슐화는 결과적으로 객체의 자율성을 높인다. 자율적인 객체는 스스로 결정하기 때문에 객체의 자율성이 높아질수록 객체의 지능도 높아진다. 협력에 참여하는 객체들의 지능이 높아질수록 협력은 유연하고 간결해진다.

 

이것이 상태를 캡슐화해야하는 이유이다.  

 

 

행동이 상태를 결정한다. 

객체지향에 갓 입문한 사람이 가장 쉽게 빠지는 함정은 상태를 중심으로 객체를 바라보는 것이다. 

 

상태를 먼저 결장할 경우 3가지의 나쁜 영향을 끼친다. 

 

1. 상태를 먼저 결정할 경우 캡슐화가 저해된다. 상태에 초점을 맞출 경우 상태가 객체 내부로 깔끔하게 캡슐화되지 못하고 공용 인터페이스에 그대로 노출되버릴 확률이 높아진다. 

 

2.