문서 읽는 데 30분 · 32강 · 4과목 · 프로그래밍 언어 활용

모듈 결합도와 응집도

목차 17
전체 59강 중 32강 · 4과목 · 프로그래밍 언어 활용

4과목 첫 강. 1과목 5강에서 설계 관점으로 본 결합도·응집도를, 이번엔 실제 코드로 눈에 보이게 다시 잡는다. 4과목은 코드를 읽고 유형을 판별하는 과목이라, 같은 두 지표를 코드 스니펫으로 구별하는 훈련이 핵심. 매 회차 1순위로 빠지지 않는 빈출 영역이다.

핵심 암기 4종: 결합도 6단계 내공외제스자(강→약) · 응집도 7단계 우논시절통순기(약→강) · 황금률 결↓응↑ · In은 재사용·Out은 복잡도


모듈 기초

모듈과 모듈화 ·개념 정의·

[정의] 모듈(Module) = 하나의 기능을 수행하는 독립적·재사용 가능한 단위. 4과목 관점에서는 함수·클래스·패키지가 곧 코드 모듈이다. 모듈화(Modularization) = 큰 프로그램을 작고 독립적인 모듈로 나누는 설계 활동.

[분류] 모듈화의 목적

목적 한 줄
유지보수성↑ 문제 생긴 모듈만 고치면 됨
재사용성↑ 한 번 만든 모듈을 여러 곳에서 다시 씀
복잡도↓ 거대한 시스템을 작게 쪼개 파악 쉬움
협업·테스트 용이 모듈을 나눠 동시 개발·단위 검증

🔑 암기 좋은 모듈 = 단일 책임 + 독립성 + 재사용성. 그 품질을 재는 두 잣대가 결합도(모듈 간)·응집도(모듈 내부). 🎯 빈출 '모듈화 목적이 아닌 것' 소거형. 간헐. 💡 보충 레고 블록 한 조각 — 독립적이고 교체 가능하며, 조합으로 더 큰 구조를 만든다.


결합도 (Coupling)

결합도 6단계 ·결합도·이 강의 절대 핵심·

[정의] 결합도(Coupling) = 모듈 사이의 상호 의존도. 한쪽이 바뀌면 다른 쪽이 받는 영향의 크기. 낮을수록 좋다 — 변경 영향 최소·재사용·테스트 용이.

[분류] 강한 것 → 약한 것 (위험 → 이상적)

강도 단계 영문 식별 키워드
① 내용 Content 다른 모듈 내부 변수·코드 직접 참조/수정
② 공통 Common 전역 변수를 여러 모듈이 공유
③ 외부 External 외부 장치·파일 포맷·통신 프로토콜에 의존
④ 제어 Control 제어 플래그(동작 방식 신호) 전달
⑤ 스탬프 Stamp 자료구조 통째(레코드·객체) 전달, 일부만 사용
⑥ 자료 Data 단순 파라미터(값) 만 전달 — 가장 이상적

🔑 암기 내공외제스자 (강→약) — "내가 공부 외워서 제일 스마트한 자" ⚠️ 함정 양 끝 — 가장 강함(최악) = 내용, 가장 약함(이상적) = 자료. '결합도가 높을수록 좋다'는 한 글자 함정(높을수록 좋은 건 응집도). 🎯 빈출 강→약(또는 약→강) 순서 나열형 + 양 끝 묻기. 매 회차 1순위. 💡 보충 아파트 벽 — 얇으면(결합도↑) 옆집 소음이 다 넘어온다. 독립 건물(결합도↓)이면 옆 건물을 철거해도 영향 없음.

코드로 보는 결합도 ·결합도·코드 판별·

[흐름] 같은 두 모듈도 어떻게 주고받느냐에 따라 결합도가 달라진다. 좋은 쪽(자료)부터 나쁜 쪽(내용)까지 코드로 본다.

Python
# ⑥ 자료 결합도 (가장 좋음) — 단순 값만 주고받음
def calc_discount(price, rate):       # int·float 값만 매개변수로 전달
    return int(price * (1 - rate))

print(calc_discount(50000, 0.1))      # 45000
Python
# ④ 제어 결합도 — 호출자가 '플래그'로 상대 내부 동작을 지시
def pay(amount, method):              # method = 제어 플래그
    if method == "card":
        ...                           # 플래그 값에 따라 내부 분기
    elif method == "bank":
        ...                           # 호출자가 상대 모듈 내부 동작에 관여
c
/* ⑤ 공통 결합도 — 전역 변수를 여러 모듈이 공유 */
int g_user_id;                          // 전역 변수 (모든 모듈이 접근 가능)
void login()     { g_user_id = 1001; }  // 한 모듈이 전역 변수에 씀
void dashboard() { printf("%d", g_user_id); }  // 다른 모듈이 그 값을 읽음
Python
# ① 내용 결합도 (최악) — 다른 모듈의 내부에 직접 침범
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순위. 💡 보충 필통(높음: 다 필기도구) ↔ 잡동사니 서랍(낮음: 공통점 없음).

코드로 보는 응집도 ·응집도·코드 판별·

[흐름] 헷갈리기 쉬운 양 끝(우연적·기능적)과 단골 함정(순차적)을 코드로 본다.

Python
# ① 우연적 응집도 (최악) — 무관한 일들이 한 함수에 우연히 모임
def do_everything():
    send_email()          # 이메일 발송
    calc_tax()            # 세금 계산
    update_db()           # DB 갱신  ← 서로 아무 관련 없음
Python
# ⑥ 순차적 응집도 — 앞 요소의 출력이 뒤 요소의 입력 (파이프라인)
def normalize(text):
    s1 = text.strip()             # 출력 →
    s2 = s1.lower()               #   → 다음 입력 →
    s3 = s2.replace(" ", "_")     #       → 다음 입력
    return s3

print(normalize("  Hello World  "))   # hello_world
Python
# ⑦ 기능적 응집도 (가장 좋음) — 단 하나의 기능만 수행
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 용어가 섞이면 오답. 🎯 빈출 빈칸형·소거형. 간헐.

나쁜 설계를 좋게 — 모듈 분할 리팩토링 ·실무·심화·

[흐름] 플래그로 여러 종류를 한 함수에 욱여넣으면 제어 결합도 + 논리적 응집도가 동시에 생긴다. 종류별로 함수를 쪼개면 자료 결합도 + 기능적 응집도로 바뀐다.

Python
# Before — 제어 결합도 + 논리적 응집도 (플래그로 분기)
def handle_input(kind, data):     # kind = 제어 플래그
    if kind == "keyboard":
        ...
    elif kind == "mouse":
        ...                       # '입력'이라는 분류만 같음 = 논리적 응집도
Python
# After — 모듈 분리 (자료 결합도 + 기능적 응집도)
def handle_keyboard(data):        # 각 함수가 단일 기능
    ...
def handle_mouse(data):           # 호출 측은 필요한 함수만 직접 호출
    ...                           # 플래그 제거 → 결합도↓ · 응집도↑

🔑 암기 플래그 분기 한 덩어리 = 결합도↑·응집도↓의 전형. 쪼개면 결↓·응↑. 💡 보충 실무 리팩토링의 절반은 "큰 함수를 단일 기능 함수로 쪼개기" — 그게 곧 응집도를 올리고 결합도를 낮추는 작업이다. 🎯 빈출 이 변환 자체를 묻진 않지만, '바람직한 모듈 설계' 부정형의 배경 원리. 거의 매회의 토대.


기출 다지기

[기출 1 출제] 결합도(Coupling)를 약한 것부터 강한 순서로 올바르게 나열한 것은? (순서 나열형)

  • ① 자료 → 스탬프 → 제어 → 외부 → 공통 → 내용
  • ② 자료 → 스탬프 → 공통 → 제어 → 외부 → 내용
  • ③ 내용 → 공통 → 외부 → 제어 → 스탬프 → 자료
  • ④ 자료 → 제어 → 스탬프 → 외부 → 공통 → 내용
정답 및 해설 보기

정답 ①

선지 판정 근거
정답 내공외제스자를 역순으로 = 자스제외공내(약→강)
오답 공통·제어·외부 순서 뒤집힘
오답 강→약 역순
오답 제어·스탬프 순서 뒤집힘(스탬프가 제어보다 약함)

🔑 내공외제스자(강→약). 약→강은 역순 자스제외공내. 양 끝 — 자료(가장 약)↔내용(가장 강).

[기출 2 출제] 다음 설명에 해당하는 모듈의 결합도(Coupling) 유형은? (설명→용어)

한 모듈이 다른 모듈의 내부 기능 및 그 내부 자료를 직접 참조하거나 수정하는 경우.

  • ① 자료 결합도
  • ② 제어 결합도
  • ③ 공통 결합도
  • ④ 내용 결합도
정답 및 해설 보기

정답 ④

선지 핵심 키워드
① 자료 단순 값만 파라미터로 전달
② 제어 제어 플래그·스위치 전달
③ 공통 전역 변수 공유
내용 내부를 직접 참조·수정 ← 정답

🔑 "내부를 직접" 키워드가 나오면 100% 내용 결합도(가장 강·최악).

[기출 3 출제] 다음 코드에서 두 함수가 묶인 결합도(Coupling) 유형은? (코드 판별형)

c
int total;                      // 전역 변수
void add(int x) { total += x; }      // total에 더함
void show()     { printf("%d", total); }  // total을 읽어 출력
  • ① 자료 결합도
  • ② 스탬프 결합도
  • ③ 공통 결합도
  • ④ 내용 결합도
정답 및 해설 보기

정답 ③

addshow가 매개변수가 아니라 전역 변수 total을 공유한다. 전역 변수 공유 = 공통(Common) 결합도.

선지 판정 근거
① 자료 오답 단순 값을 매개변수로 주고받을 때
② 스탬프 오답 자료구조·객체 통째 전달일 때
공통 정답 전역 변수를 여러 모듈이 공유
④ 내용 오답 상대 함수의 내부 코드·변수에 직접 침범할 때

🔑 코드에 전역 변수(함수 밖 선언)가 보이고 여러 함수가 그걸 쓰면 → 공통 결합도.

[기출 4 출제] 다음 중 모듈의 응집도(Cohesion)가 가장 높은(좋은) 유형은? (양 끝 묻기)

  • ① 우연적 응집도
  • ② 시간적 응집도
  • ③ 통신적 응집도
  • ④ 기능적 응집도
정답 및 해설 보기

정답 ④

선지 순위(7=가장 높음)
① 우연적 1단계(최하·최악)
② 시간적 3단계
③ 통신적 5단계
기능적 7단계(최고) ← 정답

🔑 우논시절통순기의 끝(기능적)이 가장 높은 응집도. "기" = 끝 = 최고.

[기출 5 출제] 다음 설명에 해당하는 응집도(Cohesion) 유형은? (설명→용어)

모듈 내 구성 요소들이 하나의 작업에 기여하지 않고, 특정 시점에 처리되어야 하는 기능을 모아놓은 형태로, 시스템 초기화나 종료 시 실행해야 하는 기능들을 하나의 모듈에 구성한 경우.

  • ① 논리적 응집도
  • ② 시간적 응집도
  • ③ 절차적 응집도
  • ④ 통신적 응집도
정답 및 해설 보기

정답 ②

선지 핵심 키워드
① 논리적 논리적 분류만 같고 기능은 다름
시간적 같은 시점(초기화·종료)에 실행 ← 정답
③ 절차적 실행 순서(절차)로 묶임(데이터 무관)
④ 통신적 동일한 데이터 공유

🔑 "초기화", "종료", "특정 시점" 키워드 → 무조건 시간적 응집도.

[기출 6 출제] 다음 함수의 응집도(Cohesion) 유형은? (코드 판별형)

Python
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과목에선 여기에 코드를 보고 유형을 집는 한 단계가 더 붙는다 — 전역 변수면 공통, 플래그면 제어, 출력→입력이면 순차적.

전체 목록 필기 이론

합격까지

정처기, 혼자 막막하다면

초개인화 학습앱 Klue와 에듀윌 온라인강의로 합격까지 이어가세요.