본문 바로가기

도서/객체지향의 사실과 오해

[객체지향의 사실과 오해] 도서 리뷰 2차

반응형

[3] 타입과 추상화 

3장의 제목은 타입과 추상화로 헤리 벡이 고안한 지하철 노선도를 예시를 소개합니다. 오른쪽이 헤리 벡이전의 런던의 지하철이고 오른쪽이 헤리벡이 제안한 지하철 노선도입니다. 오른쪽의 지하노선도가 한 눈에 봐도 현대의 노선도와 유사하다고 느껴지는 이유는 지하철 노선도를 보는 목적에 초점을 맞췄기 때문입니다. 지하철 노선도는 역과 역사이의 거리와 지형을 보는 것이 아닌 역 사이의 관계와 가장 빠르게 환승할 수 있는 방법을 보려고 만들었다고 할 수 있습니다. 헤리 벡은 기존의 복잡한 런던 지하철 노선도에서 역과 역사이의 관계에 초점을 맞춘 새로운 노선도를 만듦으로써 기존의 노선도의 불편함을 해결할 수 있었습니다. 

 

지하철 노선도에서 지형과 거리등 불필요한 부분을 제거하고 역간의 관계에 초점을 맞춘 위의 예시처럼 추상화란 현실에서 불필요한 부분을 제거 하면서 사뭉릐 본질을 드러나게 하는 과정이라고 책에서는 소개합니다. 

 

추상화를 위한 두가지 방법은 다음과 같습니다. 

  • 구체적인 사물들 간의 공통점은 취하고 차이점은 버리는 일반화를 통해 단순화한다. 
  • 중요한 부분을 강조하기 위해 불필요한 세부사항을 제거해 단순화한다. 

헤리 벡의 지하철 노선도는 두번째 방법에 해당한다고 볼 수 있을 것 같습니다. 그럼 첫번째 방법에 대해 더 자세히 보려고 합니다. 

 

추상화를 위한 첫번째 방법인 공통점을 활용하는 가장 쉬운 방법은 그룹으로 나눠 단순화 하는 방법이라고 소개합니다. 공통점을 기반으로 객체들을 묶기위한 그릇을 책에서는 개념이라고 정의하는데 개념을 이용하면 여러 그룹으로 분류할 수 있습니다. 

객체에 어떤 개념을 적용하는 것이 가능해서 개념 그룹의 일원이 될 때 객체를 그 개념의 인스턴스라고 부르며 주변의 복잡한 객체들은 단지 몇가지의 개념의 인스턴스일 뿐이라고 설명합니다. 이렇게 보니 세상의 다양한 객체들을 개념으로 그룹화하는 것이 추상화를 위한 필수 요소라고 생각이 드는것 같습니다. 

 

개념의 3가지 관점은 다음과 같습니다. 

  • 심볼 : 개념을 가리키는 이름이나 명칭
  • 내연 : 개념의 완전한 정의, 내연의 의미를 이용해 객체가 개념에 속하는지 여부를 확인가능하다. 
  • 외연 : 개념에 속하는 모든 객체의 집합

이전에 정리했던  [객체지향의 사실과 오해] 도서 리뷰 1차 에서 소개한 엘리스의 예시를 다시 들자면 트럼프에 대한 정의를 내연, 트럼프라는 이름은 심볼, 트럼프에 속하는 객체들의 집합을 외연에 해당합니다. 

위의 트럼프 예시 처럼 정원사, 병사, 왕, 왕비와 같은 객체들을 다른 객체들과 분류하기 위한 틀을 만들기위한 작업은 특정한 개념을 적용하는 작업으로 분류를 한다는 건 추상화를 위한 방법중 하나에 해당하는 것이라고 책은 설명합니다. 

 

책에서는 개념과 사살상 동일한 의미로 해석되는 단어로 타입을 설명합니다. 타입은 개념이라고 언급하며, 어떤 객체에 타입을 적용할 수 있을 때 그 객체를 타입의 인스턴스라고 한다고 설명합니다. 타입이라는 단어 때문에(?) 프로그래밍 측면에서 타입과 그 의미가 유사하게 들리지만 좀더 넒은 개념에서 설명하려고 하는것 같습니다. 프로그래밍에서 말하는 데이터 타입은 단지 메모리 안에 저장된 데이터의 종류를 분류하는데 사용하는 메모리 집합에 관한 메타 데이터로 개념과 동일한 타입은 더 포괄적인 의미에서 타입으로 설명됩니다. 타입의 두가지 특징은 다음과 같습니다.

  • 타입은 데이터가 어떻게 사용되느냐에 관한 것이다. 
  • 타입에 속한 데이터를 메모리에 어떻게 표현하는지는 외부로부터 철저하게 감춰진다. 

책에서는 객체를 타입에 따라 분류하고 그타입에 이름을 붙이는 것은 결국 프로그램에서 사용할 새로운 타입을 선언하는 것과 같다고 설명합니다. 객체가 서로 협력하기 위해 어떤 책임을 지녀야 하는지를 결정하는 것이 객체지향 설계의 핵심이라고 책은 자주 언급하는데 협력이라는 단어는 책의 전반에 걸쳐 가장 자주 나오는 단어인 것 같습니다. 그 만큼 객체는 협력을 위해 존재한다고 생각이 드는 것 같습니다. 

 

행동이 우선이다

 

책에서 가장 중요한 문장중 5가지를 꼽으라고 한다면 꼭 포함되는 단어라고 생각하는 문장입니다. 객체지향에 있어서 데이터가 아니라 객체가 갖는 책임, 그 책임 이전에 어떤 행동을 해야하는지를 먼저 생각해야한다는 게 책에서 거듭 강조하는 부분이라고 생각합니다. 

 

책에서는 동일하게 행동한다면 그 객체들을 동일한 타입에 속한다라고 설명합니다. 극채게 다른 객체와 동일한 데이터를 가지고 있더라도 다른 행동을 한다면 그객체들은 서로 다른 타입으로 분류될 만큼 행동을 최우선으로 고려해야한다고 강조하고 있습니다. 객체의 행동에 대해 일반화한다면 다음의 수식이 가장 알맞은것 같습니다. 

 

동일한 행동 = 동일한 책임 = 동일한 메시지 수신

 

책에서는 타입의 계층에 대해 언급합니다. 엘리스의 예시에서 정원사, 병사, 왕, 왕비 모두 트럼프 인간이었지만 모두 트럼프라는 타입에 속하고 있습니다. 이 관계를 일반화/특수화 관계라고 부르는데 일반화/특수화는 동시에 일어나며 일반화/특수화를 결정하는 것은 객체의 상태를 표현하는 데이터가 아니라 행동이라고 설명하면서 행동을 한번더 강조하고 있습니다. 트럼프라는 일반화된 타입은 더 일반적으로 행동하고 트럼프 인간 이라는 특수화된 타입은 더 특수하게 행동한다는 점에서 일반화/특수화 관계를 갖습니다. 

일반화/특수화 관계는 타입의 관점에서 슈퍼타입/서브타입 관계를 갖습니다. 슈퍼타입은 좀더 일반적인 타입을, 서브타입은 좀더 특수한 타입을 의미합니다. 어떤 타입을 다른 타입의 서브타입이라고 말할 수 있으려면 다른 타입을 대체할 수 있어야한다고 설명합니다. 

 

정리하자면, 인간의 인지 능력으로는 시간에 따라 동적으로 변하는 객체의 복잡성을 극복하기 어렵습니다. 때문에 엘리스의 상태와 같이, 타입은 객체를 시간과 무관한 정적인 모습으로 다룰 수 있도록 다룰 수 있는 방법이라고 설명합니다. 

 

클래스는 타입을 구현하는 방법 중 하나로, 이외에도 코드를 재사용하는 용도로 사용되기에 클래스 != 타입 을 명심해야한다고 강조하고 있습니다. 

 


 

[4] 역할 / 책임 / 협력

4장의 시작은 최후 통첩 게임의 실험을 소개하면서 시작합니다. 최후 통첩 게임에 대한 위키의 설명을 덧붙이자면 다음과 같습니다. 

기본적으로 최후통첩 게임은 두 명의 참여자가 주어진 돈을 어떻게 나눌지 결정하는 게임이다. 첫 번째 참여자가 돈을 어떻게 나눌지 제안하면, 두 번째 참여자는 이를 받아들이거나 거절할 수 있다. 만약 두 번째 참여자가 거절을 선택하면 두 사람 모두 돈을 한 푼도 받지 못한다. 그러나 두 번째 참여자가 '수용'을 선택하면 첫 번째 참여자의 제안에 따라 돈이 나누어진다.                                          - 위키백과 - 

 

이 실험 결과의 의의는 각 개인이 처해있는 상황이 인간의 행동에 영향을 미친다는 것인데 인간의 행동을 결정하는 가장 큰 요인은 타인과의 협력 이라고 설명합니다. 객체지향의 세계도 협력이라는 문맥이 객체의 행동방식을 결정하는 만큼 이 예시는 협력에 대해 다시한번 강조하고 있는 것 같습니다. 

 

[4-1] 협력 

 

이번 엘리스의 이야기 중 엉터리 재판 - 누가 여왕의 파이를 훔쳐나? 의 이야기가 예시로 나오는데 간략히 상황을 설명하자면, 왕이 재판을 시작하면서 왕은 토끼에게 목격자를 불러오고 토끼는 증인인 모자장수에게 입장을 명령하며 입장 완료후 왕은 모자장수에게 증언할 것을 요청합니다. 

책은 이 예시를 통해 어떤 등장인물이 특정한 요청을 받아들일 수 있는 이유는 그 요청에 대해 적절한 방식으로 응답하는데 필요한 지식과 행동 방식을 가지고 있기 때문이라고 설명합니다. 

  • 왕의 재판할 책임
  • 토끼는 목격자(지식)를 알고 있고 증인석에 입장하라고 명령할 책임
  • 모자장수는 정황(지식)에 대해 알고 있고 증언할 책임
  • 왕의 증언을 명령할 책임

요청과 응답은 협력에 참여하는 객체가 수행할 책임을 정의한다고 이번에도 협력과 책임에 대해 설명하면서 한번더 강조하고 있습니다. 이 책을 읽는 내내 객체간의 협력이 얼마나 중요한지 매번 깨닫고 있는것 같습니다. 

 

[4-1] 책임

 

책에서는 어떤 객체가 어떤 요청에 대해 응답을 줄 수 있거나 적절한 행동을 할 의무가 있는 경우 해당 객체가 책임을 갖는다라고 설명합니다. 

객체지향 개발에서 가장 중요한 능력은 책임을 능숙하게 소프트웨어 객체에 할당하는 것
- 크레이그 라만 -

 

크레이그 라만은 책임은 2가지로 분류할 수 있다고 설명합니다. 

  • 하는것
    • 객체를 생성하거나 계산을 하는 등 스스로 하는 것
    • 다른 객체의 행동을 시작하는 것
    • 다른 객체의 활동을 제어하고 조절하는 것
  • 아는것
    • 개인적인 정보에 관해 아는 것
    • 관련된 객체에 관해 아는 것
    • 자신이 유도하거나 계산할 수 있는 것에 관해 아는 것

엘리시의 재판 예시에서 왕은 모자장수에게 증언을 시작하게 한다는 측면에서 책임이 있다고 할 수 있고 마찬가지로 토끼는 증인에 대해 알고 있고 모자장수의 입장을 하게 할 수 있다는 점에서 책임이 있다고 설명할 수 있습니다. 

 

책임은 객체의 외부에 제공해 줄 수 있는 정보(아는 것의 측면)와 외부에 제공해 줄 수 있는 서비스(하는 것의 측면)의 목록이라고 설명합니다. 따라서 책임은 객체의 공용 인터페이스를 구성합니다. 

 

[4-2] 역할

 

Q. 협력의 관점에서 어떤 객체가 어떤 책임의 집합을 수행한다는 것이 무엇을 의미하는가? 

 

저는 처음에 이 질문의 답변으로 객체가 특정 개념의 인스턴스를 의미한다는 걸 한번더 말하려고 하는것인지 알았지만, 다른 이야기를 하려고 만든 질문이었습니다. 책에서는 객체가 협력에 참여하기 위해 특정 역할을 수행한다는 것을 의미한다고 설명합니다. 

 

엘리시의 예시로 다시 돌아와 해당 재판은 왕의 역할을 여왕이 증인은 요리사, 엘리스 등의로 바뀌는 상황을 설명합니다. 그림으로 정리하면 다음과 같습니다.

이 3가지의 협력 을 별도로 관리하고 유지하는것이 바람직 한가? 재판과정이 변경된다면 3가지의 협력을 모두 수정하는 것이 바람직한가? 저는 이 질문이 이 책을 관통하는 중요한 질문이라고 생각합니다. 레거시를 유지보수 하는 상황에서 동일한 로직을 처리하는 업무 프로세스가 N개라면 N개의 프로세스를 모두 검토하고 수정하는 작업이 있었습니다. 저는 이 상황이 비효율적이고 버그 발생 확률도 높다고 생각했던 만큼 이 예시와 질문이 크게 공감되었던것 같습니다. 

 

책에서는 3개의 재판 과정을 3개의 협력이라고 보고 판사와 증인이라는 역할(role)을 사용하면 협력을 포괄할 수 있는 하나의 협력으로 추상화 할 수 있다고 설명합니다. 

역할은 "이 자리는 해당 역할을 수행할 수 있는 어떤 객체라도 대신할 수 있다"와 같다고 설명합니다. 단, 역할을 대체할 수 있는 객체는 동일한 메시지를 이해할 수 있는 객체로 한정된다고 덧붙이고 있습니다. 동일한 역할을 수행하는 객체들이 동일한 메시지를 수신할 수 있기 때문에 동일한 책임을 수행할 수 있다는 것이 중요 포인트 인것 같습니다. 

 

4장의 마지막은 객체지향 설계기법 3가지에 대해 소개합니다. 

  • 책임주도 설계
  • 디자인 패턴
  • 테스트 주도 개발 

다만, 이 내용은 이 글이 아니라 새로운 글에서 더 학습한 후에 포스팅 하려고 합니다. [객체지향의 사실과 오해] 도서 리뷰 2차는 개념과 동일한 의미로써의 타입, 타입의 추상화에 대한 내용 및 역할이라는 것의 의미와 역할의 중요성에 대해 설명했습니다. 이 책이 매력적으로 느껴지는 이유는 신박한 예시를 객체지향 세계로 적용하는 과정이 재미있고 중요한 부분을 여러번 강조(객체의 협력을 가장 많이 강조한다고 생각합니다)하면서 책의 어느 부분이 중요한 부분인지 포커스를 맞춰가며 읽는게 수월하기 때문인것 같습니다. 다음 글을 마지막으로 이 책에 대한 리뷰를 종료하겠습니다.