객체지향

오브젝트(조영호) 책 정리 -4-

정한_s 2021. 11. 14. 13:22

객체지향 설계란 올바른 객체에게 올바른 책임을 할당하면서 낮은 결합도와 높은 응집도를 가진 구조를 만드는 활동이다. 설계는 변경을 위해 존재하고 변경에는 비용이 발생한다. 훌륭한 설계는 합리적인 비용에서 변경을 수용할 수 있는 구조를 만드는 것이다. 따라서 훌륭한 설계는 높은 응집도와 낮은 결합도를 가지고 있다.

 

훌륭한 설계는 객체의 상태가 아닌 객체의 책임에 초점을 맞춘다. 책임을 통해 객체의 상태가 아닌 행동으로, 나아가 객체와 객체 간의 상호작용으로 설계가 되고 이는 구현을 효과적으로 캡슐화한 객체를 낳는다. 

 

좋은 설계의 특징을 판단할 수 있는 기준은 캡슐화, 응집도, 결합도등이 있다.

 

캡슐화란 변경 가능성이 높은 부분을 숨기는 추상화 기법이다. 객체의 내부 구현을 외부로 감춤으로써 한 곳에서 일어나는 변경이 전체 시스템에 영향을 끼치지 않도록 적절하게 조절한다. 우리는 변경 가능성이 높은 부분은 내부로 숨기고 외부는 상대적으로 안정적인 부분만 공개함으로써 변경의 여파를 통재할 수 있다. 핵심은 객체 내부에서 변경될 수 있다면 어떤 것이라도 캡슐화해야 한다.

 

응집도는 모듈에 포함된 내부 요소들이 연관돼 있는 정도를 나타낸다. 모듈 내 요소들이 하나의 목적을 위해 긴밀히 협력한다면 그 모듈은 높은 응집도를 가진다.

 

결합도는 의존성의 정도를 나태 내며 다른 모듈에 대해 얼마나 많은 지식을 가지고 있는지를 나타낸다. 어떤 모듈이 다른 모듈에 대해 너무 자세한 부분까지 알았다면 두 모듈은 높은 결합도를 가진다.

 

높은 응집도와 낮은 결합도를 추구해야 하는 이유는 설계를 변경하기 쉽게 만들기 때문이다.  

 

변경과 응집도

하나의 변경을 위해 모듈 전체가 함께 변경된다면 응집도가 높은 것이고 일부만 변경된다면 응집도가 낮은 것이다. 응집도가 높은 경우 오직 하나의 모듈만 수정하면 되지만 낮은 경우 변경하는 부분이 다수의 모듈에 분산돼 있기 때문에 여러 모듈을 동시에 수정해야 한다

 

변경과 결합도

한 모듈을 수정할 때 함께 변경해야 하는 모듈이 많다면 결합도가 높은 것이고, 변경하는 모듈이 적다면 결합도가 낮은 것이다. 따라서 결합도가 높으면 높을수록 함께 변경해야 하는 모듈의 수가 많아진다.

 

* 단일 책임 원칙

모듈의 응집도가 변경과 연관이 있다는 사실을 강조하기 위해 단일 책임 원칙이라는 말이 나왔다. 단일 책임 원칙은 클래스는 단 한 가지의 변경 이유만을 가져야 한다는 것이다.

한 가지 주의해야 할 점은 여기서 '책임'이라는 말은 '변경의 이유'라는 의미로 사용된다. 단일 책임 원칙에서 책임은 지금까지 살펴본 역할, 책임, 협력에서 이야기하는 책임과는 다르며 변경과 관련된 더 큰 개념을 가진다.

 

우리는 데이터 중심의 설계에서 벗어나야 한다. 데이터 중심의 설계란 객체의 상태 변경에 초점을 맞추는 것이다. 데이터 중심의 설계는 너무 이른 시기에 데이터에 대해 고민하기 때문에 캡슐화에 실패한다. 또한 객체의 내부 구현이 객체의 인터페이스를 어지럽히고 객체의 응집도와 결합도에 나쁜 영향을 미친다.

데이터 중심의 설계에서 초점은 객체의 외부가 아닌 내부이기 때문에 객체가 관리할 데이터의 세부 정보를 먼저 결정한다. 이는 객체의 구현이 이미 결정된 상태를 의미한다. 객체의 구현이 이미 결정된 상태에서 다른 객체와의 협력을 고민하기 때문에 이미 구현된 객체의 인터페이스에 억지로 끼워 맞출 수밖에 없다.