모듈 결합도와 응집도
목차 17
4과목 첫 강. 1과목 5강에서 설계 관점으로 본 결합도·응집도를, 이번엔 실제 코드로 눈에 보이게 다시 잡는다. 4과목은 코드를 읽고 유형을 판별하는 과목이라, 같은 두 지표를 코드 스니펫으로 구별하는 훈련이 핵심. 매 회차 1순위로 빠지지 않는 빈출 영역이다.
핵심 암기 4종: 결합도 6단계 내공외제스자(강→약) · 응집도 7단계 우논시절통순기(약→강) · 황금률 결↓응↑ · In은 재사용·Out은 복잡도
모듈 기초
모듈과 모듈화 ·개념 정의·
[정의] 모듈(Module) = 하나의 기능을 수행하는 독립적·재사용 가능한 단위. 4과목 관점에서는 함수·클래스·패키지가 곧 코드 모듈이다. 모듈화(Modularization) = 큰 프로그램을 작고 독립적인 모듈로 나누는 설계 활동.
[분류] 모듈화의 목적
| 목적 | 한 줄 |
|---|---|
| 유지보수성↑ | 문제 생긴 모듈만 고치면 됨 |
| 재사용성↑ | 한 번 만든 모듈을 여러 곳에서 다시 씀 |
| 복잡도↓ | 거대한 시스템을 작게 쪼개 파악 쉬움 |
| 협업·테스트 용이 | 모듈을 나눠 동시 개발·단위 검증 |
🔑 암기 좋은 모듈 = 단일 책임 + 독립성 + 재사용성. 그 품질을 재는 두 잣대가 결합도(모듈 간)·응집도(모듈 내부). 🎯 빈출 '모듈화 목적이 아닌 것' 소거형. 간헐. 💡 보충 레고 블록 한 조각 — 독립적이고 교체 가능하며, 조합으로 더 큰 구조를 만든다.
결합도 (Coupling)
결합도 6단계 ·결합도·이 강의 절대 핵심·
[정의] 결합도(Coupling) = 모듈 사이의 상호 의존도. 한쪽이 바뀌면 다른 쪽이 받는 영향의 크기. 낮을수록 좋다 — 변경 영향 최소·재사용·테스트 용이.
[분류] 강한 것 → 약한 것 (위험 → 이상적)
| 강도 | 단계 | 영문 | 식별 키워드 |
|---|---|---|---|
| 강 | ① 내용 | Content | 다른 모듈 내부 변수·코드 직접 참조/수정 |
| ② 공통 | Common | 전역 변수를 여러 모듈이 공유 | |
| ③ 외부 | External | 외부 장치·파일 포맷·통신 프로토콜에 의존 | |
| ④ 제어 | Control | 제어 플래그(동작 방식 신호) 전달 | |
| ⑤ 스탬프 | Stamp | 자료구조 통째(레코드·객체) 전달, 일부만 사용 | |
| 약 | ⑥ 자료 | Data | 단순 파라미터(값) 만 전달 — 가장 이상적 |
🔑 암기 내공외제스자 (강→약) — "내가 공부 외워서 제일 스마트한 자" ⚠️ 함정 양 끝 — 가장 강함(최악) = 내용, 가장 약함(이상적) = 자료. '결합도가 높을수록 좋다'는 한 글자 함정(높을수록 좋은 건 응집도). 🎯 빈출 강→약(또는 약→강) 순서 나열형 + 양 끝 묻기. 매 회차 1순위. 💡 보충 아파트 벽 — 얇으면(결합도↑) 옆집 소음이 다 넘어온다. 독립 건물(결합도↓)이면 옆 건물을 철거해도 영향 없음.
코드로 보는 결합도 ·결합도·코드 판별·
[흐름] 같은 두 모듈도 어떻게 주고받느냐에 따라 결합도가 달라진다. 좋은 쪽(자료)부터 나쁜 쪽(내용)까지 코드로 본다.
# ⑥ 자료 결합도 (가장 좋음) — 단순 값만 주고받음
def calc_discount(price, rate): # int·float 값만 매개변수로 전달
return int(price * (1 - rate))
print(calc_discount(50000, 0.1)) # 45000
# ④ 제어 결합도 — 호출자가 '플래그'로 상대 내부 동작을 지시
def pay(amount, method): # method = 제어 플래그
if method == "card":
... # 플래그 값에 따라 내부 분기
elif method == "bank":
... # 호출자가 상대 모듈 내부 동작에 관여
/* ⑤ 공통 결합도 — 전역 변수를 여러 모듈이 공유 */
int g_user_id; // 전역 변수 (모든 모듈이 접근 가능)
void login() { g_user_id = 1001; } // 한 모듈이 전역 변수에 씀
void dashboard() { printf("%d", g_user_id); } // 다른 모듈이 그 값을 읽음
# ① 내용 결합도 (최악) — 다른 모듈의 내부에 직접 침범
def tamper(order):
order._total = 0 # 상대 모듈의 private 내부 변수를 직접 수정
# 내부 구조가 바뀌면 즉시 깨짐
🔑 암기 단순 값=자료 · 플래그=제어 · 전역 변수=공통 · 내부 직접 참조=내용. 코드만 보고도 단계가 나온다.
🎯 빈출 4과목은 코드를 주고 결합도 유형을 묻는 형식이 늘어난다. '전역 변수가 보이면 공통, 플래그가 보이면 제어'가 1초 컷.
💡 보충 스탬프 결합도는 def send_invoice(order)처럼 객체 전체를 받지만 order.price 하나만 쓰는 경우 — 자료보다 한 단계 강하다.
결합도 보기 단서 즉답 매칭 ·시험 즉답·
[분류]
| 단서 키워드 | 정답 |
|---|---|
| '내부 변수 직접 참조·수정' | 내용 결합도 |
| '전역 변수'·'공통 데이터 영역' | 공통 결합도 |
| '외부 포맷·프로토콜·장치' 공유 | 외부 결합도 |
| '플래그·스위치'·'동작 방식 지시' | 제어 결합도 |
| '자료구조·레코드 통째' 전달 | 스탬프 결합도 |
| '단순 파라미터'·'값만 전달' | 자료 결합도 |
🎯 빈출 설명→단계 매칭. 위 세 줄(전역=공통·플래그=제어·단순=자료)만 잡아도 결합도 문제 절반. ⚠️ 함정 보기에 '우연적·기능적'이 섞이면 그건 응집도 단계. 결합도/응집도 이름 섞기가 단골.
응집도 (Cohesion)
응집도 7단계 ·응집도·이 강의 절대 핵심·
[정의] 응집도(Cohesion) = 한 모듈 내부 요소들이 하나의 목적을 위해 얼마나 서로 관련·결속돼 있는지. 높을수록 좋다 — 결합도와 정반대 방향.
[분류] 약한 것 → 강한 것 (흩어짐 → 이상적)
| 강도 | 단계 | 영문 | 식별 키워드 |
|---|---|---|---|
| 약 | ① 우연적 | Coincidental | 아무 관련 없는 요소가 우연히 모임 |
| ② 논리적 | Logical | 비슷한 종류·카테고리로만 묶음(기능은 다름) | |
| ③ 시간적 | Temporal | 같은 시간대에 실행(초기화·종료) | |
| ④ 절차적 | Procedural | 정해진 순서대로 실행(데이터는 무관) | |
| ⑤ 통신적 | Communicational | 같은 입·출력 데이터 사용 | |
| ⑥ 순차적 | Sequential | 한 요소의 출력이 다음 요소의 입력 | |
| 강 | ⑦ 기능적 | Functional | 단일 기능 수행 — 가장 이상적 |
🔑 암기 우논시절통순기 (약→강) — "우리는 논리적인 시대의 절친 — 통하는 순간 기적이 와요" ⚠️ 함정 결합도(강→약)와 방향이 정반대. 양 끝 — 가장 약함(최악) = 우연적, 가장 강함(이상적) = 기능적. 🎯 빈출 약→강 순서 나열형 + 양 끝 묻기. 매 회차 1순위. 💡 보충 필통(높음: 다 필기도구) ↔ 잡동사니 서랍(낮음: 공통점 없음).
코드로 보는 응집도 ·응집도·코드 판별·
[흐름] 헷갈리기 쉬운 양 끝(우연적·기능적)과 단골 함정(순차적)을 코드로 본다.
# ① 우연적 응집도 (최악) — 무관한 일들이 한 함수에 우연히 모임
def do_everything():
send_email() # 이메일 발송
calc_tax() # 세금 계산
update_db() # DB 갱신 ← 서로 아무 관련 없음
# ⑥ 순차적 응집도 — 앞 요소의 출력이 뒤 요소의 입력 (파이프라인)
def normalize(text):
s1 = text.strip() # 출력 →
s2 = s1.lower() # → 다음 입력 →
s3 = s2.replace(" ", "_") # → 다음 입력
return s3
print(normalize(" Hello World ")) # hello_world
# ⑦ 기능적 응집도 (가장 좋음) — 단 하나의 기능만 수행
def compound_interest(principal, rate, years): # 오직 복리 계산 한 가지
return round(principal * (1 + rate) ** years, 2)
print(compound_interest(1000000, 0.05, 3)) # 1157625.0
🔑 암기 무관함=우연적 · 출력→입력=순차적 · 단일 기능=기능적. ⚠️ 함정 절차적 vs 순차적 — 순서만 같으면 절차적(데이터 무관), 앞 출력이 뒤 재료가 되면 순차적. 통신적 vs 순차적 — 같은 데이터를 '함께' 쓰면 통신적, '흘러가면' 순차적. 🎯 빈출 코드를 주고 응집도 유형을 묻거나, 파이프라인 설명을 순차적으로 매칭하는 유형. 거의 매회.
응집도 보기 단서 즉답 매칭 ·시험 즉답·
[분류]
| 단서 키워드 | 정답 |
|---|---|
| '아무 관련 없는'·'우연히' | 우연적 |
| '비슷한 종류'·'유사한 작업'(분류만 같음) | 논리적 |
| '같은 시간'·'초기화·종료' | 시간적 |
| '정해진 순서·절차'(데이터 무관) | 절차적 |
| '같은 입·출력 데이터' 공유 | 통신적 |
| '출력→입력'·'파이프라인' | 순차적 |
| '단일 기능'·'한 가지 일' | 기능적 |
🎯 빈출 설명→단계 매칭. 짝짓기 오류형(우연적↔기능적 바꿔치기)도 단골.
모듈 설계 황금률
결합도↓ · 응집도↑ ·오늘의 한 줄·
[비교]
| 항목 | 결합도(Coupling) | 응집도(Cohesion) |
|---|---|---|
| 측정 대상 | 모듈 사이의 의존도 | 모듈 내부의 결속력 |
| 좋은 방향 | 낮게(↓) | 높게(↑) |
| 단계 수 | 6단계 | 7단계 |
| 순서 두문자 | 내공외제스자(강→약) | 우논시절통순기(약→강) |
| 가장 이상적 | 자료 결합도 | 기능적 응집도 |
| 가장 나쁨 | 내용 결합도 | 우연적 응집도 |
🔑 암기 결↓응↑ — 매 회차 빠지지 않는 1순위 명제. 🎯 빈출 '낮게/높게' 방향 뒤집기 부정형. 시험장에서 헷갈리면 이 한 줄로 복귀. 💡 보충 MSA(Microservice Architecture)가 결↓응↑의 실무 구현 — 도메인별 모듈 분리(응집도↑) + 느슨한 통신(결합도↓). 한 도메인에 장애가 나도 다른 도메인은 정상 동작한다.
Fan-In / Fan-Out ·호출 관계 측정·
[비교] 모듈 간 호출 관계로 시스템 복잡도를 재는 척도. 화살표 방향이 정반대다.
| 구분 | 정의 | 방향 | 좋은 방향 |
|---|---|---|---|
| Fan-In | 그 모듈을 호출하는 상위 모듈 수 | 들어오는 화살표 | 높을수록 좋음(재사용성↑) |
| Fan-Out | 그 모듈이 호출하는 하위 모듈 수 | 나가는 화살표 | 낮을수록 좋음(7 이하 권장) |
[A] [B] [C] ← 상위 3개가 M 호출 → Fan-In = 3
↘ ↓ ↙
[M]
↙ ↓ ↘
[D] [E] [F] ← M이 하위 3개 호출 → Fan-Out = 3
🔑 암기 In은 재사용·Out은 복잡도. Fan-In = 들어오는(Incoming) 화살표, Fan-Out = 나가는(Outgoing) 화살표. 방향만 세면 정답. ⚠️ 함정 '바람직한 설계 = Fan-Out을 높인다'는 오답 — Fan-Out은 낮춰야 한다. 🎯 빈출 구조도 주고 화살표 세는 계산형. 거의 매회.
공통 모듈 명세 5원칙 — 정명완일추 ·명세·
[정의] 여러 시스템이 공통으로 쓰는 재사용 모듈(인증·결제·로깅 등)을 명세할 때 지켜야 할 5원칙. 5강에서 본격 다뤘고, 여기선 한 줄 회수.
| 원칙 | 의미 |
|---|---|
| 정확성(Correctness) | 정말 필요한 모듈인지 정확히 기술 |
| 명확성(Clarity) | 누가 봐도 한 가지 의미로 해석 |
| 완전성(Completeness) | 필요한 모든 사항을 빠짐없이 기술 |
| 일관성(Consistency) | 모듈끼리 충돌·모순 없음 |
| 추적성(Traceability) | 요구사항·근거를 거슬러 추적 가능 |
🔑 암기 정명완일추 (정확·명확·완전·일관·추적) ⚠️ 함정 7강 SOLID 5원칙과 다른 영역 — 이름만 비슷하다. 보기에 SOLID 용어가 섞이면 오답. 🎯 빈출 빈칸형·소거형. 간헐.
나쁜 설계를 좋게 — 모듈 분할 리팩토링 ·실무·심화·
[흐름] 플래그로 여러 종류를 한 함수에 욱여넣으면 제어 결합도 + 논리적 응집도가 동시에 생긴다. 종류별로 함수를 쪼개면 자료 결합도 + 기능적 응집도로 바뀐다.
# Before — 제어 결합도 + 논리적 응집도 (플래그로 분기)
def handle_input(kind, data): # kind = 제어 플래그
if kind == "keyboard":
...
elif kind == "mouse":
... # '입력'이라는 분류만 같음 = 논리적 응집도
# After — 모듈 분리 (자료 결합도 + 기능적 응집도)
def handle_keyboard(data): # 각 함수가 단일 기능
...
def handle_mouse(data): # 호출 측은 필요한 함수만 직접 호출
... # 플래그 제거 → 결합도↓ · 응집도↑
🔑 암기 플래그 분기 한 덩어리 = 결합도↑·응집도↓의 전형. 쪼개면 결↓·응↑. 💡 보충 실무 리팩토링의 절반은 "큰 함수를 단일 기능 함수로 쪼개기" — 그게 곧 응집도를 올리고 결합도를 낮추는 작업이다. 🎯 빈출 이 변환 자체를 묻진 않지만, '바람직한 모듈 설계' 부정형의 배경 원리. 거의 매회의 토대.
기출 다지기
[기출 1 출제] 결합도(Coupling)를 약한 것부터 강한 순서로 올바르게 나열한 것은? (순서 나열형)
- ① 자료 → 스탬프 → 제어 → 외부 → 공통 → 내용
- ② 자료 → 스탬프 → 공통 → 제어 → 외부 → 내용
- ③ 내용 → 공통 → 외부 → 제어 → 스탬프 → 자료
- ④ 자료 → 제어 → 스탬프 → 외부 → 공통 → 내용
정답 및 해설 보기
정답 ①
| 선지 | 판정 | 근거 |
|---|---|---|
| ① | 정답 | 내공외제스자를 역순으로 = 자스제외공내(약→강) |
| ② | 오답 | 공통·제어·외부 순서 뒤집힘 |
| ③ | 오답 | 강→약 역순 |
| ④ | 오답 | 제어·스탬프 순서 뒤집힘(스탬프가 제어보다 약함) |
🔑 내공외제스자(강→약). 약→강은 역순 자스제외공내. 양 끝 — 자료(가장 약)↔내용(가장 강).
[기출 2 출제] 다음 설명에 해당하는 모듈의 결합도(Coupling) 유형은? (설명→용어)
한 모듈이 다른 모듈의 내부 기능 및 그 내부 자료를 직접 참조하거나 수정하는 경우.
- ① 자료 결합도
- ② 제어 결합도
- ③ 공통 결합도
- ④ 내용 결합도
정답 및 해설 보기
정답 ④
| 선지 | 핵심 키워드 |
|---|---|
| ① 자료 | 단순 값만 파라미터로 전달 |
| ② 제어 | 제어 플래그·스위치 전달 |
| ③ 공통 | 전역 변수 공유 |
| ④ 내용 | 내부를 직접 참조·수정 ← 정답 |
🔑 "내부를 직접" 키워드가 나오면 100% 내용 결합도(가장 강·최악).
[기출 3 출제] 다음 코드에서 두 함수가 묶인 결합도(Coupling) 유형은? (코드 판별형)
int total; // 전역 변수
void add(int x) { total += x; } // total에 더함
void show() { printf("%d", total); } // total을 읽어 출력
- ① 자료 결합도
- ② 스탬프 결합도
- ③ 공통 결합도
- ④ 내용 결합도
정답 및 해설 보기
정답 ③
add와 show가 매개변수가 아니라 전역 변수 total을 공유한다. 전역 변수 공유 = 공통(Common) 결합도.
| 선지 | 판정 | 근거 |
|---|---|---|
| ① 자료 | 오답 | 단순 값을 매개변수로 주고받을 때 |
| ② 스탬프 | 오답 | 자료구조·객체 통째 전달일 때 |
| ③ 공통 | 정답 | 전역 변수를 여러 모듈이 공유 |
| ④ 내용 | 오답 | 상대 함수의 내부 코드·변수에 직접 침범할 때 |
🔑 코드에 전역 변수(함수 밖 선언)가 보이고 여러 함수가 그걸 쓰면 → 공통 결합도.
[기출 4 출제] 다음 중 모듈의 응집도(Cohesion)가 가장 높은(좋은) 유형은? (양 끝 묻기)
- ① 우연적 응집도
- ② 시간적 응집도
- ③ 통신적 응집도
- ④ 기능적 응집도
정답 및 해설 보기
정답 ④
| 선지 | 순위(7=가장 높음) |
|---|---|
| ① 우연적 | 1단계(최하·최악) |
| ② 시간적 | 3단계 |
| ③ 통신적 | 5단계 |
| ④ 기능적 | 7단계(최고) ← 정답 |
🔑 우논시절통순기의 끝(기능적)이 가장 높은 응집도. "기" = 끝 = 최고.
[기출 5 출제] 다음 설명에 해당하는 응집도(Cohesion) 유형은? (설명→용어)
모듈 내 구성 요소들이 하나의 작업에 기여하지 않고, 특정 시점에 처리되어야 하는 기능을 모아놓은 형태로, 시스템 초기화나 종료 시 실행해야 하는 기능들을 하나의 모듈에 구성한 경우.
- ① 논리적 응집도
- ② 시간적 응집도
- ③ 절차적 응집도
- ④ 통신적 응집도
정답 및 해설 보기
정답 ②
| 선지 | 핵심 키워드 |
|---|---|
| ① 논리적 | 논리적 분류만 같고 기능은 다름 |
| ② 시간적 | 같은 시점(초기화·종료)에 실행 ← 정답 |
| ③ 절차적 | 실행 순서(절차)로 묶임(데이터 무관) |
| ④ 통신적 | 동일한 데이터 공유 |
🔑 "초기화", "종료", "특정 시점" 키워드 → 무조건 시간적 응집도.
[기출 6 출제] 다음 함수의 응집도(Cohesion) 유형은? (코드 판별형)
def run(n):
a = n * 2 # 출력이
b = a + 10 # 다음 입력이 되고
c = b ** 2 # 또 다음 입력
return c
- ① 우연적 응집도
- ② 절차적 응집도
- ③ 순차적 응집도
- ④ 기능적 응집도
정답 및 해설 보기
정답 ③
각 줄의 출력이 바로 다음 줄의 입력이 되는 파이프라인(a → b → c). 출력→입력 연쇄 = 순차적(Sequential) 응집도. (run(3) 은 6 → 16 → 256.)
| 선지 | 판정 | 근거 |
|---|---|---|
| ① 우연적 | 오답 | 요소들이 무관할 때 |
| ② 절차적 | 오답 | 순서만 있고 데이터 흐름이 없을 때 |
| ③ 순차적 | 정답 | 앞의 출력 = 뒤의 입력 |
| ④ 기능적 | 오답 | 단일 기능에 모든 요소가 기여할 때(한 단계 더 강함) |
🔑 절차적은 '순서만', 순차적은 '데이터가 흐름'. 변수가 줄줄이 다음 줄로 넘어가면 순차적.
[기출 7 출제] 다음 중 Fan-In과 Fan-Out에 관한 설명으로 옳은 것은? (개념·방향)
- ① Fan-In은 어떤 모듈을 호출하는 모듈의 수이며, Fan-In이 높으면 재사용성이 낮다.
- ② Fan-Out은 어떤 모듈을 호출하는 상위 모듈의 수를 의미한다.
- ③ Fan-In과 Fan-Out은 정의가 서로 같으며 방향만 반대다.
- ④ Fan-In이 높으면 재사용성이 높다는 의미이며, Fan-Out은 낮을수록 좋다.
정답 및 해설 보기
정답 ④
| 개념 | 정의 | 좋은 방향 |
|---|---|---|
| Fan-In | 해당 모듈을 호출하는 상위 모듈 수 | 높을수록 좋음(재사용성↑) |
| Fan-Out | 해당 모듈이 호출하는 하위 모듈 수 | 낮을수록 좋음(복잡도↓) |
오답 분석:
- ① Fan-In 정의는 맞지만 "재사용성이 낮다"가 반대
- ② Fan-Out = "호출하는 하위 모듈 수" — 상위가 아니라 하위
- ③ 둘은 방향만 반대가 아니라 세는 대상(상위 호출자 vs 하위 피호출자)이 다름
🔑 Fan-In = Incoming(불려옴·재사용), Fan-Out = Outgoing(불러냄·복잡도).
한 장 요약
| 지표 | 암기 | 방향 | 양 끝 (나쁨 ↔ 이상적) |
|---|---|---|---|
| 결합도 6단계 | 내공외제스자 | 강→약, 낮을수록 좋음(↓) | 내용 ↔ 자료 |
| 응집도 7단계 | 우논시절통순기 | 약→강, 높을수록 좋음(↑) | 우연적 ↔ 기능적 |
| 황금률 | 결↓응↑ | 매 회차 1순위 명제 | — |
| Fan-In/Out | In은 재사용·Out은 복잡도 | In↑ 좋음 / Out↑ 나쁨(7 이하) | — |
| 공통 모듈 명세 | 정명완일추 | 정확·명확·완전·일관·추적 | — |
| 코드 단서 | 즉답 |
|---|---|
| 단순 값만 매개변수 | 자료 결합도 |
| 플래그로 내부 분기 | 제어 결합도 |
| 전역 변수 공유 | 공통 결합도 |
| 상대 내부 직접 수정 | 내용 결합도 |
| 무관한 일들이 한 함수에 | 우연적 응집도 |
| 출력이 다음 줄 입력으로 | 순차적 응집도 |
| 단 하나의 기능만 | 기능적 응집도 |
🎯 합격 한 끗: 결↓ · 응↑ · 내공외제스자 · 우논시절통순기 네 줄과 양 끝 네 단어(내용↔자료 · 우연적↔기능적). 4과목에선 여기에 코드를 보고 유형을 집는 한 단계가 더 붙는다 — 전역 변수면 공통, 플래그면 제어, 출력→입력이면 순차적.
