[Object-Oriented] 2장. 이상한 나라의 객체

이성민·2024년 3월 3일
post-thumbnail

서론

1997년 심리학자 엘리자베스 스펠크와 필립 켈만
어린 아기들이 물체를 인지하는 방법을 연구하기 위해 한 가지 실험을 수행

그 결과, 사람은 태어난 지 얼마 안 된 시기부터
뚜렷한 경계를 가지고 함께 행동하는 물체를 하나의 개념으로 인지함



객체지향과 인지 능력

위 실험에서와 같이, 사람은 기본적으로 뚜렷한 경계를 가지고 함께 행동하는 물체를 하나의 개념으로 인지



객체, 그리고 이상한 나라

이상한 나라의 앨리스에서 앨리스가 정원으로 통하는 문을 통과하기 위해
음료, 부채, 버섯 등을 사용해 키가 변하는 것으로 비유 중

앨리스 객체

음료, 부채, 버섯 등을 사용하는 행동에 따라 앨리스의 키라는 상태가 변경됨

이런 점에서,

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


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

객체를 효과적으로 설명하기 위해서는 상태, 행동, 식별자를 지닌 실체로 보는 것이 가장 효과적

이 책에서 객체의 정의는,

객체란 식별 가능한 개체 또는 사물이다.
객체는 자동차처럼 만질 수 있는 구체적인 사물일 수도 있고, 시간처럼 추상적인 개념일 수도 있다.
객체는 구별 가능한 식별자, 특징적인 행동, 변경 가능한 상태를 가진다.
소프트웨어 안에서 객체는 저장된 상태와 실행 가능한 코드를 통해 구현된다.


상태

상태가 왜 필요할까 ?

  • 어떤 행동의 결과는 그 이전 행동에 대한 결과에 의해 결정됨
    → 하지만, 그 이전의 행동들을 모둘 기억하기에는 비효율적
    → 이전 행동에 대한 결과를 상태로 저장해두고, 현재 상태에 어떤 행동을 가해 새로운 상태로 갱신
    즉, 상태가 있으면, 이전에 실행한 행동들을 모두 기억해두지 않아도 됨

상태와 프로퍼티

  • <이상한 나라의 앨리스>에서, ‘앨리스’, ‘토끼’, ‘문’ 등은 객체로 생각할 수 있음
    → 뚜렷한 경계를 갖고, 식별 가능하며, 상태와 행동을 갖기 때문
  • 하지만, 앨리스의 ‘키’나 ‘위치’는 객체가 아님
    → 스스로 독립적인 의미보다는, 다른 것의 특성을 표현하기 위한 수단으로 쓰이기 때문
    → 프로퍼티는 객체의 특성을 표현할 수 있음
  • 객체를 사용해 다른 객체의 상태를 표현할 때도 있음
    → ‘앨리스가 음료를 들고 있음’이라는 상태는 ‘앨리스’ - ‘음료’ 사이의 연결로 표현할 수 있음
    → 객체도 객체의 특성을 표현할 수 있음

따라서, `모든 객체는 단순한 값과 객체의 조합으로 표현할 수 있다`
이 때, 객체의 상태를 구성하는 모든 특징을 `프로퍼티`라고 한다

앨리스’가 ‘음료’를 마시기 위해 들고 있는 상황

  • ‘앨리스’와 ‘음료’ 모두 객체로 판단할 수 있음
    → 앨리스와 음료 모두 서로의 상태에 영향을 줌
    → 앨리스가 음료를 들고 있는 상태에서만 가능
    → 객체들 사이의 링크를 통해서만 메시지를 주고받을 수 있음
    → ‘앨리스’와 ‘음료’가 상호작용을 하려면 ‘들고 있다’라는 링크가 있어야 함
    → 즉, 객체가 다른 객체의 상태를 표현하고 있을 때에는, 링크가 필요하다
  • ‘엘리스’의 ‘키’에 따라서 문을 지나갈 수 있는지 없는지 결정됨
    → 앨리스의 키처럼 객체를 구성하는 단순한 값을 속성이라고 함

💡 프로퍼티는 단순한 값인 속성과 다른 객체를 가리키는 링크라는 두 가지 종류의 조합으로 표현

이 책에서 객체의 상태 정의

상태는 특정 시점에 객체가 가지고 있는 정보의 집합으로 객체의 구조적 특징을 표현한다.
객체의 상태는 객체에 존재하는 정적인 프로퍼티와 동적인 프로퍼티 값으로 구성된다.
객체의 프로퍼티는 단순한 값과 다른 객체를 참조하는 링크로 구분할 수 있다.


객체의 자율성

  • 객체는 다른 객체의 상태에 직접적으로 접근하고, 변경할 수 없음
    → 자기 자신만이 자신의 상태를 책임짐
    → 다른 객체가 특정 객체에 링크를 통해 메시지를 보낼 수는 있음
    → 하지만, 그 메시지를 통해 특정 행동을 할지 말지는 스스로가 결정
    객체는 스스로의 행동에 의해서만 상태가 변경됨을 보장하여 자율성을 유지

행동

상태와 행동

  • 객체의 상태를 변경하는 것은 객체의 자발적인 행동 뿐
    → 이렇게 객체의 상태를 변경하는 행동은 부수 효과를 갖고 있다고 함
  • 객체의 행동은 객체의 상태를 변경시키지만, 객체의 행동에 대한 결과는 객체의 상태에 의존적
- 객체의 행동은 상태에 영향을 받음
- 객체의 행동은 상태를 변경시킴

협력과 행동

  • 객체와 객체가 협력하는 유일한 방법은 다른 객체에게 요청을 보내는 것
    → 요청을 받은 객체는 이를 수행하기 위해 특정 행동을 함
    행동이 객체들끼리 협력할 수 있는 유일한 수단
  • 객체의 협력 과정에서 스스로의 상태 뿐 아니라, 다른 객체의 상태 변경을 유발할 수도 있음
    → 앨리스가 음료를 마셔서 자신의 키도 줄어들지만, 음료의 양도 줄어듦

객체의 행동으로 인해 발생하는 결과의 두 관점
- 객체 자기 자신의 상태 변경
- 행동에 협력하는 다른 객체에게 메시지 전송

이 책에서 객체의 행동 정의

행동이란 외부의 요청 또는 수신된 메시지에 응답하기 위해 동작하고 반응하는 활동이다.
행동의 결과로 객체는 자신의 상태를 변경하거나 다른 객체에게 메시지를 전달할 수 있다.
객체는 행동을 통해 다른 객체와의 협력에 참여하므로 행동은 외부에 가시적이어야 한다.


상태 캡슐화

  • 앨리스가 음료를 마심
    앨리스.drinkBeverage()
    → 음료에게 drunken(quantity) 라는 메시지가 전달됨
    → 두 행동 모두, 송신자는 수신자의 상태에 대해 변경이 있는지 없는지 모름
    캡슐화
    객체는 캡슐 안에 상태를 감추어 외부에 노출하지 않음
    → 외부에 노출되는 것은 행동 뿐, 외부에서 접근할 수 있는 방법도 행동
  • 객체의 행동을 유발하는 것은 외부로부터의 메시지, 하지만 상태를 변경할지 말지는 객체 스스로가 결정
    → 외부에서는 메시지 수신자의 상태가 변경되는지 아닌지 알지 못함
    → 메시지 송신자는 수신자에게 어떤 간섭도 가하지 못함
  • 캡슐화를 통해, 객체의 자율성을 높이고, 협력을 단순하고 유연하게 만듦

식별자

  • 객체가 식별자를 갖는다 = 객체를 서로 구별할 수 있는 특정한 프로퍼티가 객체 안에 존재함
    → 모든 객체는 식별자를 가지며, 이 식별자로 객체들을 구별할 수 있음
  • 단순한 값은 식별자를 갖지 않음
    → 1이라는 숫자가 둘 있을 때, 두 개를 굳이 식별하지 않으려고 하는 것과 비슷한 맥락
  • 값(value)은 변하지 않는 양을 모델링함
    → 값은 상태가 바뀌지 않기 때문에, 불변 상태를 가진다고 할 수 있음
    → 값은 상태가 변하지 않기 때문에, 상태를 비교해서 동일한지 판단할 수 있음
    → 이런 성질을 동등성이라고 함
  • 객체는 시간에 따라 상태의 변동이 있을 수 있음
    → 객체는 상태가 바뀌기 때문에, 가변 상태를 가진다고 할 수 있음
    → 타입이 같은 두 객체의 상태가 모두 같더라도, 두 객체는 다른 객체로 판단함
    → 객체는 상태와 무관하게, 식별자로 동일한 객체인지 아닌지 판단
    → 이런 성질을 동일성이라 함
  • 우리는 단순 숫자 1, 1 두 가지를 동일한 값이라고 생각하는 것 → 동등성 맥락
    키가 180cm인 움파, 룸파 두 명을 키는 같더라도 다른 사람이라 생각하는 것 → 동일성 맥락

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

💡 객체의 특성

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


기계로서의 객체

  • 쿼리: 객체의 상태를 조회하는 작업
  • 명령: 객체의 상태를 변경하는 작업

기계로서의 객체

  • 기계는 뜯어보지 않는 한, 내부에 있는 요소들을 확인할 수 없음
    → 객체를 이런 기계에 비유해서 생각
  • 원형 버튼을 통해서 기계의 상태를 조회할 수 있음 → 쿼리
  • 사각형 버튼을 통해서 기계의 상태를 변경할 수 있음 → 명령
  • 객체에 접근할 수 있는 방법은 객체가 제공하는 동작 뿐이라는 것을 보여줌
  • 두 개의 동일하게 동작하는 기계가 있다고 해도, 다른 기계로 인지
    → 식별자를 설명할 수 있음
  • 두 개의 기계가 ‘링크’되어 있어야 서로 메시지를 보내며 협력할 수 있음
    → 객체 간의 협력 관계도 설명 가능


행동이 상태를 결정한다

  • 객체지향의 입문자는 상태를 중심으로 객체를 바라봄

  • 하지만, 상태를 먼저 결정하고, 행동을 나중에 결정하는 것은 설계에 나쁜 영향을 끼침

    • 상태를 먼저 결정할 경우 캡슐화에 저해됨
    • 객체를 협력자가 아닌 고립된 섬으로 만듬
      → 객체가 필요한 이유는 애플리게이션 문맥 내에서 다른 객체와 협력하기 위함
    • 객체의 재사용성이 저하됨
      → 상태에 초점을 맞추게 된다면 다양한 협력에 참여하기 어려워짐
  • 협력에 참여하는 객체를 잘 만들기 위해서는 행동에 초점을 맞춰야 함

  • 객체지향 설계는 애플리케이션에 필요한 협력을 먼저 생각
    → 협력에 참여하는 데에 필요한 행동을 생각
    → 행동을 수행할 객체를 선택
    → 행동에 필요한 정보가 무엇인지 고려하여 상태를 결정

  • 협력 안에서 객체의 행동은 객체의 책임을 의미함
    → 객체가 어떤 책임이 필요한지부터 생각해야 함
    책임-주도 설계 ( Responsibility-Driven Design, RDD )



객체지향의 사실과 오해

profile
TIL을 기록하기 위한 게시글들 | 노션에 기록해 둔 것들 옮길 예정 !

0개의 댓글