본문 바로가기
👨‍👩‍👦‍👦 OOP

📔 이상한 나라의 객체 (객사오 2장)

by kukim 2021. 11. 18.
객체지향이란 단순히 현실 세계 모방이 아니다.

사람은 태어난 지 얼마 안 된 시기부터 물체를 하나의 개념으로 인지하고, 세상을 객체들의 집합으로 바라본다.

객체 지향과 인지 능력

인간은 물리적(e.g. 자동차, 모니터, 과일) 객체뿐만 아니라 추상적인 사물(e.g. 계좌 입금, 출금) 까지도 객체로 인식할 수 있다.

객체지향 패러다임은 인간이 세상을 다양한 객체들의 집합으로 인식하는 것처럼 SW의 세계도 다양한 SW 객체들의 집합으로 모여 있다는 믿음에서 출발한다.

하지만, 객체지향 패러다임의 목적은 현실 세계를 모방하는 것이 아닌, 현실 세계 기반 새로운 세계를 창조하는 것이다. SW 세계의 객체는 현실과 다르게 전등 스스로 불을 끄고 킬 수 있고, 비행기가 사람 없이 스스로 날 수 있다.

객체, 그리고 이상한 나라 (앨리스 이야기를 비유로)

이상한 나라 앨리스 이야기로 비유한다. 이야기 중 앨리스가 정원에 들어가기 위해 몸의 크기를 줄이고 키우고를 반복한다. 앨리스의 키를 변화시키는 것은 케이크를 먹으면 커지고, 버섯을 먹으면 작아진다. 이때 앨리스의 키를 변화시키는 것은 앨리스의 행동이다. 앨리스의 행동에 따라 앨리스의 키, 상태가 달라진다.

요약하자면

  • 앨리스는 상태를 가진다. 상태는 변경 가능하다
  • 앨리스의 상태는 행동으로 바뀐다.
  • 행동의 결과는 상태에 의존적이고 상태를 이용해 서술할 수 있다.
  • 앨리스는 어떤 상태에 있더라도 유일하게 식별(앨리스는 단 한 명) 가능하다.

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

앨리스는 상태(State), 행동(Behavior), 식별자(Identity)를 지닌 실체다. SW 안에서 객체 역시 상태, 행동, 식별자를 지닌다. 앞으로 이 3가지를 정리해보자.

상태

왜 상태가 필요한가

  • 인간은 행동의 과정과 결과를 단순하게 기술하기 위해 '상태'라는 개념을 고안했다.
  • e.g. 비행기 탑승 가능 여부 상태는 항공권의 발권 상태를 보고 예측할 수 있다.
  • e.g. 자판기는 현재까지 투입된 금액의 상태를 기억한다.
  • e.g. 텔레비전 전원이 들어온 상태여야만 채널을 변경할 수 있다.
  • 상태를 이용하면 과거에 얽매이지 않고(비행기를 타기 위해 공항으로 이동하고, 발권하고 등) 현재를 기반으로 객체의 행동 방식을 이해할 수 있다.

상태와 프로퍼티

객체의 상태는 단순한 값과 객체의 조합으로 표현할 수 있다. 또한 그 용어는 프로퍼티, 속성, 링크, 프로퍼티 값으로 표현할 수 있다.

  1. 단순한 값
    • 앨리스의 '키', '나이' 등은 객체가 아니다. 그 자체의 '양'이다. 이처럼 단순한 값 자체는 객체가 아니지만, 객체의 상태를 표현하기 위한 중요한 수단이다.
  2. 객체의 조합
    1. 객체를 사용해 다른 객체의 상태를 표현할 수 있다. 앨리스가 케이크를 먹고 있다고 가정하자. 앨리스도 객체, 케이크도 객체이다. 앨리스 객체 안에 케이크 객체를 넣어 표현할 수 있다.
  • 프로퍼티 : 객체의 상태를 구성하는 모든 특징, 속성과 링크가 있다. 정적인 상태로 일반적으로 프로퍼티는 쉽게 바뀌지 않는다)
    • 속성 : 링크와 달리 객체를 구성하는 단순한 값
    • 링크 : 객체와 객체 사이 의미 있는 연결
  • 프로퍼티 값
    • 프로퍼티의 실제 값
  • 코드 예
    • 프로퍼티(정적, 일반적으로 프로퍼티는 바뀌지 않음)
      • 속성
        • height
        • age
      • 링크
        • cake
    • 프로퍼티 값(동적, 프로퍼티 값은 바뀔 수 있음)
      • 속성 값
        • height의 100
        • age의 20
      • 링크 값
        • new Cake(10)
class Alice {
	int height = 100; 
    int age = 20; 
    Cake cake = new Cake(10); 
}

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

 

Q) 객체는 자율적인 존재이다. 객체는 다른 객체와 연결되어 있어도 다른 객체의 상태를 직접적으로 접근, 변경할 수 없다. 어떻게 다른 객체를 접근하거나 변경하는가? → "행동"을 통해서

행동

상태와 행동

객체의 행동은 자신의 상태를 변경시킨다. 다시 말해, 행동은 부수효과(side effect)가 있다.

협력과 행동

객체는 다른 객체와 협력한다. 협력하는 유일한 방법은 다른 객체에게 요청하는 것이다. 요청하기 위해선 메시지를 보낸다. 메시지를 수신한 객체는 메시지에 따라 자율적으로 행동한다. 행동이란 외부의 요청 또는 수신된 메시지에 응답하기 위해 동작하고 반응하는 활동이다. 행동의 결과로 객체는 자신의 상태를 변경하거나 다른 객체에게 메시지를 전달할 수 있다.

상태 캡슐화

현실 세계에서 앨리스가 케이크를 먹을 때 케이크는 스스로 양이 줄지 않는다. 앨리스가 먹어야 한다. 하지만 객체지향의 세계에서는 객체 스스로 자신의 상태를 관리한다. 앨리스가 케이크를 먹으면 앨리스는 키가 큰다. 앨리스 스스로 키가 컸다고 상태를 변경한다. 그리고 케이크 객체에게 먹었다고 메시지를 보낸다. 케이크는 앨리스의 메시지를 수신하고 케이크 객체가 스스로 상태를 변경한다. 이때 메시지 송신자, 앨리스는 수신자 케이크의 상태 변경에 대해서는 알 수 없다. 이것이 캡슐화이다. 객체는 상태를 캡슐 안에 감춰둔 채 외부로 노출하지 않는다. 객체가 외부에 노출하는 것은 행동뿐이며 외부에서 행동만 접근할 수 있다. 캡슐화를 통해 객체의 자율성을 높이고 협력을 단순하고 유연하게 만든다. 이것이 상태를 캡슐화해야 하는 이유다.

식별자

객체 지향 언어에서 클래스로 구현하는 두 가지가 있다. '객체'와 '값'이다. '객체'는 참조 객체(reference object) 또는 엔티티(entity)라는 식별자를 지닌 객체이다. '값'은 값 객체(value object)로 식별자를 지니지 않은 값을 가리킨다. 객체는 행동을 통해 상태가 변경된다. 가변상태(mutable state)를 가진다고 말한다. 타입이 완전히 똑같은 객체라도 독립적인 객체로 다뤄야 한다. 동일한 객체인지 판단하려면 상태가 아닌 상태 변경에 독립적인 별도의 식별자를 이용해야 한다.(동일성 비교라고 함)

값은 숫자, 날짜, 시간, 금액 등과 같이 변하지 않는 양을 모델링한다. 흔히 값의 상태는 불변 상태(immutable state)를 가진다. 두 값이 같은지 여부는 상태가 같은지 비교한다. (동등성 비교라고 함)

정리

  • 객체는 상태를 가진다.
  • 상태는 변경 가능하다.
  • 상태를 변경시키는 것은 객체의 행동이다.
  • 객체는 어떤 상태에 있더라도 유일하게 식별 가능하다.

행동이 상태를 결정한다.

초보자들은 객체의 상태를 먼저 결정하고 행동을 나중에 결정한다. 이는 설계에 나쁜 영향을 미친다.

  1. 캡슐화 저해, 2. 협력하지 못하는 객체 창조, 3. 재사용성 저하

좋은 객체 설계를 위해선 행동에 초점을 맞춰야 한다. 다르게 말해서 객체의 행동은 책임을 의미한다. 어떤 책임이 필요한가 결정하는 과정으로 설계해야 한다. 이를 '책임-주도 설계'(Responsibility-Driven Design)이라고 한다.

은유와 객체

객체지향 분석/설계에 대한 전통적인 조언은 현실 세계의 객체를 관찰하고 sw 객체에 적용하라는 것이다. 하지만 객체지향은 현실의 단순한 모방이 아니다. 현실 세계의 객체는 수동적이고 sw 객체는 능동적이다. 현실에서는 물이 스스로 사라지지 않으며 전화기는 스스로 전화하거나 계좌는 스스로 이체하지 못한다. 하지만 sw에서는 가능하다. 우리는 현실 모방과 함께 능동적인 객체를 설계해야한다. 현실 모방을 하는 이유는 실제 객체의 이름을 소프트웨어 객체의 이름으로 사용하여 표현적 차이를 줄여 소프트웨어의 구조를 쉽게 예측할 수 있기 때문이다. 유지보수가 용이한 소프트웨어를 만들 수 있다. 이러한 이유로 객체지향 지침서에서 현실 세계인 도메인에 사용되는 이름을 객체에 부여하라고 한다.

 

요약 : 현실 세계의 객체를 관찰하고 모방하여, 표현적 차이를 줄여 SW의 객체를 설계하라. 그렇게 하면 유지 보수하기 좋다. SW 객체는 현실과 다르게 객체 스스로 일을 하는 이상한 형태지만 현실과 유사하니 이해하기 쉽다. 이 책에서 이상한 나라의 엘리스를 비유한 이유가 바로 이것이다. 나만의 이상한 세계를 창조하라.

댓글