세상을 더 작은 객체로 분해하는 것은 본질적으로 세상이 포함하고 있는 복잡성을 극복하기 위한 인간의 작은 몸부림이다. 인간은 좀 더 단순한 객체들로 주변을 분해함으로써 자신이 몸담고 있는 세상을 이해하려고 노력한다. (p.41)
객체지향 패러다임의 목적은 현실 세계를 모방하는 것이 아니라 현실 세계를 기반으로 새로운 세계를 창조하는 것이다. (중략) 현실 세계에서는 사람이 직접 주문 금액을 계산하지만 소프트웨어 세계에서는 주문 객체가 자신의 금액을 계산한다. (p.42)
객체의 정의
객체의 다양한 특성을 효과적으로 설명하기 위해서는 객체를 상태, 행동, 식별자를 지닌 실체로 보는 것이 가장 효과적이다. (p.47)
- 객체란 식별 가능한 개체 또는 사물이다
- 객체는 자동차처럼 만질 수 있는 구체적 사물일 수도 있고, 시간처럼 추상적 개념일 수도 있다
- 객체는
1. 구별 가능한 식별자 2. 특징적인 행동 3. 변경 가능한 상태
를 가진다 - 소프트웨어 안에서 객체는 저장된 상태와 실행 가능한 코드를 통해 구현된다
상태
예로 든 모든 일들의 공통점은 어떤 행동의 결과는 과거에 어던 행동들이 일어났었느냐에 의존한다는 것이다. (p.47)
- 인간은 행동의 과정과 결과를 단순하게 기술하기 위해 상태 라는 개념을 고안함
- 상태를 이용하면, 과거의 모든 행동 이력을 설명하지 않고도 행동의 결과를 쉽게 예측하고 설명 가능
프로퍼티
- 숫자, 문자열, 양, 속도, 시간 등과 같은 단순한 값들은 객체가 아니다
- 단순한 값들은 그 자체로 독립적 의미를 가지기 보다는, 다른 객체의 상태를 표현하는 데 사용됨
- 때로는 단순 값이 아니라 객체를 사용해 다른 객체의 상태를 표현해야 할 수도 있음
- 객체의 상태를 구성하는 모든 특징(단순 값 + 객체)을 통틀어 객체의 프로퍼티라고 한다
링크
- 객체와 객체 사이의 의미 있는 연결을 의미
- 객체 간에는 링크가 존재해야만 요청을 보내고 받을 수 있다
- 링크는 일반적으로 한 객체가 다른 객체의 식별자를 알고 있는 것으로 표현됨
속성
- 링크와 달리 객체를 구성하는 단순 값을 의미
행동
- 객체는 자율적인 존재로, 다른 객체가 현 객체의 상태에 직접 접근하거나 변경할 수 없다
- 객체의 상태를 변경하는 것은 객체의 자발적인 행동뿐이며 이를 통해 객체의 자율성을 유지한다
- 객체가 취하는 행동은 객체 자신의 상태를 변경시킨다
- 이는 행동이 부수 효과(side effect)를 초래한다는 것을 의미한다
상태와 행동 사이의 관계
- 객체의 행동의 결과는 상태에 영향을 받고
- 객체의 행동은 상태를 변경시킨다
행동과 협력
- 객체는 수신된 메시지에 따라 적절히 행동하면서 협력에 참여하고, 그 결과로 자신의 상태를 변경함
- 객체는 협력에 참여하는 과정에서 다른 객체의 상태 변경을 유발할 수도 있다
- 즉, 객체의 행동은 아래의 두 가지 결과를 발생시킬 수 있다
- 객체 자신의 상태 변경
- 행동 내에서 협력하는 다른 객체에 대한 메시지 전송
상태 캡슐화
- 객체지향의 세계에서 모든 객체는 자신의 상태를 스스로 관리하는 자율적인 존재
- 현실 세계의 객체와 객체지향 세계의 객체 사이의 중요한 차이점
- ex) 앨리스가 마신 음료의 양을 줄이는 것은 음료 자신이어야 함
- 객체는 상태를 캡슐 안에 감춰둔 채 외부로 노출하지 않는다 (캡슐화)
- 외부로는 행동만을 노출하고 행동을 통해서만 접근이 가능하도록 한다
- 객체에 메시지를 보내는 객체는 어떤 상태가 어떻게 변경되는지 전혀 알지 못한다
- 메시지를 수신한 객체는 상태를 변경할지, 어떻게 변경할지 스스로 결정한다
- 송신자가 상태 변경을 기대하더라도 수신자가 자신의 상태를 변경하지 않는다면, 송신자가 간섭할 수 있는 어떤 여지도 없다.
- 객체의 자율성이 높아질수록 객체의 지능도 높아진다 -> 협력도 유연하고 간결해진다
식별자
동등성 (equality)
- 상태를 이용해 두 값이 같은지 판단할 수 있는 성질
- ex) 값(value)은 상태를 비교해 같은지를 판단
- 값의 상태가 변하지 않기 때문에 상태를 이용해 동등성을 판단할 수 있다
동일성 (identical)
- 객체는 시간에 따라 변경되는 가변 상태를 포함한다
- 따라서, 특정 시점에 두 객체의 상태가 완전히 똑같더라도 두 객체는 별개의 객체로 다뤄야 함
- 두 객체의 상태가 다르더라도 식별자가 같다면 두 객체를 같은 객체로 판단할 수 있다 -> 동일성
- 식별자는 상태 변경에 독립적
기계로서의 객체
- 쿼리 (query) - 객체의 상태를 조회하는 작업
- 명령(command) - 객체의 상태를 변경하는 작업
- 기계는 버튼으로 제공되는 행동과 디스플레이에 출력되는 상태를 함께 가진다
- 기계의 부품은 금속 안에 감춰져 있기 때문에 기계를 분해하지 않는 한 기계의 내부를 직접 볼 수 없다
- 사람은 기계 외부의 버튼(행동, 메시지)을 통해서만 기계와 상호작용할 수 있다
- 사람이 버튼을 누른다고 사람이 원하는 대로 상태가 변화하지 않는다, 어떻게 상태를 바꿀 지는 기계가 알아서 판단한다.
행동이 상태를 결정한다
객체지향에 갓 입문한 사람들이 가장 쉽게 빠지는 함정은 상태를 중심으로 객체를 바라보는 것이다. 초보자들은 먼저 객체에 필요한 상태가 무엇인지를 결정하고 그 상태에 필요한 행동을 결정한다. (중략) 안타깝게도 상태를 먼저 결정하고 행동을 나중에 결정하는 방법은 설계에 나쁜 영향을 끼친다. (p.64)
상태를 먼저 고려하면
- 캡슐화가 저해된다
- 상태가 API를 통해 노출될 확률이 높아진다
- 객체를 협력에 적합하지 못한 고립된 섬으로 만든다
- 객체의 재사용성이 저하된다
- 상태에 초점을 맞추면 다양한 협력에 참여하기 어려워 재사용성 또한 떨어진다
행동(책임)을 먼저 고려하라
- 객체의 행동은 객체가 협력에 참여하는 유일한 방법
- 따라서 객체가 적합한지를 결정하는 것은 그 객체의 상태가 아니라 행동
- 우리가 애플리케이션 안에서 어떤 행동을 원하느냐가 어떤 객체가 적합한지를 결정함
- 객체지향 설계는 1. 필요한 협력을 생각하고 2. 협력에 필요한 행동을 생각한 후 3. 행동을 수행할 객체를 선택하는 방식으로 진행
- 행동을 결정한 이후에 -> 행동에 필요한 정보가 무엇인지 (즉, 어떤 상태가 필요한지) 결정됨
- 애플리케이션에서
객체의 행동 == 객체가 협력에서 완수해야할 책임
이므로- 결과적으로 어떤 책임이 필요한가를 결정하는 과정이 전체 설계를 주도해야 함
의인화
- 객체지향 세계는 현실 세계의 단순한 모방(혹은 단순화, 추상화)이 아니다
- 소프트웨어 상품은 실제 세계의 상품이 하지 못하는 가격 계산과 같은 행동을 스스로 할 수 있다
- 현실 속에서는 수동적인 존재가 소프트웨어 객체로 구현될 때는 능동적으로 변한다
- 현실의 객체보다 더 많은 일을 할 수 있는 소프트웨어 객체의 특징을 의인화라고 한다
모든 생물처럼 소프트웨어는 태어나고, 삶을 영위하고, 그리고 죽는다
(Wirfs-Brock 1990)
은유
- 현실 세계와 객체지향 세계 사이의 관계를 좀 더 정확하게 설명할 수 있는 단어 (은유)
- 현실 속 객체의 의미 일부가 소프트웨어 객체로 전달되기 때문에 프로그램 내의 객체는 현실 속 객체에 대한 은유
- 은유 관계에 있는 현실 세계의 객체 이름을 소프트웨어 객체의 이름으로 사용하면 표현적 차이를 줄여 소프트웨어의 구조를 쉽게 예측할 수 있다
- 이는 이해하기 쉽고, 유지보수가 용이한 소프트웨어 제작에 도움이 된다
우리의 목적은 현실을 모방하는 것이 아니다. 단지 이상한 나라를 창조하기만 하면 된다. 현실을 닮아야 한다는 어떤 제약이나 구속도 없다. (p.71)
질문
- p.50 - 프로퍼티와 프로퍼티 값의 차이
- p.57 - 값의 상태는 결코 변하지 않는다 -> 값은 상수를 의미하는지? 리터럴?
이 게시글은 스터디에서 [ 객체지향의 사실과 오해 / 조영호 ] 책을 읽고 중요한 내용을 잊지 않기 위해 정리한 게시글입니다. 요약 및 생략된 내용이 많고 제가 이해한 대로 다시 정리한 내용이라 보다 자세하고 정확한 설명은 책 구매를 권장합니다.