본문 바로가기
Book/객체지향의 사실과 오해

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

by 따라쟁이개발자 2022. 12. 27.

02 / 이상한 나라의 객체

책에서는 객체 세계를 '이상한 나라의 앨리스' 속 '이상한 나라'에 비유하여 설명하고 있다.

2장에서는 앨리스가 어떤 행동을 취하고 어떤 상태 변화를 겪었는지,

앨리스를 객체에 비유하면 어떻게 해석될 수 있는지에 대해 얘기한다.

 

이번 장에서는 상태, 행동, 식별자 등 객체 관련 다양한 언어가 등장하는데

따로 정리해두면서 봐도 좋을 듯 하다.

 


객체지향과 인지 능력

객체지향 패러다임의 목적은

현실 세계를 모방하는 것이 아니라 현실 세계를 기반으로 새로운 세계를 '창조' 하는 것

 

객체를 자아를 가진 하나의 인격체로 볼 것 (객체의 의인화)

ex. 현실에선 전구가 사람에 의해 켜지지만, 객체 세계에서 전구는 스스로 불을 킬 수 있다.

 

객체, 그리고 이상한 나라

앨리스 객체

이상한 나라에서 앨리스는 음료를 마시거나 부채를 부치는 행동을 통해 키를 변화시킬 수 있다.

  • 앨리스는 상태를 가지며, 상태는 변경 가능하다 (ex. 앨리스의 키)
  • 앨리스의 상태를 변경시키는 것은 앨리스의 행동이다
  • 앨리스는 어떤 상태에 있더라도 유일하게 식별 가능하다 (ex. 앨리스의 키가 변해도 앨리스는 앨리스이다.)

 

객체, 그리고 소프트웨어 나라

객체는 식별 가능한 개체이며,
객체는 상태(stage), 행동(behavior), 식별자(identity)를 가진다.

객체 용어들을 앨리스 상황에 대입해 이해해보자

상태(state)

상태는 특정 시점에 객체가 가지고 있는 정보 집합으로, 객체의 구조적 특징을 표현

상태는 정적인 프로퍼티와 동적인 프로퍼티 값으로 구성

 

  • 프로퍼티(property)
    객체의 상태를 구성하는 모든 특징으로 정적인 요소.
    흐름에 따라 변하는 값은 프로퍼티 값으로 동적인 요소.
    객체의 프로퍼티는 단순값인 '속성'과 다른 객체를 참조하는 '링크'로 구분됨

  • 링크(link)
    객체와 객체 사이의 의미있는 연결
  • 속성(attribute)
    링크가 객체간 연결을 의미한다면,
    속성은 객체를 구성하는 단순한 값을 의미

행동(behavior)

객체의 상태는 저절로 변하지 않는다. 
객체의 상태를 변경하는 것은 객체의 자발적인 '행동'뿐

 

  • 부수효과(side effect)
    객체의 행동에 의해 객체 상태가 변경되는 것
    (ex. 앨리스가 케이크를 먹는 행동이 앨리스의 키를 작게 변화시켰다)
  • 상태와 행동 사이 관계
    객체의 행동은 상태를 변경시킨다.
    객체의 행동은 상태에 영향을 받는다
    (ex. 케이크를 먹으면 앨리스의 '현재 키' 보다 커져야 한다)
  • 협력과 행동
    객체는 고립된 섬이 아니며, 
    객체 자신에게 주어진 책임을 완수하기 위해 다른 객체들과 '협력' 한다
    다른 객체와 행동하기 위해 객체의 행동은 외부에 '가시적' 이어야 한다.
  • 상태 캡슐화 
    객체의 행동을 유발하는 것은 외부로부터 온 메시지이지만
    객체 상태를 변경할지 여부와 어떻게 변경할지에 대한 것은 객체 스스로 결정
    따라서, 객체의 내부 구현을 외부에 노출시킬 필요 없다.
    (ex. 음료수가 구체적으로 어떻게 줄어드는지 앨리스는 알 필요 없다.)

식별자(identity)

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

 

  • 동등성(equality)
    두 값이 같은지를 판단할 수 있는 성질
    값은 식별자를 가지지 않기 때문에 상태를 이용한 동등성 검사를 통해 두 인스턴스를 비교가능

  • 동일성(identical)
    식별자를 기반으로 객체가 같은지를 판단
    객체는 상태가 변경될 수 있기 때문에 식별자를 이용한 동일성 검사를 통해 두 인스턴스 비교가능
  • 값 객체(value object)
    식별자를 가지지 않는 값 (ex. Integer)
  • 참조 객체(reference object) / 엔티티(entity)
    식별자를 지는 객체 (ex. Person class)

 

기계로서의 객체

객체지향 세계에서 객체 상태를 조회하는 작업을 쿼리(query),
객체 상태를 변경하는 작업을 명령(command)라고 한다.

 

앨리스를 쿼리, 명령 버튼을 가진 기계라고 생각해보자
아래와 같은 버튼들이 필요할 것이다.
- 키를 조회해올 키 조회 버튼
- 키를 변경할 음료 마시기 버튼, 케이크 먹기 버튼 등..

 

우리는 버튼을 눌러 기계에게 메시지를 전달하고
버튼이 눌려짐으로써 기계는 상태를 변화시킨다.

우리는 기계 안에서 버튼이 어떤식으로 동작하는지 알 필요가 없다.

기계에 메시지를 보내고 응답을 받으며 협력할 뿐이다.

 

행동이 상태를 결정한다

객체지향 세계에서 객체를 상태 중심으로 바라보는 것이 아니라
객체가 수행 할 행동(책임)에 초점을 맞춰 바라보아야 한다.

 

객체의 행동은 협력 내에서 객체가 완수해야 할 책임을 의미하기도 한다
즉, 각 객체에게 어떤 책임이 필요한가를 결정하는 과정이 전체 설계를 주도해야 한다
(= 책임 주도 설계 (Responsibility-Driven Design, RDD))

상태 위주로 설계했을 때 문제점

  • 객체의 상태를 깔끔히 캡슐화 하기 어렵다 
  • 객체를 협력자가 아닌 상태 위주의 고립된 섬으로 만든다
  • 객체의 재사용성이 저하된다.

 

은유와 객체

객체지향 세계는 현실 세계의 단순한 모방이 아니다.

소프트웨어 세계에선 상품이 스스로 가격 계산을 하게 될 수도 있다.

 

이러한 객체지향 세계를 현실 세계에 대입해 이해하기 위해선

객체를 수동적인 존재가 아닌 능동적인 존재로 봐야할 필요가 있으며 (객체 의인화)

소프트웨어의 객체를 현실 객체에 대한 은유로 보아야 한다.

 

객체지향 세계에서 '이상한 나라'를 창조하자

댓글