본문 바로가기

CS/CS Book

[오브젝트] ch05 책임 할당하기

조영호, 『오브젝트: 코드로 이해하는 객체지향 설계』, 위키북스(2019) 책을 1개 챕터씩 읽고 후기를 매주 일요일 23:59까지 남기는 챌린지 스타일의 스터디를 하고 있다.

지금은 23:59를 넘긴 새벽이지만 읽은 감상을 남겨본다.

역시 여러 번 조금씩 분량을 나누어서 읽어야 하는 책이라 생각 든다. 이번에도 몰아치기로 읽었지만

이번 장은 지난 장의 데이터 중심 설계의 단점을 지적했던 부분에서 나아가서 책임 할당에 대해 이야기하고 있다.

책을 삼키느라 다 소화하지 못하였기에 기억에 남는 키워드와 감상 위주로 짧게 남겨보겠다.

 

캡슐화!

유연한 설계!

객체보다는 행동!

메시지를 정하고서 객체를 선택한다.

 

이번 챕터는 구현을 통해 개념을 좀 더 와닿게 구체적으로 설명해준다 생각 들었다.

public 키워드로 선언되어있던 멤버변수를 private으로 바꾸어 캡슐화한다.

눈에 띄는 점들은 public으로 선언된 메서드들에서 private 멤버변수들과 private 메서드들의 조합으로 처리하는 점이다. 메서드들의 가독성을 좋게 해서 이름만 보더라도 어떤 동작을 하겠구나 하는 것을 선언형으로 프로그래밍한다 생각 들었다.

영화 예매를 도메인으로 가정한 프로그램이었므로 흐름은 이러했다.

  1. 할인률을 가져온다.
  2. 요금을 계산한다.
  3. 예약을 진행한다.

처음에 매우 긴 메서드라서 이게 무슨 동작을 하는 거라는 생각이 들고 코드를 주의 깊게 봐야 했지만 그렇게 긴 코드는 응집도가 낮은 코드라며 책에서 알려주며 위와 같이 1~3번의 메서드들로 작게 쪼개어 만들어서 리팩터링한 코드를 보여주어 이해하기 좋았다.

 

각 선언형으로 구현된 메서드들은 내부적으로 또 다른 private형태 메서드들을 고구마 줄기에 매달린 고구마처럼 꾸준히 호출하여 무엇을 해줘(e.g) 할인률 가져와줘, 요금 계산해줘, 예약해줘)하고 적었던 내용들을 충실히 동작하게 만들었다.

픽사베이 무료 이미지 : https://pixabay.com/ko/photos/고구마-밭작목-수확-1241696/

 

 

매주 한 챕터씩 읽을 때마다 객체지향은 메시지 위주로, 즉 동작이구나 객체들의 협력하는 공동체이고 협력을 수행을 책임을 통해 수행하는구나 라는 말들을 읽지만 무언가 나한테는 공허했다.

 

어떤 구호처럼 들리기만 할 뿐 거리감을 느꼈고 동작이 중요하다고 하는데 처음부터 어떤 동작을 할지 어떻게 알지라는 생각이 들었다.

 

내 생각에는 결국 과정을 시나리오처럼 써야지 동작을 나열할 수 있고 어떤 객체를 쓸 수 있을지 짐작할 수 있고 그렇게 협력, 책임, 역할을 구현할 수 있는 거 아닌가라는 생각이 들었었다.

 

하지만 책에서는 객체지향이 어떻더라 나오며(객체들의 협력하는 공동체 등등) 로직을 글로 정의한 부분을 객체지향적으로 코드로 표현하였기에 나에게는 처음에 어떤 동작을 왜 하게 하고 프로그램의 시나리오는 무엇이고 하는 부분이 마치 얼음이 공기가 되는 것처럼 중간에 물이 되는 과정이 안 보이고 넘어간다 느껴졌었다.

 

이번에는 좀 더 객체지향적인 코드를 구현하기 위해 접근하기 좋은 방법도 알려주어서 나도 객체지향적 프로그래밍을 단계를 쪼개서 구현하고 접근해 볼 수 있겠단 생각이 들었다.

우선 절차지향적으로 구현한다. 이후에 객체지향적 프로그래밍으로 바꾸어본다.

 

 

글을 읽고 보니 내가 코드를 동작해야 할 흐름대로 주로 구현했었지만 제대로 절차지향이었나 라는 생각과 나는 절차지향을 잘 알고 구현했던 것일까라는 생각이 잠깐 들었다.

 

하지만 그런 부분은 객체지향적으로 코드를 재구성하는 목표에는 부차적인 요소라 생각 들었고 중요한 것은 동작하는 코드를 만들고서 객체지향적 특성에 맞게 프로그램 설계를 다시 해보고 구현하는 것이라 생각 들었다.

 

데이터 중심 설계로 만들고 객체지향으로 만들라는 부분에서 왜 지난 4장에서 데이터 중심 설계를 예시로 보여주었는지 4장에서 설명이 있었지만 5장에서 더욱 와닿게 이해되었다.

 

여기서 우선 동작하는 프로그램을 만들기 위해서 프로그램에서 해야 하는 게 무엇인지 정의하고 설계하고 테스트하는 게 중요하다 싶었다.

하다 보면 테스트부터 만들고 절차지향으로 구현 한 뒤 객체지향으로 리팩터링 해야 하나라는 생각도 문득 들었지만 부담이 적게 작게 작게 만들어 나아가며 보완하는 식으로 진행해 보아야겠다.

 

이번 장을 읽으며 GRASH(General Resposibility Assignment Software Pattern) 패턴이라든지 관련해서 나오는 여러 패턴들을 잘 이해하지는 못하였었다.

 

읽는 동안 이해하기 힘들어 지쳤었지만 읽으면서 조금이나마 객체지향에서 메시지(행동)가(이) 중요하고 메시지를 정한 뒤 그에 맞는 객체를 선택한다는 점과 객체지향 프로그래밍을 연습하기 위해 동작하는 프로그램(절차지향 or 데이터 중심 설계)을 만들고 객체지향으로 리팩터링 할 수 있다는 팁을 알 수 있어 나도 객체지향적인 프로그램을 만들어 볼 수 있게 단 생각에 힘이 되었다.