본문 바로가기
독서 기록

[오브젝트] 4장 - 설계 품질과 트레이드오프

by 워냥 2024. 3. 19.

내용 정리: 20240319 TIL

1. 개요

 

이번 장에서는 객체지향적이지 못한 설계가 초래하는 여러 문제점에 대해 살펴본다.

데이터 중심 설계를 직접 해보며 캡슐화, 응집도, 결합도의 관점에서 발생하는 문제점을 확인해 본다.


2. 접근자와 수정자

접근자와 수정자에 대한 의문

접근자(accessor) 수정자(mutator)는 각각 클래스 내부 데이터를 반환하고 변경하는 역할을 한다.

 

C++을 학습할 때 private으로 선언한 멤버 변수에 대한 접근자(getter)와 수정자(setter)의 필요성에 대한 의문을 가진 적이 있다.

왜 멤버 변수를 보호해야 한다면서 접근자와 수정자를 통해 외부에서 접근할 수 있게 할까?

 

당시에는 이 의문을 풀지 못하였고, 나 또한 접근자와 수정자를 많이 사용하며 코드를 작성하였다.

 

하지만 이번 장을 읽으며 의문이 풀리게 됐다.

캡슐화, 응집도, 결합도의 관점에서 이에 대해 알아보자.


3. 캡슐화, 응집도, 결합도

캡슐화

캡슐화는 외부에 공개할 필요가 없는 정보를 숨기는 기법이다.

변경의 관점에서 캡슐화를 살펴보자.

 

코드 변경의 관점에서 캡슐화는 불안정한 구현 세부사항을 안정적인 인터페이스 뒤로 숨기는 것이다.

캡슐화를 성공적으로 하였다면 변경이 쉬운 유연한 설계가 완성된다.

 

응집도와 결합도

변경의 관점에서 응집도와 결합도의 의미를 살펴보자.

 

변경의 관점에서 응집도모듈 내부에서 발생하는 변경의 정도를 나타낸다.

하나의 변경으로 모듈 전체가 함께 변해야 한다면 응집도가 높은 것이다.

 

변경의 관점에서 결합도한 모듈의 변경이 다른 모듈의 변경을 얼마나 요구하는지를 나타낸다.

많은 모듈들이 하나의 변경에 영향을 받는다면 결합도가 높은 것이다.

 

캡슐화와 응집도, 결합도의 관계

캡슐화를 지키면 자연스럽게 모듈 내부의 응집도를 높이고 모듈 간의 결합도를 낮출 수 있다.

반대로 캡슐화를 위반하면 모듈 내의 응집도는 감소하고 모듈 간의 결합도는 증가한다.

 

즉 응집도와 결합도는 캡슐화의 정도와 연관이 있다.

캡슐화를 최우선 사항으로 두고 이를 바탕으로 응집도와 결합도를 조정하자.


4. 데이터 중심 설계의 문제점

데이터 중심 설계는 설계 과정에서 데이터의 배치와 접근에 중점을 두는 방법론이다.

데이터에 초첨을 맞추면 접근자와 수정자의 사용이 증가하게 된다.

 

설계자는 객체가 어떤 상황에 사용될지 모르기 때문에 우선 접근자와 수정자를 만들게 된다.

이를 추측에 의한 설계 전략(design-by-guessing strategy)이라고 한다.

이러한 접근 방식은 캡슐화 원칙을 위반하고 변경에 취약한 설계를 만든다.

 

데이터는 구현의 일부다.

데이터 중심의 설계는 설계 과정이 시작되기도 전에 데이터에 대한 결정을 강요한다는 문제가 있다.

데이터는 구현의 일부다.

데이터를 먼저 결정하는 것은 설계 없이 구현부터 시작하는 것과 같다.

 

데이터를 결정한 채 다른 객체와 협력을 시작하면, 이미 구현된 객체의 인터페이스를 억지로 끼워 맞추게 된다.


5. 유연한 설계를 하는 법

캡슐화를 지켜라

캡슐화는 설계에서 가장 중요한 원칙이다.

낮은 응집도와 높은 결합도로 문제를 겪고 있다면, 그 근본적인 원인은 대부분 캡슐화 원칙을 제대로 지키지 않은 것이다.

 

단순히 속성을 private으로 선언하는 것만으로 캡슐화는 이뤄지지 않는다.

접근자와 수정자를 과도하게 사용하여 속성을 외부로 공개하는 행위도 캡슐화를 위반한 것이다.

 

스스로 자신의 데이터를 책임지는 객체

객체는 자신의 데이터를 스스로 활용해 작업을 처리해야 한다.

데이터를 가진 객체와 이를 활용하는 행위를 분리하는 것은 절차지향적인 접근 방식이다.

 

객체 스스로가 필요한 메서드를 구현하도록 해야 한다.

객체가 자신의 데이터를 어떻게 활용할지, 어떤 연산을 수행할지에 대한 질문을 던져보자.

 

  1. 이 객체가 어떤 데이터를 포함해야 하는가?
  2. 이 객체가 데이터에 대해 수행해야 하는 오퍼레이션은 무엇인가?

 

캡슐화의 진정한 의미

내부 속성을 private를 통해 외부로부터 감추는 것은 데이터 캡슐화이다.

데이터 캡슐화는 캡슐화의 한 형태에 지나지 않다.

 

캡슐화를 성공하기 위해서는 내부에서 변경될 수 있는 모든 요소를 외부로부터 감추는 것이 중요하다.

변하는 개념을 캡슐화함으로써 시스템은 변경에 대해 더 유연하게 대응할 수 있게 된다.


6. 느낀 점

이번 장을 읽는 동안 나 자신에게 찔리는 부분이 많았다.

나름대로 설계에 신경을 쓰고 코드를 작성한다고 생각했지만, 실제로는 getter와 setter를 남발하고 있었다.

다른 객체와 협력을 할 때도 적절한 인터페이스가 없어 기존에 구현된 객체의 인터페이스를 억지로 사용하곤 했다.

 

이러한 문제의 근본적인 원인은 캡슐화를 제대로 하지 못한 것이었다.

캡슐화, 응집도, 결합도의 중요성을 이론적으론 이해하고 있었지만 실제 설계 과정에서 이 원칙들을 어떻게 적용해야 하는지는 모르고 있었다.

 

이번 장을 통해 응집도를 높이고 결합도를 낮추는 설계의 기본은 캡슐화에 있다는 것을 알게 되었다.

올바른 캡슐화에 더욱 신경을 쓰며 설계를 해야겠다.

댓글