모듈의 응집도와 결합도
응집도와 결합도는 모듈의 독립성을 판단하는 중요한 지표입니다. 이에 대해 공부하고 정리했습니다.
모듈화와 모듈
프로그래밍에서는 문제를 작은 부분으로 나누어서 하나씩 풀어나간다.
이때 문제를 작은 부분으로 나누는 것을 모듈화라고 한다.
모듈은 각 기능 별로 나누어진 단위다.
독립적으로 컴파일이 가능한 프로그램이나 클래스, 함수도 모듈이 될 수 있다.
각각의 모듈은 주어진 기능만을 독립적으로 수행한다.
덕분에 코드의 이해/수정이 용이하며 재사용성이 높아진다.
모듈을 수정하더라도 다른 모듈에 끼치는 영향이 적을뿐더러, 오류가 발생하더라도 기능 단위로 분리되어 있기에 손쉽게 오류를 발견하고 고칠 수 있다.
따라서 모듈의 독립성을 평가하고 개선하는 것은 중요하다.
응집도와 결합도
모듈의 독립성은 모듈의 결합도와 응집도를 기준으로 측정한다.
결합도는 모듈과 모듈 간의 의존 정도를 의미한다.
응집도는 한 모듈 내의 구성 요소들 간의 연관 정도를 의미한다.
일반적으로 응집도는 강할수록, 결합도는 느슨할수록 독립성이 높은 모듈로 평가된다.
결합도(Coupling)
결합도는 모듈 간의 상호 의존 정도로 의존도라고도 부른다.
결합도가 높은 클래스는 다른 클래스와의 의존 관계가 강하다.
두 클래스 중 하나의 구조를 변경하게 된다면 다른 클래스도 변경해야할 수도 있다.
결합도의 예시
실생활에서 컴퓨터 본체를 예로 들어보자.
본체의 부품 중 CPU, RAM, SSD는 독립적인 모듈이지만 서로 어느 정도의 연관 관계는 가지고 있다.
만약 SSD를 교체하려고 하는데 RAM까지 한 번에 교체해야 한다면 이는 상식적으로 말이 안되는 상황이다.
교체하고 싶은 부품만 교체하려면 느슨한 결합을 가지고 있어야 한다.
따라서 좋은 소프트웨어는 낮은 결합도를 가진다.
결합도가 낮은 소프트웨어의 특징
- OCP를 잘 지킨 클래스
- 다형성을 잘 활용한 클래스
결합도의 단계
표의 아래로 내려갈수록 강한 결합을 의미한다.
| 종류 | 내용 |
|---|---|
| 자료 결합도 | 모듈간의 인터페이스로 전달되는 데이터를 통해서만 상호작용이 발생하는 경우 |
| 스탬프 결합도 | 모듈간의 인터페이스로 객체, 컨테이너 등이 전달되는 경우 |
| 제어 결합도 | 모듈이 다른 모듈의 내부 논리 흐름을 제어하는 요소를 전달하는 경우 |
| 외부 결합도 | 모듈이 다른 모듈의 데이터를 참조하는 경우 |
| 공통 결합도 | 여러 개의 모듈이 하나의 공통 데이터를 사용하는 경우 |
| 내용 결합도 | 모듈 내부의 변수나 기능을 다른 모듈에서 사용하는 경우 |
응집도(Cohesion)
응집도는 한 모듈 내의 구성 요소 간의 밀접한 정도를 의미한다.
한 모듈이 하나의 기능만을 가지고 있는 것은 응집도가 높다.
하지만 한 모듈이 여러 기능을 가지고 있는 것은 응집도가 낮다.
응집도가 높은 모듈은 한 가지 기능을 구현하기 위해 필요한 데이터와 함수들만을 가지고 있고 협력한다.
반대로 응집도가 낮은 모듈은 모듈 내부에 서로 관련 없는 함수나 데이터들이 존재한다.
응집도가 높은 모듈은 기능을 수정할 때 관련 내용이 하나의 모듈에 모여 있어서 코드를 이해하기 쉽다.
뿐만 아니라 수정을 하더라도 다른 모듈에겐 영향을 주지 않아서 유지보수에 유리하다.
응집도의 예시
실생활에서 높은 응집도를 가지고 있는 예시를 찾아보면 가게의 포스기를 예로 들 수 있다.
포스기는 물건을 계산하고 결제를 처리하거나 영수증을 출력하는 일만 한다.
포스기로 재고 관리를 한다거나 가게 청소를 하는 것은 상식적으로 말이 안된다.
응집도가 높은 클래스의 특징
- SRP를 잘 지킨 클래스
- 다른 클래스와 잘 협력하는 클래스
응집도 단계
표의 아래로 내려갈수록 낮은 응집도를 의미한다.
| 종류 | 내용 |
|---|---|
| 기능적 응집도 | 모듈 내부의 모든 기능이 단일 목적을 위해 수행되는 경우 |
| 순차적 응집도 | 모듈 내의 함수에서 나온 출력 값을 다른 함수에서 사용하는 경우 |
| 교환적 응집도 | 동일한 입력과 출력을 사용하여 다른 기능을 수행하는 함수가 모여있는 경우 |
| 절차적 응집도 | 모듈이 다수 관련 기능을 가질 때 모듈 안의 구성 요소가 그 기능을 순차적으로 수행할 경우 |
| 시간적 응집도 | 각 기능 요소들이 순서에 상관없이 특정 시점에 반드시 수행되는 경우 |
| 논리적 응집도 | 유사한 성격을 갖거나 특정 형태로 분류되는 처리 요소들이 한 모듈에서 처리되는 경우 |
| 우연적 응집도 | 모듈 내부의 각 구성 요소들이 서로 관련없는 요소로만 구성된 경우 |
정리
이론적으로는 높은 응집도를 가지고 있고, 낮은 결합도를 가지고 있는 모듈이 가장 좋다.
하지만 이론일 뿐이고 항상 적용되는 말은 아니다.
상황과 필요에 따라 알맞게 적당한 선에서 타협을 하는 것도 중요하다.

