모듈화: 결합도와 응집도
쉽게 말하면
프로그램을 기능 단위 조각(모듈)으로 나눌 때 좋은 기준이 두 가지 있어요. 결합도는 모듈끼리 얼마나 얽혀 있는지예요. 낮을수록 하나를 고쳐도 다른 데가 덜 망가져요. 응집도는 한 모듈 안의 일들이 얼마나 한 목적에 모여 있는지예요. 높을수록 좋아요. 그래서 정답은 늘 '결합도는 낮게, 응집도는 높게'예요. 단계 이름 순서를 외워 두면 문제가 바로 풀려요.
시험용 정의
모듈화는 시스템을 기능 단위의 모듈로 나누는 것이다. 결합도(Coupling)는 모듈 사이의 의존 정도로, 약한 것부터 자료(Data) → 스탬프(Stamp) → 제어(Control) → 외부(External) → 공통(Common) → 내용(Content) 결합도다. 응집도(Cohesion)는 모듈 안 구성 요소들이 서로 관련된 정도로, 강한 것부터 기능(Functional) → 순차(Sequential) → 교환(Communication) → 절차(Procedural) → 시간(Temporal) → 논리(Logical) → 우연(Coincidental) 응집도다. 좋은 설계는 결합도는 낮고 응집도는 높다. 모듈을 부르는 상위 모듈 수를 팬인, 부르는 하위 모듈 수를 팬아웃이라 한다.
비유로 이해하기
팀 프로젝트로 생각하자. 결합도는 팀끼리 얽힌 정도다. 결과물만 주고받으면(자료) 좋지만, 남의 팀 서랍을 마음대로 열면(내용) 최악이다. 응집도는 한 팀이 한 가지 목표에 집중하는 정도다. '발표 자료 팀'은 좋고, 우연히 남은 사람끼리 모인 '기타 팀'은 나쁘다.
자세히
먼저 알아 둘 말
| 말 | 뜻 |
|---|---|
| 모듈 | 독립적으로 컴파일·수정할 수 있는 프로그램 조각 |
| 인터페이스 | 모듈끼리 주고받는 창구 (매개변수, 반환값) |
| 제어 신호 | 상대 모듈의 동작을 정하는 플래그 같은 값 |
| 전역 변수 | 모든 모듈이 함께 쓰는 변수 |
| 팬인 / 팬아웃 | 나를 부르는 모듈 수 / 내가 부르는 모듈 수 |
결합도 (약함 → 강함)
| 단계 | 뜻 |
|---|---|
| 1. 자료 | 필요한 값(자료 요소)만 매개변수로 주고받는다 |
| 2. 스탬프 | 배열·레코드 같은 자료 구조를 통째로 넘긴다 (일부만 써도) |
| 3. 제어 | 다른 모듈의 처리 흐름을 정하는 제어 신호(플래그)를 넘긴다. 권리 전도 현상 |
| 4. 외부 | 모듈이 외부에서 선언한 변수나 외부 장치·형식을 참조한다 |
| 5. 공통 | 여러 모듈이 공통(전역) 데이터 영역을 함께 쓴다 |
| 6. 내용 | 한 모듈이 다른 모듈의 내부 기능이나 자료를 직접 참조·수정한다 |
응집도 (강함 → 약함)
| 단계 | 뜻 |
|---|---|
| 1. 기능 | 모든 요소가 단 하나의 기능을 위해 존재 |
| 2. 순차 | 한 요소의 출력이 다음 요소의 입력으로 쓰인다 |
| 3. 교환(통신) | 같은 입력·출력 자료를 쓰는 서로 다른 기능이 모여 있다 |
| 4. 절차 | 정해진 순서대로 실행되는 여러 기능이 모여 있다 |
| 5. 시간 | 같은 시기(초기화, 종료 처리)에 실행되는 기능이 모여 있다 |
| 6. 논리 | 비슷한 성격의 처리들이 한 모듈에서 선택되어 실행된다 |
| 7. 우연 | 서로 관련 없는 요소들이 모여 있다 |
외우는 요령
- 결합도: 자·스·제·외·공·내 (약 → 강)
- 응집도: 기·순·교·절·시·논·우 (강 → 약)
- 시스템 구조에서 팬인은 높고 팬아웃은 낮게 하는 것이 좋다 (재사용은 늘리고 복잡도는 줄이기)
기출에서 더 나온 것
| 말 | 뜻 |
|---|---|
| 모듈의 특징 | 독립된 기능 단위, 독립 컴파일 가능, 유일한 이름, 다른 모듈에서 호출할 수 있다 |
| 모듈 수와 비용 | 모듈을 너무 잘게 나누면 모듈 사이 인터페이스 비용이 커진다 |
| 공통 모듈 명세 원칙 | 정확성(실제 필요한 기능), 명확성(한 가지로 해석), 완전성(빠짐없이), 일관성(서로 충돌 없이), 추적성(출처 확인) |
| 재사용 범위에 따른 분류 | 함수와 객체 재사용, 컴포넌트 재사용, 애플리케이션 재사용 |
시험에 이렇게 나와요
- 결합도 약 → 강 → 자료 < 스탬프 < 제어 < 외부 < 공통 < 내용
- 응집도 강 → 약 → 기능 > 순차 > 교환 > 절차 > 시간 > 논리 > 우연
- 좋은 설계 → 결합도는 낮게, 응집도는 높게. 모듈 크기는 적당히, 기능은 예측 가능하게
- 설명 보고 고르기 → 제어 신호로 다른 모듈 지시(제어), 같은 시간대 실행(시간), 관계없는 요소 모음(우연)
- 팬인·팬아웃 세기 → 나를 부르는 모듈 수 / 내가 부르는 모듈 수
- 공통 모듈 명세 원칙 → 정확성·명확성·완전성·일관성·추적성
확인 문제
Q1. 다음 중 결합도가 가장 낮은(가장 좋은) 것은?
- 제어 결합도
- 내용 결합도
- 자료 결합도
- 공통 결합도
정답 보기
3번 자료 결합도
결합도는 자료 < 스탬프 < 제어 < 외부 < 공통 < 내용 순으로 강해진다. 값(자료)만 주고받는 자료 결합도가 가장 약하고 좋다.
Q2. 한 모듈이 다른 모듈의 처리 순서를 결정하는 플래그를 넘겨주는 결합도는?
- 자료 결합도
- 제어 결합도
- 스탬프 결합도
- 공통 결합도
정답 보기
2번 제어 결합도
제어 신호를 넘기는 제어 결합도. 하위 모듈이 상위 모듈에 지시하는 권리 전도가 생길 수 있다.
Q3. 응집도가 높은 것부터 순서대로 나열한 것은?
- 우연 → 논리 → 시간 → 절차
- 기능 → 교환 → 순차 → 시간
- 기능 → 순차 → 교환 → 절차
- 순차 → 기능 → 절차 → 교환
정답 보기
3번 기능 → 순차 → 교환 → 절차
기능 → 순차 → 교환 → 절차 → 시간 → 논리 → 우연 순이다. '기순교절시논우'로 외운다.
Q4. 모듈 안의 한 활동에서 나온 출력이 다음 활동의 입력이 되는 응집도는?
- 기능적 응집도
- 시간적 응집도
- 교환적 응집도
- 순차적 응집도
정답 보기
4번 순차적 응집도
출력 → 입력으로 이어지는 순차.
Q5. 배열이나 레코드 같은 자료 구조를 통째로 넘기는 결합도는?
- 스탬프 결합도
- 내용 결합도
- 자료 결합도
- 외부 결합도
정답 보기
1번 스탬프 결합도
필요한 일부만이 아니라 구조 전체를 넘긴다.
헷갈리기 쉬운 O·X
좋은 모듈 설계는 결합도를 높이고 응집도를 낮추는 것이다.
정답 보기
X 결합도는 낮게, 응집도는 높게.
공통 결합도는 전역 변수 같은 공유 데이터 영역을 여러 모듈이 함께 쓸 때 생긴다.
정답 보기
O
초기화처럼 같은 시점에 실행되는 기능을 모은 것은 논리적 응집도다.
정답 보기
X 시간적 응집도다.