객체지향과 인지 능력
인간은 직접적으로 지각할 수 있는 사물을 넘어 추상적인 사물까지도 객체로 인식할 수 있는 능력이 있다. 어제 주문내역과 오늘 주문내역을 구분하는 것, 출금 계좌에서 동일한 입금 계좌로 동일한 금액을 두 번 이체하더라도 구분이 가능하다.
물리적인 실체는 존재하지 않더라도 인간이 쉽게 구분하고 하나의 단위로 인지할 수 있는 개념적인 객체의 일종이다.
복잡한 세상에서 인간은 좀 더 단순한 객체들로 주변을 분해함으로써 세상을 이해하려고 노력한다.
즉, 객체란 인간이 분명하게 인지하고 구별할 수 있는 물리적인 또는 개념적인 경계를 지닌 어떤 것이다.
객체지향 패러다임은 인간이 인지할 수 있는 다양한 객체들이 모여 현실 세계를 이루는 것처럼 소프트웨어의 세계 역시 인간이 인지할 수 있는 다양한 소프트웨어 객체들이 모여 이뤄져 있다는 믿음에서 출발한다.
객체지향 패더라임의 목적은 현실 세계를 모방하는 것이 아니라 현실 세계를 기반으로 새로운 세계를 창조하는 것이다. 따라서 현실 세계 객체와 소프트웨어 세계의 객체와는 전혀 다른 모습을 보이는 것이 일반적이다.
예로 현실세계 전등은 사람없이 껏다 킬수 없다. 소프트웨어 전등은 자동으로 가능하다.
객체, 그리고 이상한 나라
이상한 나라의 앨리스
앨리스 이야기로 예시를 든다. 이야기 내용을 요약하면,
작은 문을 통과하기 위해, 주변 음식을 먹으면서 몸집을 줄였다가 늘렸다 한다.
앨리스 객체
앞의 이야기는 앨리스가 겪고 있는 키의 변화에 초점을 맞추고 있다.
앨리스는 정원으로 가기 위해 자신의 키 상태 를 계속 변화시켰다.
이런 상태변화는 앨리스의 행동이다. 앨리스 행동에 따라 앨리스 상태가 변한다.
상태를 결정하는 것은 행동이지만 행동의 결과를 결정하는 것은 상태이다.
예를들어, 앨리스 키 130cm 여기에 케이크를 먹어서 150cm가 커졌다. 그럼 원래 상태 130cm + 150cm
총 280cm가 된다.
즉, 앨리스가 한 행동의 결과는 앨리스의 상태에 의존적이다.
어떤 행동의 성공 여부는 이전에 어떤 행동들이 발생했는지에 영향을 받는다는 사실도 중요하다
앨리스가 문을 성공적으로 통과하기 위해서는 문을 통과할 수 있을 정도로 충분히 몸을 작게 중여야 한다. 따라서 앨리스는 문을 통과하기 전에 먼저 키를 작게 줄이기 위해 병 안의 음료나 케이크를 먹어야 한다.
이것은 행동 간의 순서가 중요하다는 것을 의미한다. 문을 통과하는 행동이 성공하려면 음료나 케이크를 먹는 행동이 선행돼야만 한다.
객체, 그리고 소프트웨어 나라
물리적인 또는 개념적인 사물은 어떤 것이라도 객체가 될 수 있다.
인간의 인지 능력 안에서 개수를 셀 수 있고, 다른 사물과 구분할 수 있으며, 생성 시점을 알 수 있고, 독립적인 하나의 단위로 인식할 수 있는 모든 사물은 객체다.
객체의 다양한 특성을 효과적으로 설명하기 위해선 객체를 상태(state), 행동(behavior), 식별자(identity)를 지닌 실체로 보는 것이 가장 효과적이다.
이 책에서 객체를 다음과 같이 정의한다.
객체란 식별 가능한 개제 또는 사물이다. 객체는 자동차처럼 만질 수 있는 구체적인 사물일 수도 있고, 시간처럼 추상적인 개념일 수도 있다. 객체는 구별 가능한 식별자, 특징적인 행동, 변경 가능한 상태를 가진다. 소프트웨어 안에서 객체는 저장된 상태와 실행 가능한 코드를 통해 구현된다.
상태
왜 상태가 필요한가
객체가 주변 환경과의 상호작용에 어떻게 반응하는가는 그 시점까지 객체에 어떤 일이 발생했느냐에 좌우된다.
예를들어 비행기를 이용하려면 탑승 전에 발권이 필수다.
자판기에 음료를 먹기위해서는 충분한 돈을 넣어야 한다.
공통점은 어떤 행동의 결과는 과거에 어떤 행동들이 일어났었느냐에 의존한다는 것이다.
일반적으로 과거에 발생한 행동이력을 통해 현재 발생한 행동의 결과를 판단하는 방식은 복잡하고 번거롭고 이해하기 어렵다.
이 행동과정과 결과를 단순하게 기술하기 위한 상태라는 개념을 고안했다.
비행기 탑승 가능 여부는 항공권의 발권 상태를 보고 예측할 수 있다.
자판기는 현재까지 투입된 금액의 상태를 기억한다.
상태를 이용하면 과거의 모든 행동이력을 설명하지 않고도 행동의 결과를 쉽게 예측하고 설명할 수 있다.
앨리스가 과거에 어떤 행동을 했었는지 모르더라도 앨리스의 키만 알면 문을 통과할 수 있는지 여부를 쉽게 판단할 수 있다.
앨리스 키와 문높이 두가지 상태만 알면 문을 통과하는 행동의 결과를 쉽게 예측할 수 있다.
상태와 프로퍼티
앨리스는 객체다. 앨리스의 키를 줄이거나 늘리기 위해 사용하는 음료, 케이크, 부채, 버섯 모두 객체다. 모두 뚜렷한 경계를 가지며 식별 가능하고 상태와 행동을 지니고 있다.
그러나 세상에 모든 것들이 객체인 것은 아니다. 앨리스의 '키'와 위치'는 객체가 아니다. 음료의 '양'도 객체가 아니다. 문이 열렸는지 '여부'도 객체가 아니다
즉, 숫자, 문자열, 양, 속도, 시간, 날짜, 참/거짓과 같은 단순한 값들은 객체가 아니다.
단순값들은 그 자체로 독립적인 의미를 가지기보다는 다른 객체의 특성을 표현하는데 사용된다.
때로는 단순한 값이 아니라 객체를 사용해 다른 객체의 상태를 표현해야 할 때가 있다.
앨리스가 음료를 들고 있는 상태를 표현하기 위해 참/거짓이 아닌 음료 객체를 이용해 표현하는 것이다. 음료를 들고있나 없나는 음료객체와 연결됐나 안됐나로 구분한다.
결론적으로 모든 객체의 상태는 단순한 값과 객체의 조합으로 표현할 수 있다.
객체의 상태를 구성하는 모든 특징을 통틀어 객체의 프로퍼티(property)라고 한다.
앨리스 기준 키,위치,음료가 프로퍼티다.
일반적으로 프로퍼티는 변하지 않는 정적이다. 반면 프로퍼티의 값은 변할 수 있는 동적이다.
다른 시점에서 앨리스를 봤는데 음료와 연결이 없다. 음료를 버린 것으로 보인다.
이 시점에서 앨리스는 음료에 대한 상태를 모른다.
이처럼 객체와 객체 사이의 의미 있는 연결을 링크(link)라고 한다.
객체 사이 링크를 통해서만 요청을 주고 응답을 받을 수 있다.
즉, 링크를 통해서만 협력이 가능하다
객체 간의 선으로 표현되는 링크와 달리 객체를 구성하는 단순 값은 속성(attribute)이라고 한다.
따라서 앨리스의 키와 위치는 속성이다.
조합하면 프로퍼티는 단순 값인 속성과 객체와 연결을 가르키는 링크 두 조합이다.
이 책에서는 객체의 상태를 다음과 같이 정의하기로 한다.
상대는 특정 시점에 객체가 가지고 있는 정보의 집합으로 객체의 구조적 특징을 표현한다.
객체의 상태는 객체에 존재하는 정적인 프로퍼티와 동적인 프로퍼티 값으로 구성된다.
객체의 프로퍼티는 단순한 값과 다른 객체를 참조하는 링크로 구분할 수 있다.
객체는 자율적인 존재라는 것을 명심하라
객체지향의 세계에서 객체는 다른 객체의 상태에 직접적으로 접근할 수도, 상태를 변경할 수도 없다.
자율적인 객체는 스스로 자신의 상태를 책임져야 한다.
외부의 객체가 직접적으로 객체의 상태를 주무를 수 없다면 간접적으로 객체의 상태를 변경하거나 조회할 수 있는 방법이 필요하다.
행동은 다른 객체로 하여금 간접적으로 객체의 상태를 변경하는 것을 가능하게 한다.
객체지향의 기본 사상은 상태와 상태를 조작하기 위한 행동을 하나의 단위로 묶는 것이라는 점을 기억하라
객체는 스스로의 행동에 의해서만 상태가 변경되는 것을 보장함으로써 객체의 자율성을 유지한다.
'IT책, 강의 > 객체지향의 사실과 오해(역할, 책임, 협력 관점에서 본 객체지향)' 카테고리의 다른 글
03 타입과 추상화 - 1 (0) | 2022.12.01 |
---|---|
02 이상한 나라의 객체 -3 (0) | 2022.11.28 |
02 이상한 나라의 객체 -2 (1) | 2022.11.25 |
01 협력하는 객체들의 공동체-2 (0) | 2022.11.21 |
01 협력하는 객체들의 공동체 -1 (0) | 2022.11.18 |