로봇 소프트웨어 구조설계로봇미들웨어개발로봇 미들웨어 구현
출제기준 좌표2·1·3·1
2과목 · 로봇 소프트웨어 구조설계

모듈화 프로그래밍

로봇미들웨어개발로봇 미들웨어 구현
# 로봇소프트웨어구조설계
01

📌 개요

  • 구조 설계의 "높은 응집·낮은 결합" 원칙을 실제로 판정하는 응집도 7단계와 결합도 6단계의 등급표를 다룸
  • 소프트웨어 자격시험 전반에서 최빈출 주제 — 순서 나열·사례 식별 문제가 반복 출제
  • 목표: 등급의 이름·순서·대표 예를 정확히 암기
02

📖 핵심 개념

모듈화란

  • 모듈화(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): 표준 인터페이스를 갖춘 독립 배포 단위 — 미들웨어의 노드/컴포넌트가 이 개념의 로봇판이다 (→ 로봇 미들웨어 구조 설계)
03

📊 다이어그램 · 수식

응집도·결합도 스펙트럼

DIAGRAM
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

좋은 모듈의 모습

DIAGRAM
flowchart TD
    A["상위 모듈"] -- "자료 결합
set_speed(0.5)" --> M["모터 제어 모듈
(기능적 응집)"] M -. "정보 은닉:
PWM 레지스터·게인은 비공개" .-> H["내부 구현"] B["다른 상위 모듈"] -- "재사용 (팬인 ↑)" --> M
04

🎯 핵심 요약 · 암기 포인트

익힘 0 / 12카드를 눌러 뒤집고, 앞면에서 아는지 표시하세요.
Q · 1
모듈화의 장점 4가지는?
A
분업·병렬 개발, 모듈 단위 시험 용이, 재사용, 변경 국소화로 유지보수성 향상
Q · 2
응집도(Cohesion)란?
A
모듈 내부 요소들이 하나의 목적을 위해 얼마나 밀접하게 관련되어 있는가 — 높을수록 좋다
Q · 3
결합도(Coupling)란?
A
모듈 사이의 의존 정도 — 낮을수록 좋다
Q · 4
응집도를 높은 것부터 나열하면?
A
기능적 > 순차적 > 교환(통신)적 > 절차적 > 시간적 > 논리적 > 우연적
Q · 5
결합도를 낮은 것부터 나열하면?
A
자료 < 스탬프 < 제어 < 외부 < 공통 < 내용
Q · 6
기능적 응집이란?
A
모듈이 정확히 한 가지 기능만 수행하는 최상의 응집 (예: PID 계산 모듈)
Q · 7
시간적 응집의 대표 예는?
A
시스템 초기화 모듈 — 같은 시점에 실행된다는 이유만으로 여러 초기화를 묶은 것
Q · 8
제어 결합이란?
A
제어 플래그를 넘겨 상대 모듈의 내부 동작 흐름을 지시하는 결합
Q · 9
공통 결합이란?
A
여러 모듈이 전역 변수를 공유하는 결합 — 변경 추적이 어려워 디버깅이 힘들다
Q · 10
내용 결합이란?
A
한 모듈이 다른 모듈의 내부 데이터·코드를 직접 참조·수정하는 최악의 결합
Q · 11
팬인과 팬아웃의 의미는?
A
팬인은 그 모듈을 호출하는 상위 모듈 수(재사용 지표), 팬아웃은 그 모듈이 호출하는 하위 모듈 수(과다하면 복잡)
Q · 12
정적 라이브러리와 동적 라이브러리의 차이는?
A
정적은 빌드 시 실행 파일에 포함, 동적(.so/.dll)은 실행 시 로드되어 공유·단독 교체 가능
05

✏️ 예상문제

1. 응집도가 가장 높은(가장 바람직한) 것은?

① 시간적 응집 ② 기능적 응집 ③ 논리적 응집 ④ 우연적 응집

정답 및 해설

정답: ② 기능적 응집은 모듈이 정확히 한 가지 기능만 수행하는 최상의 상태다. 순서는 기능적 > 순차적 > 통신적 > 절차적 > 시간적 > 논리적 > 우연적이며, 뒤로 갈수록 나쁘다.

2. 결합도를 낮은 것부터 순서대로 옳게 나열한 것은?

① 자료 → 제어 → 스탬프 → 공통 → 외부 → 내용 ② 내용 → 공통 → 외부 → 제어 → 스탬프 → 자료 ③ 자료 → 스탬프 → 제어 → 외부 → 공통 → 내용 ④ 스탬프 → 자료 → 외부 → 제어 → 내용 → 공통

정답 및 해설

정답: ③ "자·스·제·외·공·내"다. ②는 높은 것부터 나열한 역순임에 주의 — 문제에서 "낮은 것부터"인지 "높은 것부터"인지를 반드시 확인해야 한다.

3. 여러 모듈이 전역 상태 변수 robot_state를 직접 읽고 쓰도록 구현했다. 이 모듈들 사이의 결합도는?

① 자료 결합 ② 스탬프 결합 ③ 제어 결합 ④ 공통 결합

정답 및 해설

정답: ④ 전역 변수(공통 데이터 영역)의 공유는 공통(common) 결합이다. 어느 모듈이 언제 값을 바꿨는지 추적하기 어려워 오류의 온상이 된다. 파라미터로 값만 전달하면 자료 결합, 구조체 전체를 넘기면 스탬프 결합이다.

4. init_system() 함수 하나에 센서 초기화, 모터 초기화, 통신 초기화를 모두 몰아넣었다. 이 모듈의 응집도는?

① 시간적 응집 ② 기능적 응집 ③ 순차적 응집 ④ 우연적 응집

정답 및 해설

정답: ① 세 작업은 기능적으로는 무관하지만 "시스템 시작 시점에 함께 실행된다"는 이유로 묶였다 — 시간적(temporal) 응집의 전형이다. 초기화 모듈은 실무에서 흔하지만, 등급상으로는 중하위 응집에 해당한다.

5. 정보 은닉(Information Hiding)의 목적으로 가장 적절한 것은?

① 코드 실행 속도를 높이기 위해 ② 내부 구현 변경이 다른 모듈에 파급되지 않게 하기 위해 ③ 메모리 사용량을 줄이기 위해 ④ 모든 변수를 전역으로 공유하기 위해

정답 및 해설

정답: ② 내부를 감추고 인터페이스만 공개하면, 내부 알고리즘·자료구조를 바꿔도 인터페이스를 쓰는 쪽은 영향이 없다. 변경의 여파를 모듈 안에 가두는 것이 목적이며, ④는 정반대(공통 결합 유발)다.

06

🔗 관련 노트

로봇소프트웨어개발기사 필기 · 학습 교재출제기준 2025.1.1 – 2027.12.31