Chapter 01. 협력하는 객체들의 공동체


객체지향에 대한 오해


객체지향 프로그래밍이란 현실 속에 존재하는 사물을 최대한 유사하게 모방해 소프트웨어 내부로 옮겨오는 작업이며, 실세계의 투영이자, 객체란 현실 세계에 존재하는 사물에 대한 추상화이다.

책의 첫 장에 쓰인 내용이며, 내가 평소에 객체지향이라는 개념을 어떻게 바라보고 있는지에 대한 내용이기도 했다. 철저하게 객체지향의 객체와 현실 세계의 객체를 대조하며 설계하려고 해 보았지만, 왜인지 모르게 내 맘처럼 잘되지 않았다.

이 내용을 읽으며 “그렇지, 객체지향은 이런 거지”라고 생각할 때, ‘아쉽게도’라는 말이 나오자 당황했다.

객체지향은 현실 세계에 대한 모방?


실세계에 대한 비유가 객체지향의 다양한 측면을 이해하고 학습하는 데 매우 효과적이다.

현실 세계의 사람들이 암묵적인 약속과 명시적인 계약을 기반으로 협력하며 목표를 달성해 나가는 과정은 ‘메시지’를 주고받으며 공동의 목표를 달성하기 위해 ‘협력’하는 개체들의 관계를 설명하는 데 적합하다

현실 세계로 객체지향의 기반을 이루는 철학적인 개념을 설명하는 데는 적합하지만, 객체지향 분석, 설계를 설명하기에는 적합하지 않은 방식이었다. 이렇듯 객체지향이라는 용어에 담긴 기본 사상을 이해하고 학습하는 데는 매우 효과적이라는 이유에, 실세계에 대한 모방이라는 개념을 쉽게 버리지 못하는 것이었다.

개인적으로 붕어빵으로 객체지향의 클래스를 설명하는 것과 비슷한 것 같은 느낌을 받았다.

역할, 책임, 협력


이 책에서는 ‘커피 주문’의 과정에서 객체지향의 가장 중요한 개념 세 가지 역할, 책임, 협력을 설명한다. 손님, 캐시어, 바리스타는 각자 역할책임을 가진다.

손님은 주문하고,
캐시어는 주문을 받으며, 바리스타에게 주문을 전달하고,
바리스타는 들어온 주문에 따라 커피를 만들고,

그리고 이러한 역할, 책임과 함께 다른 사람과의 협력이 존재하며, 협력의 과정에는 요청응답이 존재한다.

이 내용은 그대로 객체지향의 개념에도 적용이 된다.

협력하는 객체와 자율성


협력적인 객체는 다른 객체의 요청에 귀 기울이고, 다른 객체에 도움을 요청하기도 한다.

정확히 말하면 객체는 다른 객체의 명령에 복종하는 것이 아니라, 요청에 응답할 뿐이다. 어떤 방식으로 응답할지는 객체 스스로 판단하고 결정한다.

이것이 협력하는 객체가 가져야 하는 또 다른 덕목 자율성이다.

캡슐화


캐시어가 바리스타에게 커피 제조를 요청할 때, 캐시어는 제조법을 알지 못한다. 커피 제조 방법은 바리스타만 알면 된다.

이처럼 객체는 다른 객체가 ‘무엇(What)’을 수행하는지 알 수 있지만, ‘어떻게(How)’ 수행하는지에 대해서는 알 수 없다.

이것이 객체지향의 캡슐화이다.

이렇게 객체는 외부의 간섭을 받지 않고 스스로 생각하고 판단하는 자율적인 존재이다.\

Chapter 02. 이상한 나라의 객체


상태, 행동, 식별자


이 책은 <이상한 나라의="" 앨리스="">의 내용을 인용하며 '객체'를 `상태`, `행동`, `식별자`를 지닌 실체라고 설명한다.

  • 앨리스는 상태를 가지며 상태는 변경할 수 있다.
  • 앨리스의 상태를 변경시키는 것은 앨리스의 행동이다.
    • 행동의 결과는 상태에 의존적이다.
  • 앨리스는 어떤 상태에 있더라도 유일하게 식별할 수 있다.

앨리스는 음료를 마시면 키가 줄어들어, 작아서 가지 못하던 문을 통과할 수 있다. 음료를 마시면 앨리스의 키가 줄어들고, 문을 통과해 다른 장소로 이동한다고 해도, 앨리스는 앨리스다.

‘상태’, ‘행동’, ‘식별자’의 관점에서 다시 서술해 보겠다.

앨리스는 ‘음료’라는 객체협력을 한다. 앨리스는 음료를 ‘마신다’라는 행동에 의해 ‘키’라는 상태가 변경된다. 그렇게 키가 작아진 앨리스는 ‘문’이라는 객체와 ‘통과’라는 행동으로 협력한다. 그렇게 앨리스의 ‘장소’라는 상태가 변경되지만, 여전히 앨리스의 식별자는 같으므로, 앨리스는 앨리스다.

이 과정에서 앨리스와 음료는 객체 사이의 연결된 관계여야 한다.

앨리스와 음료의 자율성과 캡슐화


현실 세계에서 앨리스는 음료를 마시는 능동적인 존재이지만, 음료는 스스로 아무것도 할 수 없는 수동적인 존재이다. 음료의 양이 줄어들게 만든 주체는 내용물을 마신 ‘앨리스’가 되며, 음료의 양이 얼마나 줄어들지도 ‘앨리스’가 결정한다.

객체 지향의 세계에서 모든 객체는 자율적인 존재가 된다. 음료를 Drink()하면 앨리스의 키가 줄어드는 것의 주체가 ‘앨리스’인 것처럼, 음료가 Drunken()되면 음료의 양이 줄어드는 것의 주체가 ‘음료’가 된다.

모든 객체가 자율적인 존재가 되는 것, 이것이 현실 세계와 객체 지향 세계의 중요한 차이점이다.

그리고 서로는 메시지를 전달할 뿐이지, 각자가 어떻게(How) 행동할지 알 수 없고 캡슐화되어 있다. 음료를 마시면 앨리스의 키가 줄어드는 것도, 얼마나 줄어드는 것도 음료가 알 수 없고, 음료를 마시면 음료의 양이 줄어드는 것도, 얼마나 줄어드는 것도 앨리스가 알 수 없다. 그렇지만 상대방이 무엇을(What) 행동할지는 외부에서 알 수 있다.

값과 객체 / 동등성과 동일성


이 책을 읽기 전까지 설명할 수 없는 차이였다.

  • 값 : 숫자, 문자열, 시간, 등과 같이 ‘상태가 변하지 않는다’. (불변 상태)
  • 객체 : 시간과 행동을 통해 ‘상태가 변한다’.

  • 동등성 : ‘상태’를 이용해 두 값이 같은지 판단할 수 있다.
  • 동일성 : ‘식별자’를 이용해 두 객체가 같은지 판단할 수 있다.

값과 객체는 혼동하기 쉬운 개념인데, 그 이유가 대부분의 객체지향 프로그래밍 언어에서 두 개념 모두 클래스를 이용해 구현되기 때문이라고 한다. 정수는 Integer 클래스로, 사람은 Person 클래스로..

맥락에 따란 두 개념 모두 객체가 될 수 있기 때문에 값 객체(Value Object), 참조 객체(Reference Object)로 구분 짓는다.

  • 값 객체 : 식별자를 가지지 않는 ‘값’
  • 참조 객체 : 일반적인 의미의 식별자를 지닌 ‘객체’

쿼리(Query)와 명령(Command)


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

두 작업 모두 ‘행동’을 구성하는 작업이며, 쿼리는 Getter() 메서드와 비슷한 개념이다.

‘행동’은 외부에 모두 공개되어 모두가 확인할 수 있으며, 그 ‘행동’의 내부는 알 수 없다.

즉, 객체의 ‘상태’에는 직접적으로 접근할 수 없으며, 접근은 ‘행동’으로만 가능하다.

private으로 선언된 멤버 변수
public으로 선언된 멤버 함수

행동이 상태를 결정한다


애플리케이션 안에 살아갈 앨리스 객체를 설계할 때 초보자들은 앨리스 객체에 필요한 ‘상태’가 무엇인지를 찾고, 키와 위치를 앨리스에게 추가한다. 그러고 나서야 키와 위치를 변경하거나 조회할 수 있는 ‘행동’이 무엇인지를 고민한다

이 내용도 마찬가지로, 내가 잘못 알고 있었던 객체지향 설계 방법의 내용이다.

  1. 캡슐화되지 못하고 공용 인터페이스에 그대로 노출 돼버릴 확률이 높아진다
  2. 객체를 협력자가 아닌 고립된 섬으로 만든다.
  3. 객체의 재사용성이 저하된다.

위 두 가지 이유로 ‘상태’가 아닌 ‘행동’을 우선으로 설계해야 한다.

객체는 충실한 ‘협력자’여야 하며, 상태에 초점을 맞춘 객체는 ‘재사용성’이 저하되며 협력도 제대로 할 수 없다. 앞서 말한 것과 같이, ‘행동’은 객체가 협력하기 위한 유일한 방법이다. 따라서 객체의 적합성은 상태가 아닌 행동에 초점을 맞춰야 한다.

객체의 행동 결정 -> 객체의 적절한 상태 부여

이상한 나라를 창조하라


  1. 능동적인 존재, 객체 (자율성) -> 현실세계에서 앨리스와 음료의 관계에서 음료는 스스로 음료의 양을 줄일 수 없다.
  2. 전지전능한 존재, 객체 (의인화) -> 현실세계에서 토끼는 두 발로 서서 시계를 보며 허둥지둥 뛰어다닐 수 없고, 전화기가 스스로 전화를 받을 수도 없다.

< 이상한 나라의 앨리스 >에서 현실 속의 객체를 바탕으로 ‘은유’를 통해 이상한 나라의 객체를 묘사한다.

현실 속의 객체를 묘사하거나, 그렇지 않다면 깔끔하게 현실을 무시하고 자유롭게 여러분만의 새로운 세계를 창조하길 바란다. 앨리스를 매혹한 이상한 나라가 그런 것처럼 말이다.

객체 지향의 도시 전설


  1. 클래스 지향이 아닌 ‘객체’ 지향
  2. 객체 지향이란 현실 세계의 모방이 아닌 ‘은유’ -> 현실 세계 객체의 특성 중 일부를 묘사해, 기존에 없던 ‘새로운 객체’를 만드는 것

이 책을 읽고 느낀점


이 책의 제목대로 객체지향의 ‘사실’과 ‘오해’에 대해 알 수 있는 시간이었습니다. 특히 제가 알고 있다고 생각했던 내용들이 많은 객체지향 초보자가 착각하는 오해더라고요.

또한 책에서 설명하는 예시나 비유가 너무나도 적절하다고 생각합니다. 커피 주문, 이상한 나라의 앨리스, 기계 객체, 등 설명하고자 하는 내용과 어쩜 이리 찰떡 비유인지 이해에 큰 도움이 되었습니다.

가장 기억에 남는 한 문장을 말해보라고 한다면 “이상한 나라를 창조하라”인 것 같습니다. 객체지향이 현실 세계의 모방이라고 생각했던 제게 큰 충격을 준 문장이었던 것 같습니다.

알게 모르게 현실 세계를 ‘모방’하려고 했던 것 같아요.

앞으로가 기대되는 책이었습니다.

논의할 점


내가 착각하고 있었던 객체지향에 대한 ‘오해’는 뭐가 있었을까?

카테고리:

업데이트:

댓글남기기