객체지향이 세상을자율적이고 독립적인 객체들로 분해할 수 있는 인간의 기본적인 인지 능력에 기반을 두고 있기 때문입니다.
예를 들면
[그림1] 대전 여행을갔다가 만난 고앵이
[그림1]을 보고 사람들은 이걸고앵이라는 객체로 인식이 가능하다는것입니다(사자나 호랑이아님)
다른 주변 요소들 (예: 티슈, 물티슈)도 별개의 객체로 인식할 수 있습니다.
알게 모르게 우리는 위 내용에서추상화도 같이 생각하고 있습니다.
물티슈와 고앵이를 싸잡아서 "저건 고양이다.." 라고 말하는사람은 없죠?
인간은 좀 더 단순한 객체들로 주변을 분해함으로써 자신이 몸담고 있는 세상을 이해하려고 노력합니다.
즉 객체란 인간이 분명하게 인지하고구별할 수 있는 물리적인 또는 개념적인 경계를 지닌 어떤것입니다. (예 고앵이).
하지만우리가 분리할수 있는 어떤것의 기준과 소프트웨어적 객체의 개념은 조금 다를수 있습니다.
현실세계에서는 우리가 티슈를 직접뽑아쓰지만
소프트웨어적 세계에서는 티슈가 스스로 뽑아질겁니다.
tissue.pull(3) 이런식으로요.
객체, 그리고 이상한 나라.
행동과 상태의 상호작용
이 책에서는 앨리스를 예로 들어 객체의 특성을 설명합니다.
앨리스는 문의 높이가 40cm밖에 되지 않아 문 뒤에 있는 아름다운 정원으로 갈 수 없었습니다. 앨리스는 이 문제를 해결하기 위해키가 작아지는 약,키가 커지는 케이크,키가 작아지는 부채등을 사용하여 결국 문을 넘게 됩니다.
여기서 중요한 점은,앨리스의 키를 변화시키는 것은 물약 자체가 아니라 앨리스의 행동이라는 것입니다. 앨리스가 특정 행동(예: 약을 마신다, 케이크를 먹는다)을 함으로써 그녀의 상태(키)가 변하게 됩니다.
앨리스의 상태를 결정하는것은 행동이지만
(예를들어 앨리스가 "키가 작아지는 약을 마신다" 라는 행동을하면, 그 행동에따라 앨리스의 상태 (키의 크기)가 변합니다
즉, 행동이 앨리스의 상태 변화를 유발합니다)
행동의 결과를 결정하는것은 앨리스의 상태다.
(그러나 행동이 어떤 결과를 만들어낼지는 행동을 하기 전 앨리스의 상태(키)에 따라 달라집니다, 즉 현재의 상태가 행동의 결과를 좌우합니다)
요약하자면, 키가 작아지거나 커지기전 앨리스의 현재의 키가 얼마였느냐가 행동이후의 최종 키를 결정하는것이죠
따라서 행동의 결과는 현재 상태에 의존적입니다.
행동과 순서
또한 어떤 행동의 성공 여부는 이전에 어떤 행동들이 발생했는지에 영향을 받습니다.
(왜냐면 행동들의 결과가 상태에 영향을 미치기 때문)
따라서 행동 간의 순서또한 중요하다는것을 알게됩니다.
앨리스의 특징
앨리스는상태를 가지며 상태는 변경 가능하다.
앨리스의상태를 변경시키는 것은 앨리스의 행동이다.
행동의 결과는 상태에 의존적이며 상태를 이용해 서술할 수 있다.
앨리스는 어떤 상태에 있더라도 유일하게 식별 가능하다.
행동의 순서가 결과에 영향을 미친다.
객체
객체의 특성을 효과적으로 설명하려면 상태, 행동, 식별자라는 세 가지 요소로 나눌 수 있습니다. (booch)
이책에서는 객체를 다음과 같이 정의합니다
객체란 식별 가능한 개체 또는 사물이다. 객체는 자동차처럼 만질 수 있는 구체적인 사물일 수 도 있고 시간처럼 추상적인 개념일 수 도 있다. 객체는 구별 가능한 식별자, 특징적인 행동, 변경가능한 상태를 가진다, 소프트웨어 안에서 객체는 저장된 상태와 실행가능한 코드를 통해 구현된다.
상태
객체에 상태가 왜 필요할까요? 객체의 행동이 성공할지 여부는과거에 어떤 행동들이 어떤 순서로 이루어졌는지에 영향을 받는다고 했습니다.
130cm의 키를 가진 앨리스는 40cm의 문을 통과할 수 없습니다. 따라서 앨리스는키를 줄이는 행동을 해야만 문을 통과할 수 있습니다.
이처럼, 객체의행동의 결과는과거에 어떤 행동들이 일어났는지에 크게 의존합니다.
하지만과거의 모든 행동을 조사해서 결과를 판단하는 것은 매우 복잡하고 번거로운 작업입니다. 그래서상태라는 개념이 도입되었습니다.
상태를 사용하면 과거에 어떤 행동들이 있었는지 모두 추적할 필요 없이,현재의 상태값만 확인하면 됩니다.
앨리스의 키와 문의 높이라는두 가지 상태만 알면, 문을 통과할 수 있을지 쉽게 예측할 수 있습니다.
과거의 복잡한 행동 기록에 얽매이지 않고,현재를 기준으로 객체의 행동을 이해할 수 있게 됩니다.
프로퍼티
숫자, 문자열, 속도, 수량 같은 값들은 객체가 아닙니다, 다른 객체의 특성을 표현하는데 사용됩니다.
즉, 다른 객체의 상태를 표현하기위해 사용되는데요.
또한 단순한 값이 아니라. 객체가 다른 객체의 상태를 표현할때도 있습니다
예를들어 앨리스의 상태 일부를 음료라는 객체를 이용해서 표현할때도 있습니다.
(앨리스가 음료를 들고 있다면)
[그림2]
모든 객체의 상태는단순한 값과다른 객체의 조합으로 표현될 수 있습니다.
이때 객체의 상태를 구성하는 모든 특징(예: 키, 위치, 음료)을프로퍼티라고 부릅니다.
프로퍼티 자체는 정적입니다.
키, 위치, 음료라는 프로퍼티는 변하지 않습니다.
하지만,프로퍼티의 값은 동적입니다
키(130cm), 위치("통로"), 음료(0.5L)는 시간이 흐름에 따라 변할 수 있습니다.
객체간의 연결
[그림3]
만약앨리스가 음료를 버렸다면, 두 객체(앨리스와 음료)는 더 이상 이어져야 할 이유가 없습니다.
그림 2에서는 앨리스와 음료사이 선이 있었지만, 그림3에서는 선이 사라졌습니다.
이처럼, 객체와 객체 사이의 의미 있는 연결을링크라고 합니다.
이 링크는 객체간의 요청과 응답을 주고받을수 있는 통로입니다, 즉이 링크가 없으면 객체간의 상호작용은 불가합니다.
이것은 일반적으로한 객체가 다른 객체의 식별자를 알고있다. 라는것으로 표현합니다.
이책에서는 객체의 상태를 다음과 같이 정의하기로 했습니다.
상태는 특정 시점에 객체가 가지고 있는 정보의 집합으로 객체의 구조적 특징을 표현한다. 객체의 상태는 객체에 존재하는 정적인 프로퍼티와 동적인 프로퍼티 값으로 구성된다 객체의 프로퍼티는 단순한 값과 다른 객체를 참조하는 링크로 구분할 수 있다.
외부의 객체가 직접 객체의 상태를 변경할 수 없다면,간접적으로 상태를 조작하거나 조회할 수 있는 방법이 필요합니다.
행동은 이러한 간접적인 상태 변경을 가능하게 합니다.
(앨리스가 음료를 마시는 행동 → 음료 객체의 상태가 변함(양이 줄어듦).)
객체지향의 핵심은상태와 상태를 조작하기 위한 행동을 하나의 단위로 묶는 것입니다.
상태: 객체가 가진 정보와 구조적 특징.
행동: 상태를 간접적으로 변경하거나 조회하는 수단.
행동
객체의상태는 객체의자발적인 행동에 의해 변경됩니다.
객체의행동은 상태를 변경시키지만, 행동의 결과는 객체의현재 상태에 의존합니다.
객체의 행동이 상태를 변경한다는 것은행동이 부수 효과를 초래한다는 것을 의미합니다.
예를들어 앨리스가 음료를 마신 후, 앨리스의 키는 음료를 마시기 전보다 작아져야 합니다.
이는 "음료를 마신다"라는 행동의 결과가앨리스의 현재 상태(키)에 영향을 받는다는 것을 보여줍니다.
상태와 행동의 관계 요약
객체의 행동은 상태에 영향을 받는다.
객체의 행동은 상태를 변경시킨다.
협력과 행동
객체가 다른 객체와 협력하는 유일한 방법은 요청을 보내는 것입니다.
요청을 수신한 객체는 요청을 처리하기 위해 적절한 방법에 따라 행동합니다.
따라서, 객체의행동은 객체가 협력에 참여하는 유일한 방법입니다.
객체는 외부로부터 메시지를 수신하면, 그 메시지에 응답하기 위해 행동을 수행합니다.
이 과정에서 객체는 자신의 상태를 변경하거나 다른 객체와 협력합니다.
객체의 행동이 수행된 결과는 다음 두 가지로 나타납니다
객체 자신의 상태 변경
다른 객체에 메시지 전송
이 책에서 행동을 다음과 같이 정의합니다.
행동이란 외부의 요청 또는 수신된 메세지에 응답하기 위해 동작하고 반응하는 활동이다 행동의 결과로 객체는 자신의 상태를 변경하거나 다른 객체에게 메세지를 전달할 수 있다. 객체는 행동을 통해 다른 객체와의 협력에 참여하므로 행동은 외부에 가시적이어야한다.
상태 캡슐화
객체지향 세계에서 모든 객체는자신의 상태를 스스로 관리하는 자율적인 존재입니다.
객체의 상태를 변경할 수 있는 것은해당 객체 자신만입니다.
음료 객체의 양을 줄이는 것은앨리스가 아닌음료 객체자신이어야 합니다.
앨리스는 음료의 상태를 직접적으로 변경할 수 없습니다.
대신, 앨리스는메시지를 통해 음료에게 "양을 줄여달라"는 요청을 보냅니다.
이것이 앨리스가 음료를 마신다는 행동의 전부입니다.
[그림4] 지피티가 만들어준 객체 기계.
메시지를 통해 객체 간의 요청이 이루어지지만,송신자(앨리스)는 수신자(음료)의 상태 변경에 대해 알지 못합니다.
이는상태를 숨기고 행동만 외부에 노출하는캡슐화의 개념을 의미합니다.
객체는행동만을 외부에 노출하며, 외부에서 객체에 접근할 수 있는 유일한 방법 역시 행동뿐입니다.
(앨리스는 음료에게 마신다 라는 행동을 요청할뿐 상태가 변경되는건 알지 못합니다.)
캡슐화를 하는것은 객체의 자율성을 높여줍니다.
(객체는 스스로 상태를 관리하며 외부의 간섭에 상태가 변하지 않습니다. 즉, 음료 객체는 앨리스의 요청을 받지만 ㅅ스스로 상태를 변경합니다.)
식별자
객체란인간의 인지 능력을 이용해 식별 가능한 경계를 가진 모든 사물을 의미합니다.
객체가 식별 가능하다는 것은, 객체를 서로 구별할 수 있는특정한 프로퍼티가 객체 내부에 존재한다는 뜻입니다.
값과 객체의 차이점
값은 식별자를 가지지 않는다.
숫자, 문자열, 날짜, 시간, 금액 등은 값이며,변하지 않는 불변 상태를 가집니다.
값은 상태를 기반으로 동일 여부를 판단합니다.
객체는 식별자를 가진다.
객체는 시간이 흐르면서 상태가 변할 수 있는가변 상태를 가집니다.
객체의 동일성은 상태가 아닌식별자를 기반으로 판단합니다.
값과 객체 비교 방식
값의 동등성 (Equality)
값은 상태가 같으면 동일한 것으로 판단합니다.
예: 숫자 5와 숫자 5는 상태가 같으므로 같은 값으로 간주됩니다.
객체의 동일성 (Identity)
객체는 상태와 관계없이식별자를 기준으로 동일 여부를 판단합니다.
예: 두 객체의 상태가 다르더라도,식별자가 같다면 동일한 객체로 간주됩니다.
아래는 객체의 중요한 특성입니다.
객체는 상태를 가지며, 상태는 변경 가능하다.
객체의 상태를 변경시키는 것은 객체의 행동이다.
행동의 결과는 상태에 의존적이며, 상태를 기반으로 서술할 수 있다.
행동의 순서가 실행 결과에 영향을 미친다.
객체는 어떤 상태에 있더라도 유일하게 식별 가능하다.
잘 보면 앨리스의 상태와 같은것을 알 수 있다.
기계로서의 객체
객체와 기계의 비유 (버트란드 마이어의 관점)
버드란드 마이어는 객체는 기계에 비유했습니다.
기계의 내부는 단단한 금속 외피에 감춰져 있어 직접 볼 수 없습니다.
기계를 분해하지 않는 한, 내부 상태에 직접 접근할 수 없습니다.
대신, 기계의외부 버튼을 통해서만 기계와 상호작용할 수 있습니다.
객체의 상태를 조회하는것을 쿼리, 객체의 상태를 변경하는것을 명령이라고 했을때.
[그림5] 지피티가 만들어준 객체 기계.
앨리스 기계는쿼리 버튼과명령 버튼을 통해서만 사용할 수 있습니다.
기계의 내부 상태에 직접 접근하는 것은 불가능합니다.
이는 객체가 제공하는행동을 통해서만 상태에 접근할 수 있음을 보여줍니다.
즉 객체의 기계가 제공하는 버튼을 통해서만 상태에 접근할수 있다는 점은 캡슐화를 강조합니다.
(행동만 제공하고 상태는 숨겨져있음)
기계 은유를 이용하면 객체의 식별자 역시 효과적으로 설명할 수 있습니다.
두 개의 동일한 객체 기계가 있다고 가정했을 때,
상태가 같더라도 두 기계를 보는 사람들은 이를 별개의 객체로 인식합니다.
이는 객체가상태와 관계없이 유일하게 식별 가능한 식별자를 가진다는 것을 의미합니다.
[그림6] 식별자를 설명할 객체 기계들
앨리스 기계에서 "음료를 마시다" 버튼을 눌렀다고 가정했을때, 링크를 통해 연결된 음료기계가 "마시다" 버튼이 눌러지도록 요청을 전송하는 구조라고 생각하면 될거같아요.
행동이 상태를 결정한다
상태를 먼저 결정하고 행동을 나중에 결정하는 방법은 설계에 나쁜 영향을 끼칩니다
첫째, 상태를 먼저 결정할경우 캡슐화가 저해됩니다. (객체의 내부 상태가 외부로 노출될 가능성이 커집니다.)
둘째, 객체를 협력자가 아닌 고립된 섬으로 만듭니다. (의미 있는 상호작용 없이 자기 상태만 관리하여 유기적으로 참여하지 못할 가능성이 있습니다.)
셋째, 객체의 재사용성이 저하됩니다.
행동 중심 설계
상태가 아니라 행동에 초점을 맞추는것이 중요합니다.
결과적으로,애플리케이션에서 어떤 행동이 필요한지가어떤 객체가 적합한지를 결정합니다.
객체의 적합성은상태가 아니라 행동에 의해 결정됩니다.
생각해보니까 학부시절에 소프트웨어 개발 단계를 공부하면서 수행했던 작업이 행동 중심 설계라고 생각되네요..!
srs > sdd 중에서
srs는 유스케이스 명세서 시나리오등을 작성한후
sdd에서 클래스를 설계를 했던것으로 기억납니다.
은유와 객체
객체지향의 두번째 오해: 현실 세계의 모방이 아니다
흔히 객체지향을현실 세계의 모방이라고 오해하지만, 이는 잘못된(살짝 아쉬운?) 개념입니다.
객체지향은현실 세계를 단순화하거나 추상화한 것이지만, 그 목적은현실 세계를 재현하는 것이 아닙니다.
소프트웨어 객체는 현실 세계의 사물과는 다른능동적인 존재로 설계됩니다.
그래서 그 능동적인 주제를 의인화라고 표현할 수 있을것 같습니다.
현실에서 수동적인 존재가소프트웨어 객체로 구현될 때는능동적인 존재로 변화하는것처럼요.
결국, 객체지향 세계는 현실 세계를 단순히 모방한 것이 아니라,현실 세계를 참조하여전혀 다른 세계를 창조합니다.