2장. 이상한 나라의 객체
객체지향과 인지 능력
객체지향 패러다임의 목적은 현실 세계를 모방하는 것이 아닌 현실 세계를 기반으로 새로운 세계를 창조하는 것 임을 명심해야 한다.
소프트웨어 세계에서 살아가는 객체는 현실 세계에 존재하는 객체와는 전혀 다른 모습이다.
현실 세계에서 전등은 스스로 꺼지거나 켜질 수 없지만, 소프트웨어 세계에서는 가능하다.
현실 세계에서 주문 금액은 사람에 의해 계산되지만, 소프트웨어 세계에서는 객체가 스스로 계산할 수 있다.
이렇듯 실행 중인 객체지향 애플리케이션의 내부를 들여다보면 매우 이질적인 세계를 마주치게 될 것이다.
객체, 그리고 이상한 나라
이상한 나라의 앨리스
문을 통과하기 위해 작아지고, 커지는 이상한 나라의 앨리스 이야기를 기반으로 한다. 여기서 앨리스는 하나의 객체를 의미한다고 볼 수 있다.
앨리스는 상태를 가지며 상태는 변경 가능하다.
앨리스의 상태를 변경시키는 것은 앨리스의 행동이다.
행동의 결과는 상태에 의존적이며 상태를 이용해 서술할 수 있다.
행동의 순서가 결과에 영향을 미친다.
앨리스는 어떤 상태에 있더라도 유일하게 식별 가능하다.
객체, 그리고 소프트웨어 나라
하나의 개별적인 '실체'로 식별 가능한 물리적 또는 개념적인 사물은 객체가 될 수 있다.
객체의 다양한 특성을 효과적으로 설명하기 위해 객체를 상태(state), 행동(behavior), 식별자(identity)를 지닌 실체로 보는 것이 가장 효과적이다.
객체는 다음과 같이 정의하기로 한다.
객체란 식별 가능한 개체 또는 사물이다.
객체는 구체적인 사물일 수도 있고, 추상적인 개념일 수도 있다.
객체는 구별 가능한 식별자, 특징적인 행동, 변경 가능한 상태를 가진다.
소프트웨어 안에서 객체는 저장된 상태와 실행 가능한 코드를 통해 구현된다.
객체지향 관점에서 상태, 행동, 식별자 개념을 정리해보자.
상태 (state)
상태가 필요한 이유는 뭘까?
어떤 행동의 결과는 과거에 어떤 행동들이 일어났었느냐에 의존한다는 점
상태를 통해 과거의 모든 행동 이력을 대신하여 설명할 수 있다.
상태는 근본적으로 세상의 복잡성을 완화하고 인지 과부하를 줄일 수 있는 중요 개념
단순한 값은 객체가 아니지만 객체의 상태를 표현하기 위한 중요한 수단이다.
모든 객체의 상태는 단순한 값과 객체의 조합으로 표현된다. 이때 객체의 상태를 구성하는 모든 특징을 객체의 프로퍼티(property)라고 한다.
일반적으로 프로퍼티는 변경되지 않고 고정되기 때문에 '정적'이다.
반면 프로퍼티 값은 시간에 따라 변경되기 때문에 '동적'이다.
객체와 객체 사이에는 링크(link) 를 통해 요청(메시지)을 보내고 받는 협력을 할 수 있다.
객체를 구성하는 단순한 값은 속성(attribute) 이라고 한다.
정리해보자면,
상태는 특정 시점에 객체가 가지고 있는 정보의 집합으로 객체의 구조적 특징을 표현한다.
객체의 상태는 객체에 존재하는 정적인 프로퍼티와 동적인 프로퍼티 값으로 구성된다.
객체의 프로퍼티는 단순한 값과 다른 객체를 참조하는 링크로 구분할 수 있다.
행동
객체의 상태와 행동은 서로 연관되어 있다. 객체의 상태를 변경하는 것은 객체의 자발적인 행동뿐이다.
객체의 행동에 의해 객체 자신의 상태를 변경시키는 부수 효과(side effect)를 일으킨다.
행동의 결과는 객체의 상태에 의존적이다.
또한, 객체는 자신에게 주어진 책임을 완수하기 위해 다른 객체를 이용하고 다른 객체에게 서비스를 제공하며 협력한다.
협력 과정에서 자기 자신의 상태뿐만 아니라 다른 객체의 상태 변경을 유발할 수 있다.
객체의 행동
객체 자신의 상태 변경
행동 내에서 협력하는 다른 객체에 대한 메시지 전송
상태 캡슐화
객체지향 세계에서는 모든 객체는 자신의 상태를 스스로 관리하는 자율적인 존재이다.
앨리스가 음료를 마시는 과정을 예시로 들자면,
앨리스 객체의 키를 작게 만든 것은 음료를 마신 앨리스 자신이다.
음료 객체의 양을 줄이는 것도 음료 자신이어야 한다.
단지 음료에게 자신이 음료를 마셨다는 '메시지'를 전달할 수 있을 뿐이다.
ex. -- drinkBeverage() --> '앨리스' -- drunk(quantity) --> '음료'
이러한 방식으로 상태를 외부에 노출시키지 않고 행동을 경계로 캡슐화하는 것은 결과적으로 객체의 자율성을 높인다.
식별자
객체가 식별 가능하다는 것은 구별할 수 있는 특정한 프로퍼티가 객체 안에 존재한다는 것이다.
프로퍼티의 타입은 객체나 단순한 값 중 하나가 될 수 있다.
단순한 값과 객체의 차이점을 이해하고 구분하는 것은 중요하다.
값(value)
식별자를 가지지 않는 값; 값 객체(value object) 라고도 불림
값의 상태는 변하지 않기 때문에 불변 상태(immutable state)를 가진다.
값의 경우 두 인스턴스의 상태가 같다면 동일한 것으로 판단한다.
상태를 이용해 두 값이 같은지 판단할 수 있는 성질을 동등성(equality) 이라고 한다.
객체(object)
참조 객체(reference object), 엔티티(entity) 라고도 불림
객체는 시간에 따라 변경되는 상태를 가지고있어 가변 상태(mutable state)를 가진다.
타입이 같은 두 객체의 상태가 완전히 똑같더라도 두 객체는 독립적인 별개의 객체로 다뤄야 한다.
두 객체의 상태가 다르더라도 식별자가 같다면 같은 객체로 판단할 수 있는 성질을 동일성(identical) 이라고 한다.
기계로서의 객체
객체지향의 세계를 창조하는 개발자들은 객체의 상태 조회와 상태 변경을 하는 업무를 한다.
쿼리(query): 객체의 상태를 조회하는 작업
명령(command): 객체의 상태를 변경하는 작업
쿼리와 명령 이외에는 객체를 다루는 방법이 없다는 것을 기억하자. 객체가 제공해주는 인터페이스를 통해서만 접근할 수 있는 것이다.
이러한 객체를 기계로서 바라본다면 캡슐화를 직관적이고 시각적으로 이해할 수 있다.
행동이 상태를 결정한다
흔히 상태를 중심으로 객체를 바라보는 함정에 빠지기 쉽다.
상태를 먼저 결정하고 행동을 나중에 결정하는 방법은 설계에 나쁜 영향을 끼친다.
상태를 먼저 결정할 경우 캡슐화가 저해된다.
객체를 협력자가 아닌 고립된 섬으로 만든다.
객체의 재사용성이 저하된다.
객체가 적합한지를 결정하는 것은 상태가 아닌 행동이다. 객체지향 설계를 할 때는 협력을 생각하고 협력에 참여하기 위해 필요한 행동을 수행할 객체를 선택하는 방식으로 설계해야 한다.
책임-주도 설계(Responsibility-Driven Design, RDD) 는 협력이라는 문맥 안에서 객체의 행동을 생각하도록 도와 응집도가 높고 재사용 가능한 객체를 만들 수 있는데 도와준다.
"행동이 상태를 결정한다" 의 의미를 찾아보자.
은유와 객체
객체지향을 '현실 세계의 모방'한 현실 세계의 추상화라고도 하는데, 여기서 추상화(abstract)란 실제 사물에서 원하는 특성만 취하고 필요 없는 부분을 추려 핵심만 표현하는 행위를 말한다.
하지만, 객체지향 세계는 단순한 모방이 아니다. 모방과 추상화라는 개념만으로는 현실 객체와 소프트웨어 객체 사이의 관계를 설명하기란 어렵다.
의인화
소프트웨어 객체를 만들 때 현실 세계가 아닌 오히려 소프트웨어 안에 창조하는 객체에 전혀 다른 특징을 부여하는 것이 일반적이다.
현실 세계의 계좌는 스스로 송금, 입금, 조회 등을 할 수 없다. 현실 세계의 자동차는 스스로 앞으로 나아가거나 멈출 수 없다. 전지전능한 객체는 현실 세계에 존재하지 않는다.
이러한 점들을 미루어보아 오히려 현실 세계의 모방이 아닌, 더 많은 특징과 능력을 보유한 객체를 창조하는 것이라고 말한다.
은유
객체지향의 세계와 현실 세계는 '은유(metaphor)' 라는 관계를 가진다.
은유: 실제로 적용되지 않는 한 가지 개념을 이용해 다른 개념을 서술하는 대화의 형태
현실 세계의 모방이 아닌, 현실 세계를 은유화한 객체지향의 세계를 말하려고 하는 것 같다.
애매모호했던 '객체지향' 이라는 말의 틀이 조금씩 잡혀가는 것 같다. 항상 면접에서 객체지향이 무엇이냐고 물어봤을 때 '현실 세계의 사물이나 개념을 객체로 바라보는 패러다임'이라고 했는데, 이 책을 읽으면서 부족했던 부분들에 대해 조금씩 채워나가는 느낌이다.
정리
객체는 상태, 행동, 식별자를 가진다.
협력이라는 문맥 안에서 객체의 행동을 생각하자.
객체는 서로 협력하며 상태를 변경한다.
객체는 현실 세계의 모방이 아닌, 현실 세계를 은유화한 객체지향의 세계이다.
Last updated
Was this helpful?