모듈화 프로그래밍
📌 개요
- 구조 설계의 "높은 응집·낮은 결합" 원칙을 실제로 판정하는 응집도 7단계와 결합도 6단계의 등급표를 다룸
- 소프트웨어 자격시험 전반에서 최빈출 주제 — 순서 나열·사례 식별 문제가 반복 출제
- 목표: 등급의 이름·순서·대표 예를 정확히 암기
📖 핵심 개념
모듈화란
- 모듈화(Modularization) = 큰 프로그램을 독립적인 기능 단위(모듈)로 나누어 만드는 것
- 분할 정복(Divide and Conquer)의 소프트웨어판
장점: ① 분업·병렬 개발 가능 ② 모듈 단위의 시험·디버깅 용이 ③ 재사용 ④ 변경이 모듈 안에 국한되어 유지보수 쉬움 ⑤ 전체 복잡도 감소
모듈의 품질은 두 잣대로 잰다 — 안은 얼마나 뭉쳐 있나(응집도), 밖과는 얼마나 얽혀 있나(결합도).
응집도(Cohesion) — 모듈 안의 단결력, 높을수록 좋다
모듈 내부의 요소들이 하나의 목적을 위해 얼마나 밀접하게 관련되어 있는가. 높은 것부터(좋은 것부터) 7단계:
| 순위 | 응집도 | 의미 | 로봇 예시 |
|---|---|---|---|
| 1 (최상) | 기능적(Functional) | 정확히 한 가지 기능만 수행 | PID 제어량 계산 모듈 |
| 2 | 순차적(Sequential) | 한 요소의 출력이 다음 요소의 입력 | 스캔 필터링 → 필터 결과로 장애물 검출 |
| 3 | 교환적/통신적(Communicational) | 같은 데이터를 사용하는 요소들의 묶음 | 같은 엔코더 값으로 속도 계산과 위치 계산 |
| 4 | 절차적(Procedural) | 정해진 실행 순서로만 묶임 (데이터 연결 약함) | 점검 절차 1→2→3 수행 모듈 |
| 5 | 시간적(Temporal) | 같은 시점에 실행된다는 이유로 묶임 | 시스템 초기화 모듈 (센서·모터·통신 초기화를 한 곳에) |
| 6 | 논리적(Logical) | 성격이 비슷한 기능들을 플래그로 골라 실행 | 출력(type) — type에 따라 화면/파일/네트워크 출력 |
| 7 (최악) | 우연적(Coincidental) | 아무 관련 없는 요소들의 묶음 | 기타 유틸리티 잡동사니 모듈 |
위로 갈수록 "데이터로 뭉친" 강한 관계, 아래로 갈수록 "우연히 같이 있는" 약한 관계다.
결합도(Coupling) — 모듈 사이의 의존, 낮을수록 좋다
모듈들이 서로 얼마나 얽혀 있는가. 낮은 것부터(좋은 것부터) 6단계:
| 순위 | 결합도 | 의미 | 로봇 예시 |
|---|---|---|---|
| 1 (최상) | 자료(Data) | 필요한 값(파라미터)만 주고받음 | set_speed(0.5) |
| 2 | 스탬프(Stamp) | 구조체·객체 전체를 넘김 (일부만 쓰면서) | 전체 로봇 상태 구조체를 넘기고 속도만 사용 |
| 3 | 제어(Control) | 제어 플래그를 넘겨 상대의 동작 흐름을 지시 | process(mode=2) — 상대 내부 분기를 조종 |
| 4 | 외부(External) | 외부 장치·데이터 형식·프로토콜을 공동 의존 | 두 모듈이 같은 외부 장치 포맷에 묶임 |
| 5 | 공통(Common) | 전역 변수를 여러 모듈이 공유 | 전역 robot_state를 모두가 읽고 씀 |
| 6 (최악) | 내용(Content) | 다른 모듈의 내부 데이터·코드를 직접 참조·수정 | 다른 모듈의 내부 변수를 직접 고침 |
자료 결합이 이상적이다. 공통 결합(전역 변수)은 "누가 언제 바꿨는지" 추적이 안 되어 디버깅을 지옥으로 만들고, 내용 결합은 정보 은닉을 완전히 파괴한다.
정보 은닉과 인터페이스 설계
- 정보 은닉(Information Hiding): 내부 구현(변수·알고리즘)은 감추고 공개 인터페이스(API)만 노출 — 내부를 바꿔도 밖이 안전하다
- C라면 헤더(.h, 공개 API) / 구현(.c) 분리, C++/Python이라면 클래스의 public/private
- 예: 모터 모듈은
motor_set_speed(),motor_get_position()만 공개하고, 내부의 PWM 레지스터·게인 변수는 감춘다 — 사용자가 내부에 손대는 내용 결합을 원천 차단
팬인 · 팬아웃
- 팬인(Fan-in): 그 모듈을 호출하는 상위 모듈의 수 — 높으면 여러 곳이 재사용하는 공통 모듈(좋은 신호, 단 시험은 철저히)
- 팬아웃(Fan-out): 그 모듈이 호출하는 하위 모듈의 수 — 지나치게 크면 한 모듈이 너무 많은 일을 지휘한다는 뜻(복잡도 신호, 적정 수준 유지)
모듈의 물리적 형태 — 라이브러리와 컴포넌트
- 정적 라이브러리(Static Library): 빌드 시 실행 파일에 복사되어 포함 — 배포 간단, 파일 커짐, 교체 시 재빌드
- 동적/공유 라이브러리(Dynamic/Shared, .so/.dll): 실행 시 로드 — 여러 프로그램이 공유, 라이브러리만 교체 가능
- 컴포넌트(Component): 표준 인터페이스를 갖춘 독립 배포 단위 — 미들웨어의 노드/컴포넌트가 이 개념의 로봇판이다 (→ 로봇 미들웨어 구조 설계)
📊 다이어그램 · 수식
응집도·결합도 스펙트럼
flowchart LR
subgraph COH["응집도 (높을수록 좋음 →)"]
direction LR
C7["우연적"] --> C6["논리적"] --> C5["시간적"] --> C4["절차적"] --> C3["통신적"] --> C2["순차적"] --> C1["기능적 ✅"]
end
subgraph COU["결합도 (← 낮을수록 좋음)"]
direction LR
D1["자료 ✅"] --> D2["스탬프"] --> D3["제어"] --> D4["외부"] --> D5["공통"] --> D6["내용"]
end좋은 모듈의 모습
flowchart TD
A["상위 모듈"] -- "자료 결합
set_speed(0.5)" --> M["모터 제어 모듈
(기능적 응집)"]
M -. "정보 은닉:
PWM 레지스터·게인은 비공개" .-> H["내부 구현"]
B["다른 상위 모듈"] -- "재사용 (팬인 ↑)" --> M🎯 핵심 요약 · 암기 포인트
✏️ 예상문제
1. 응집도가 가장 높은(가장 바람직한) 것은?
① 시간적 응집 ② 기능적 응집 ③ 논리적 응집 ④ 우연적 응집
정답 및 해설
정답: ② 기능적 응집은 모듈이 정확히 한 가지 기능만 수행하는 최상의 상태다. 순서는 기능적 > 순차적 > 통신적 > 절차적 > 시간적 > 논리적 > 우연적이며, 뒤로 갈수록 나쁘다.
2. 결합도를 낮은 것부터 순서대로 옳게 나열한 것은?
① 자료 → 제어 → 스탬프 → 공통 → 외부 → 내용 ② 내용 → 공통 → 외부 → 제어 → 스탬프 → 자료 ③ 자료 → 스탬프 → 제어 → 외부 → 공통 → 내용 ④ 스탬프 → 자료 → 외부 → 제어 → 내용 → 공통
정답 및 해설
정답: ③ "자·스·제·외·공·내"다. ②는 높은 것부터 나열한 역순임에 주의 — 문제에서 "낮은 것부터"인지 "높은 것부터"인지를 반드시 확인해야 한다.
3. 여러 모듈이 전역 상태 변수 robot_state를 직접 읽고 쓰도록 구현했다. 이 모듈들 사이의 결합도는?
① 자료 결합 ② 스탬프 결합 ③ 제어 결합 ④ 공통 결합
정답 및 해설
정답: ④ 전역 변수(공통 데이터 영역)의 공유는 공통(common) 결합이다. 어느 모듈이 언제 값을 바꿨는지 추적하기 어려워 오류의 온상이 된다. 파라미터로 값만 전달하면 자료 결합, 구조체 전체를 넘기면 스탬프 결합이다.
4. init_system() 함수 하나에 센서 초기화, 모터 초기화, 통신 초기화를 모두 몰아넣었다. 이 모듈의 응집도는?
① 시간적 응집 ② 기능적 응집 ③ 순차적 응집 ④ 우연적 응집
정답 및 해설
정답: ① 세 작업은 기능적으로는 무관하지만 "시스템 시작 시점에 함께 실행된다"는 이유로 묶였다 — 시간적(temporal) 응집의 전형이다. 초기화 모듈은 실무에서 흔하지만, 등급상으로는 중하위 응집에 해당한다.
5. 정보 은닉(Information Hiding)의 목적으로 가장 적절한 것은?
① 코드 실행 속도를 높이기 위해 ② 내부 구현 변경이 다른 모듈에 파급되지 않게 하기 위해 ③ 메모리 사용량을 줄이기 위해 ④ 모든 변수를 전역으로 공유하기 위해
정답 및 해설
정답: ② 내부를 감추고 인터페이스만 공개하면, 내부 알고리즘·자료구조를 바꿔도 인터페이스를 쓰는 쪽은 영향이 없다. 변경의 여파를 모듈 안에 가두는 것이 목적이며, ④는 정반대(공통 결합 유발)다.
🔗 관련 노트
- 로봇 소프트웨어 구조 설계 — 응집·결합 원칙이 놓이는 상위 설계
- 미들웨어 프로세스 관리 — 모듈이 프로세스로 배치된 뒤의 관리
- 객체지향 소프트웨어 설계 — 캡슐화·정보 은닉의 객체지향 관점
- 로봇 액추에이터 펌웨어 구조 — 펌웨어에서의 계층화·모듈화 실제
- _MOC 로봇소프트웨어구조설계