객체지향의 사실과 오해를 읽고

 

 

1. 들어가며

 

좋은 코드를 짜자! 라는 말은 항상 하지만 프로젝트에서 막상 코드를 짜다보면 내 코드에 확신을 가지는 것은 쉽지 않습니다. 경험이 늘어날수록 개선은 되어가지만 어떤 확고한 행동 기준을 스스로 잡지 않으면 고민을 되풀이하는 경험도 하게 됩니다. 이번에 읽은 "객체지향의 사실과 오해"는 그런 기준점을 잡아주는데 큰 도움이 되는 책입니다. 다음과 같은 분들에게 추천을 드리고 싶습니다.

 

프로젝트 경험이 몇 번 있지만 전체적인 아키텍쳐를 짜는 기준을 명확히 잡지 못하겠다.

 

이유는 다음과 같습니다. 이 책에서는 객체지향 프로그래밍에 대한 구체적이고 상세한 구현을 보여주지는 않습니다. 즉 코드 설명은 거의 없다고 봐도 무방합니다. 다만 좋은 구조를 만들 수 있는 접근 방법을 서술하고 있습니다. 프로젝트 경험에서 겪었던 에로사항과 함께 이 접근 방법을 접하면 더욱 공감이 되면서 시너지가 커진다고 생각합니다. 원래 이런 '좋은 설계'라는 것은 내가 겪어보지 않으면 진심으로 공감하기 쉽지 않습니다. 프로젝트 경험이 없다면 공감하기 힘들 것이니 프로젝트를 하면서 어떻게 좋은 설계를 할 지 많이 고민해보고 방법을 찾을 때 이 책은 큰 도움이 될 수 있습니다.

 

2. 내용 요약

 

2. 1 객체지향이란?

 

저자는 객체지향의 본질을

객체지향이란 시스템을 상호작용하는 자율적인 객체들의 공동체로 바라보고 객체를 이용해 시스템을 분할하는 방법이다.

 

이라고 정의합니다. 자율적으로 상호작용한다. 라는 말이 이 책의 핵심을 구성하고 있습니다. 그럼 어떻게 해야 자율적으로 상호작용한다고 볼 수 있을까요? 더 풀어서 설명해보겠습니다.

 

자율적인 객체란 상태와 행위를 함께 지니며 스스로 자기 자신을 책임지는 객체를 의미합니다. 그리고 객체는 시스템의 행위를 구현하기 위해 다른 객체와 협력하며 각 객체는 협력 내에서 정해진 역할을 수행하며 역할은 관련된 책임의 집합입니다.
객체는 다른 객체와 협력하기 위해 메시지를 전송하고 메시지를 수신한 객체는 메시지를 처리하는데 적합한 메서드를 자율적으로 선택한다고 볼 수 있습니다.

 

코드를 담는 클래스의 관점에서 이렇게 메시지를 주고 받는 객체의 관점으로 사고의 중심으로 전환하는 것이 중요합니다. 중요한 것은 어떤 클래스가 필요한가가 아니라 어떤 객체들이 어떤 메시지를 주고받으며 협력하는가 입니다.

 

뭔가 추상적으로 들리는 말입니다. 저자는 이에 대해 기존의 객체 지향에 대한 오해를 짚고 그걸 풀어나가며 구체적인 설명을 더해주고 있습니다.

 

2. 2 객체지향에 대한 오해와 사실.

 

책의 제목부터 객체지향의 '사실'과 '오해' 입니다. 어떤 것이 오해이고 그에 대한 사실일까요?

 

첫 번째 오해

객체에 필요한 상태가 무엇인지 결정하고 그 상태에 필요한 행동을 결정하는 실수를 자주 저지른다.

 

상태에 초점을 맞출 경우 객체 내부로 깔끔하게 캡슐화되지 못하고 공용 인터페이스에 그대로 노출될 확률이 높아집니다. 또한 객체를 협력자가 아닌 고립된 섬으로 만들 수 있습니다. 그리고 객체의 상태에만 초점을 맞춰 재사용성이 저하가 됩니다.

 

그렇다면 어떤 것이 사실일까요?

상태가 아닌 행동에 초점을 맞춰야 한다.. 객체는 다른 객체와 협력하기 위해 있고, 객체의 행동은 객체가 협력에 참여하는 유일한 행동이다

 

어떤 객체가 어떤 타입에 속하는지를 결정하는 것은 객체가 수행하는 행동입니다. 어떤 객체들이 동일한 행동을 수행할 수 있다면 그 객체들은 동일한 타입으로 분류될 수 있습니다.
객체의 내부적인 표현은 외부로부터 철저하게 감춰집니다. 객체의 행동을 가장 효과적으로 수행할 수 있다면 객체 내부의 상태를 어떤 방식으로 표현하더라도 무방하다고 볼 수 있습니다.

 

두 번째 오해

시스템에 필요한 데이터를 저장하기 위해 객체가 존재한다는 것은 선입견이다. 

 

즉 저자는 객체를 설계할 때 데이터 중심으로 설계하는 것은 옳지 않다고 말하고 있습니다. 예를 들어 각 객체가 어떤 값을 가지고 있어야 하는지 먼저 설계한 뒤 각 객체 간의 관계를 설정하는 일이 있습니다.

 

그렇다면 어떻게 접근하면 좋을까요?

 

데이터는 단지 객체가 행위를 수행하는데 필요한 재료. 객체의 존재 이유는 행위를 수행하며 협력에 참여하기 위한 것, 즉 그들의 행동과 책임이 중요하다.

 

즉 객체 간의 관계를 설정할 때는 각 객체가 어떤 역할과 행위를 맡을 수 있는지를 먼저 따진 뒤 그 다음에 그 안에 들어갈 데이터를 설정해야 합니다.

 

세 번째 오해와 사실

객체지향을 클래스와 클래스 간의 관계를 표현하는 시스템의 정적인 측면에 중점을 둔다.

 

중요한 것은 정적인 클래스가 아니라 협력에 참여하는 동적인 객체이며 클래스는 단지 시스템에 필요한 객체를 표현하고 생성하기 위해 프로그래밍 언어가 제공하는 구현 매커니즘일 뿐입니다.

 

따라서 올바른 객체를 설계하기 위해서는 협력을 설계해야 한다. 협력을 설계한다는 것은 객체들이 주고받을 요청과 응답의 흐름을 결정한다는 것이다. 이 흐름은 객체가 협력에 참여하기 위해 수행될 책임이 된다.

 

 

2. 3 어떻게 설계할 것인가.

 

- 책임 주도 설계

 

저자는 위의 오해들을 극복한 설계 방법을 '책임 주도 설계'라고 부르고 이를 따르기 위한 방법을 6가지 절차로 나누어 설명해주고 있습니다.

 

  1. 시스템이 사용자에게 제공해야 하는 기능인 시스템 책임을 파악한다.
  2. 시스템 책임을 더 작은 책임으로 분할한다.
  3. 분할된 책임을 수행할 수 있는 적절한 객체 또는 역할을 찾아 책임을 할당한다.
  4. 객체가 책임을 수행하는 중에 다른 객체의 도움이 필요한 경우 이를 책임질 적절한 객체 또는 역할을 찾는다.
  5. 해당 객체 또는 역할에게 책임을 할당함으로써 두 객체가 협력하게 한다.
  6. 객체가 자율적이기 위해서는 객체에게 할당되는 책임의 수준 역시 자율적이어야 한다. 객체가 어떻게 해야 하는가가 아니라 무엇을 해야하는지 정의해라. 하지만 협력의 의도를 명확하게 표현하지 못할 정도로 추상적인 것 역시 문제다.

- 메시지와 메서드

 

설계를 위해선 각 객체가 어떻게 상호작용하는지 우선 알아야 합니다. 저자는 메시지와 메서드라는 측면에서 해당 상호작용을 설명해주고 있습니다.

 

하나의 객체는 메시지를 전송함으로써 다른 객체에 접근한다. 모든 협력은 이러한 메시지를 통해서 이루어지는데 이 메시지를 내부적으로 처리하기 위해 선택하는 방법을 메서드라고 한다. 

 

조금 추상적인 말로 느껴질 수 있을 것 같습니다. 구체적인 예를 들어 설명해보자면, 다형성은 여기서 서로 다른 유형의 객체가 동일한 메시지에 대해 다르게 반응하는 것을 의미합니다. 좀 더 구체적으로 말해 서로 다른 타입에 속하는 객체들이 동일한 메시지를 수신할 경우 서로 다른 메서드를 이용해 메시지를 처리할 수 있는 매커니즘을 말한다고 볼 수 있습니다.

 

마지막 장에서의 설계에 대한 설명은 DDD(Domain Driven Design)을 연상시켰습니다. 저자가 설명한 방법 양식은 다음과 같습니다.

 

1. 유저들의 유즈 케이스를 분석하고 도메인 모델들을 정의한다.

2. 그에 따라 각 객체들이 어떻게 협력할 것인지(메세지를 어떻게 주고 받을 것인지) 결정한다.

3. 그에 따라 클래스 다이어 그램을 구성한다

4. 안정적인 도메인 모델을 기반으로 시스템 기능을 구현하되 변화에 대응할 수 있도록 해라. 기능은 변경될 수 있지만 코드에서는 확장의 형태로 이루어져야 좋다.

 

 

DDD에 대해서는 다음 글을 참조하면 좋을 것 같습니다 :)

 

https://happycloud-lee.tistory.com/94

 

DDD 핵심만 빠르게 이해하기

마이크로서비스의 설계 방법론인 DDD(Domain Driven Design)에 대해 제가 가진 지식과 그간의 경험을 기반으로 정리하였습니다. 이 글을 읽기 전에 먼저 일하는 방식 변화를 이끌고 있는 애자일, 마이

happycloud-lee.tistory.com

 

 

 

3. 나가며

 

객체지향에 대해 오랜 경력을 가진 개발자 분의 통찰을 볼 수 있는 좋은 책이었습니다. 이상한 나라의 앨리스로 모든 설명을 하신 것이 정말 인상적이었던 책이었습니다. 책 표지에 토끼와 앨리스풍 삽화가 있을 땐 무슨 의미인지 몰랐는데 조금 읽자마자 아 이래서 책 표지에 토끼가 있구나! 했던 것 같습니다. 

 

다만 책의 서문에서도 서술해주셨듯이 이 책은 실제로 코드를 짜보면서 객체 지향을 잘 짜는 법을 익히는 책은 아닙니다. 그래서 어떤 구체적인 방법론을 원한다면 적합하지 않을 것 같습니다. 다만 저는 이 책과 함께 박재성님의 자바 웹프로그래밍 next step 을 함께 학습하였는데

 

https://www.yes24.com/Product/Goods/31869154

 

자바 웹 프로그래밍 Next Step - 예스24

이 책은 웹 개발 입문의 껍질(책에서는 ‘양파껍질’로 표현한다)을 막 벗겨낸 경력 1년 이상의 초보개발자들을 대상으로 하는 책이다. 웹 서버, 프레임워크 등을 직접 제작해보고 테스트와 리

www.yes24.com

 

시너지가 정말 좋았습니다. 객체지향에 대한 넓은 범위의 접근 방법은 이 책을 통해 접하고 실제로 어떻게 하면 좋을지는 박재성님의 책에서 웹 프레임워크를 구현해보며 하나하나 적용하면서 배워갈 수 있었습니다. 개인적으로 위 책은 정말 정말 명저라고 생각하고 한번쯤 꼭 시간을 들여 하나씩 구현해보는 것을 추천드리고 싶은 책입니다. 그러면서 오늘 설명드린 이 책을 함께 보면 시너지가 더욱 좋다고 생각합니다 :)

 

다음엔 자바 웹 프로그래밍 Next Step에서 배운 것들을 써보도록 하겠습니다.