[객체지향의 사실과 오해] 2장

sarang_daddy·2023년 2월 19일
0

학습 👨‍🎓

목록 보기
3/4
post-thumbnail

이상한 나라의 객체

이상한 나라의 앨리스 이야기를 바탕으로 객체지향을 이해해보자.

앨리스 객체

앨리스는 작은 문을 통과하기 위해 자신의 키를 줄이거나 늘렸다.
"앨리스는 문을 통과하기에 적당한 상태로 자신의 키를 변화 시킨다."
그리고 "앨리스는 행동을 통해 상태를 변화 시킨다."

앨리스의 상태를 결정하는 것은 행동이지만 행동의 결과를 결정하는 것은 상태다.

앨리스가 문을 통과 한다는 결과는 앨리스의 위치라는 상태로 확인 할 수 있다.
여기서 문을 통과한다는 성공 여부는 어떤 행동들이 발생했는지에 영향을 받는다.

문을 통과한다는 행동이 성공하려면 어떤 행동(먹거나, 부채질 등)이 선행되어야만 한다.

그리고 앨리스의 상태가 변경되더라도 앨리스라는 사실은 변하지 않는다.

앨리스는 상태 변경과 무관하게 유일한 존재로 식별 가능하다.

여기서 객체의 특징을 알 수 있다.

  • 앨리스(객체)는 상태를 가지며 상태는 변경 가능하다.
  • 앨리스(객체)의 상태를 변경시키는 것은 앨리스의 행동이다.
    - 행동의 결과는 상태에 의존적이며 상태를 이용해 서술할 수 있다.
    - 행동의 순서가 결과에 영향을 미친다.
  • 앨리스(객체)는 어떤 상태에 있더라고 유일하게 식별 가능하다.

객체란 식별 가능한 개체 또는 사물이다. 구체적인 사물일 수도 있고, 추상적인 개념일 수도 있다.
객체는 상태, 행동, 식별자를 지닌 실체로 정의한다.

상태

앨리스가 문을 통과하기 위해서 키를 줄이고 늘리고를 행동으로 반복한다.
이 행동은 음식을 먹거나 부채질을 하거나 다양하며 횟수도 여러번 발생 할 수 있다.
이 모든 행동 이력을 관리하기 위해 우리는 상태라는 개념을 이용한다.

상태를 이용하면 과거에 얽매이지 않고 현재를 기반으로 객체의 행동 방식을 이해할 수 있다.

프로퍼티

여기까지 내용으로 앨리스는 객체임을 알수 있다. 그리고 문, 음료수, 토끼 등 모두 객체다.
하지만 앨리스의 상태인 키, 위치 등은 객체가 될수 없다.

즉, 숫자, 문자열, 양, 속도, 시간, 날짜, 참/거짓과 같은 단순한 값들은 객체가 아니다.
이것들은 상태 구성하는 특징이되며 객체의 프로퍼티라 한다.

프로퍼티는 속성과 연관관계의 두 가지 종류로 구분된다.

속성 : 객체를 구성하는 단순한 값
연관관계 : 객체가 다른 객체를 참조할 수 있는 링크로 연결된 관계

객체는 다른 객체의 상태에 직접적으로 접근할 수도, 상태를 변경할 수도 없다.
그렇다면 간접적으로 다른 객체의 상태에 접근하는 방법이 필요하다.

행동

행동은 다른 객체로 하여금 간접적으로 객체의 상태를 변경하는 것을 가능하게 한다.

앨리스라는 객체가 키:130cm라는 상태를 가지고 있다고 한다면,
앨리스는 "키" 라는 정적인 프로퍼티와 "130cm"하는 동적인 프로퍼티값을 가진다.
그리고 이 상태는 음료라는 객체와 링크되어 있다.

객체의 상태는 저절로 변경되지 않는다. 객체의 상태를 변경하는 것은 객체의 자발적인 행동이다.
앨리스 객체에 음료수를 마신다는 행동을 통해 음료수라는 객체는 간접적으로 앨리스 객체에 접근하며
이는 앨리스의 상태 "키:130cm"의 상태를 변경한다.

여기서 중요한 개념은 객체의 행동은 상태를 변경시키지만 행동의 결과는 객체의 상태에 의존적이라는 것이다.
앨리스가 음료수를 마시면 키는 변경되지만 변경된 결과값은 앨리스가 가지고 있던 키(상태)에 따라 나온다.

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

협력

객체는 혼자만 존재하지 않는다.
객체는 자신에게 주어진 책임을 완수하기 위해 다른 객체를 이용하고 다른 객체에게 서비스를 제공한다.

객체가 협력하는 방법은 다른 객체에게 요청(메시지)을 보내는 것이다.
요청(메시지)를 수신한 객체는 요청을 처리하기 위해 행동을 취한다.

객체의 행동은 객체가 협력에 참여할 수 있는 유일한 방법이다.

  • 객체는 수신된 메시지에 따라 적절한 행동을 통해 협력하고
  • 그 결과로 자신의 상태를 변경한다.
  • 이 과정에서 다른 객체의 상태를 변경할 수도 있다.

행동이란 외부의 요청(메시지)에 응답하기 위한 동작이며 반응하는 활동이다.
행동의 결과로 객체는 자신의 상태를 변경하거나 다른 객체에게 메시지를 전달한다.
객체는 행동을 통해 다른 객체와 협력한다.

상태 캡슐화

여기까지 내용에서 현실 세계와 객체지향 세계와의 차이점이 있다.
현실에서 앨리스는 능동적인 존재지만 음료수는 수동적인 존재다.
앨리스는 스스로 음료수를 먹고 키를 변경할 수 있지만 음료수는 스스로 줄어들수 없다는 것이다.

그러나 객체지향 세계에서는 모든 객체가 자신의 상태를 스스로 관리해야 한다.(자율성)
즉, 음료 객체의 양을 줄이는 것은 음료 자신이어야 한다.
앨리스는 직접적으로 음료의 상태를 변경 할 수 없고, 음료에게 자신이 음료를 마셨다는 메시지만 전달한다.
(메시지에서 자신이 먹은 양만큼 음료의 양을 줄여달라는 내용이 들어갈 수 있다.)
메시지를 수신한 음료 객체가 스스로 상태를 변경해야 한다.
(음료의 양을 줄일지 말지는 음료가 결정한다. 앨리스는 요청(메시지)를 보내고 믿을 뿐이다.

위에서 설명한 협력(과정) 관계를 나타내는 그림을 보자.
앨리스에서 전달된 메시지(음료를 마신다)와 음료에게 전달한 메시지(얼만큼 마셨다)를 통해
앨리스의 키가 준다거나 음료의 양이 줄었다는 상태 변경 정보를 알수 있는가?

메시지를 전송하는 객체는 메시지를 수신한 객체의 상태 변화를 알 수 없다. 이를 캡슐화라 한다.

객체는 상태를 캡슐 안에 감춰둔 채 외부로 노출하지 않는다.
객체가 외부에 노출하는 것은 행동뿐이며, 외부에서 객체에 접근할 수 있는 방법도 행동뿐이다.

상태의 캡슐화는 객체가 스스로 판단하고 스스로 결정하게 하기 때문에 객체의 자율성이 높아진다.
협력에 참여하는 객체들의 자율성(지능)이 높아질수록 협력은 유연하고 간결해진다.

식별자

앨리스는 앨리스라고 식별이 가능하다.
앨리스, 문, 음료 등 모든 객체는 서로 구별할 수 있는 특정한 프로퍼티를 가지고 있다고 할수 있다.
이 프로퍼티를 식별자라 한다.

즉, 객체는 식별자를 가지며 식별자를 이용해 객체를 구별할 수 있다.

객체지향 프로그래밍에서 숫자라는 클래스와 사람이라는 클래스가 있다고 생각하자.
숫자를 객체는 값 객체(value object)라 하며 사람은 참조 객체(reference object)라 한다.

이 둘의 차이점은 식별자를 가지는가로 구분된다.

값은 숫자, 문자열, 날짜, 시간, 금액 등과 같이 변하지 않는 불변상태를 가진다.
불변상태를 가지기에 두 인스턴스의 값이 존재한다고 할 때 상태가 같으면 같다고 판단하고
상태가 다르면 다르다고 판단 할 수 있다는 말이다. (값 1과 값 1은 같다. 값 2와 값 1은 다르다.)

이처럼 상태를 이용해 두 값이 같은지 판단하는 성질을 동등성(equality)라 한다.

이와 반대로 사람이라는 참조객체는(우리가 만들고자 하는 객체(클래스)를 뜻한다.)
행동에 따라 상태가 변경된다. 가변 상태를 가진다는 뜻이다.
같은 이름과 키를 가진 앨리스 객체가 두개 있다고 해도 이 둘을 별개로 다뤄야 한다.

이처럼 상태와 별개로 두 객체를 구별하는 프로퍼티를 식별자라 하며,
식별자를 통해 객체가 같은지를 판단할 수 있는 성질을 동일성(identical)이라 한다.

식별자란 어떤 객체를 다른 객체와 구분하는데 사용하는 객체의 프로퍼티다.
객체는 상태가 변경될 수 있기 때문에 식별자를 이용한 동일성 검사를 통해 두 인스턴스를 비교한다.

다시 한번, 객체의 특성을 읽고 넘어가자.

  • 객체는 상태를 가지며 상태는 변경 가능하다.
  • 객체의 상태를 변경시키는 것은 객체의 행동이다.
    - 행동의 결과는 상태에 의존적이며 상태를 이용해 서술할 수 있다.
    - 행동의 순서가 결과에 영향을 미친다.
  • 객체는 어떤 상태에 있더라고 유일하게 식별 가능하다.

2장 60페이지 "기계로서의 객체" 은유 설명을 통해 위 내용들을 이해하기 쉽다.

⭐️ 행동이 상태를 결정한다.

객체지향을 설계할 때 상태를 중심으로 바라보는 실수를 많이한다.
상태는 행동에 의해 결정된다. 우리는 상태가 아닌 행동에 초첨을 맞춰야 한다.

객체의 행동은 객체가 협력에 참여하는 유일한 방법이다.
따라서 객체가 적합한지를 결정하는 것은 객체의 상태가 아니라 행동이다.

  • 객체지향 설계는 애플리케이션에 필요한 협력을 생각하고 이에 필요한 행동을 수행할 객체를 선택한다.
  • 행동을 결정한 후에 행동에 필요한 정보가 무엇인지를 고려하여 상태를 결정한다.
  • 객체의 행동을 결정하고 그 후에 행동에 적절한 상태를 선택하는 것이다.

협력 안에서 객체의 행동은 결국 객체가 협력에 참여하면서 완수해야 하는 책임을 의미한다.
따라서 어떤 책임이 필요한가를 결정하는 과정이 전체 설계를 주도해야 한다.

의인화

객체지향 프로그래밍을 현실 세계의 추상화라 표현을 많이 한다.
이는 현실 세계의 객체와 소프트웨어 세계의 객체 관계를 깔끔하게 설명할 수 없다.

현실 속의 카드게임에서 카드는 스스로 뒤집을 수 없다.
전화기는 스스로 통화 버튼을 누를 수 없으며, 계좌는 스스로 송금을 할 수 없다.

우리는 소프트웨어 객체 시계에서 현실의 객체보다 더 많은 일을 할수 있게 한다.
이를 소프트웨어 객체의 의인화라 한다.

소프트웨어 안에서 구축되는 객체지향 세계는 현실 세계를 단순 모방이나 추상화 하는게 아닌
참조를 하여 현실과 다른 새로운 세계를 창조하는 것이다.

이상한 나라를 창조하라

이상한 나라의 앨리스에는 트럼프 카드, 채셔 고양이, 토끼 등의 객체가 나온다.
이들은 우리가 알고 있는 현실 세계와는 다른 모습을 가진다.
트럼프는 손발이 생기고 스스로 움직이며 고양이는 사람처럼 웃으며 토끼는 두발로 걸어다닌다.
그러면서도 현실과 비슷하게 트럼프는 뒤집히며 고양이는 야옹하고 울고 토끼는 빠르게 달린다.

객체지향 설계에서 우리의 목적은 현실을 모방하는 것도 추상화 하는 것도 아니다.
우리는 현실을 참조하여 이상한 나라를 창조하면 된다.
현실을 똑같이 반영하라는 제약이나 구속은 필요없다.
현실 속의 이름을 이용할 수 있다면 이용하고 아니라면 새롭게 만들면 된다.

profile
한 발자국, 한 걸음 느리더라도 하루하루 발전하는 삶을 살자.

0개의 댓글