핵심 요약
상·하위 설계와 추상화·분해·정보 은닉·모듈화 원리를 구조적 표현과 함께 익힌다.
본문
설계 수준
소프트웨어 설계는 요구사항을 구현 가능한 구조로 바꾸는 활동이다. 문서 이름보다 결정의 범위와 상세도로 수준을 구분한다.
| 구분 | 주요 결정 |
|---|---|
| 상위 설계 | 시스템 구조, 서브시스템, 외부 인터페이스, 데이터 흐름, 주요 컴포넌트 |
| 하위 설계 | 모듈·클래스 내부 구조, 자료 구조, 알고리즘, 세부 인터페이스 |
상위 설계는 “무엇을 어떤 큰 단위로 나눌 것인가”, 하위 설계는 “각 단위를 어떻게 구현할 것인가”에 가깝다. 두 수준은 완전히 분리되지 않고 상세 설계에서 발견된 제약이 상위 구조를 수정하게 할 수 있다.
복잡성을 줄이는 원리
추상화
불필요한 세부를 감추고 현재 문제에 필요한 본질만 표현한다.
- 기능 추상화: 수행할 기능의 이름과 결과에 집중
- 데이터 추상화: 데이터와 허용 연산을 하나의 개념으로 표현
- 제어 추상화: 복잡한 제어 흐름을 의미 있는 단위로 표현
단계적 분해와 정제
큰 기능을 하위 기능으로 나누고 각 기능을 점차 상세화한다. 분해 기준은 단순한 코드 길이보다 책임·변경 이유·데이터와 기능의 관련성이다.
정보 은닉
다른 모듈이 알 필요가 없는 내부 자료 구조·알고리즘·변경 가능 결정을 감춘다. 외부는 안정된 인터페이스를 통해서만 사용한다.
모듈화

시스템을 독립적인 책임 단위로 나누는 것이다. 좋은 모듈은:
- 하나의 분명한 책임을 가진다.
- 외부에 필요한 인터페이스만 공개한다.
- 내부 변경이 다른 모듈에 적게 퍼진다.
- 입력·출력·오류·제약이 명확하다.
- 시험과 재사용이 가능하다.
무조건 작게 나누는 것이 목표는 아니다. 너무 잘게 분리하면 호출 관계와 관리 비용이 증가한다.
하향식과 상향식 설계
| 방식 | 출발점 | 특징 |
|---|---|---|
| 하향식 | 전체 기능 | 상위 기능을 하위 기능으로 단계적으로 분해 |
| 상향식 | 재사용 가능한 하위 요소 | 기존 모듈을 조합하여 상위 시스템 구성 |
실제 설계에서는 전체 구조를 잡는 하향식 접근과 재사용 요소를 활용하는 상향식 접근을 함께 사용할 수 있다.
구조적 설계와 표현
구조적 설계는 시스템을 기능 중심의 모듈로 분해하고 모듈 간 호출·자료 전달 관계를 명확히 한다.
구조도(Structure Chart)
모듈의 계층과 호출 관계, 전달되는 자료·제어 정보를 나타낸다. DFD가 데이터의 흐름과 변환을 표현하는 분석 도구라면 구조도는 프로그램 모듈 구조에 더 가깝다.
N-S 차트
N-S 차트(Nassi-Shneiderman Chart)는 한 절차 내부의 구조적 제어 논리를 상자 중첩으로 표현한다.
- 순차
- 선택(if/else)
- 반복(while 등)
화살표 중심의 순서도와 달리 구조적 제어 블록을 명확히 보여 주며 임의의 흐름 이동을 줄인다. 시스템 전체 모듈 관계나 데이터 흐름을 표현하는 도구는 아니다.
표현 도구 비교
| 도구 | 중심 표현 |
|---|---|
| DFD | 데이터의 이동과 변환 |
| 구조도 | 모듈 계층·호출·자료 전달 |
| N-S 차트 | 모듈 내부의 순차·선택·반복 |
| UML 클래스 다이어그램 | 클래스와 정적 관계 |
| UML 시퀀스 다이어그램 | 객체 간 시간 순 메시지 |
| 의사코드 | 구현 언어에 독립적인 처리 절차 |
요구사항으로 표현 도구 고르기
모의시험 서비스가 제출 답안과 정답표로 점수와 문항별 판정을 만들고, 결과를 저장해 응시자에게 보여 준다고 하자. 같은 서비스라도 검토하려는 내용에 따라 필요한 그림이 달라진다.
답안과 채점 결과의 이동을 확인한다
응시자의 제출 답안과 저장된 정답표가 어느 처리에 들어가며, 만들어진 채점 결과가 어디로 전달되는지 확인하려 한다. DFD·구조도·N-S 차트 중 무엇을 선택할까?
DFD를 선택한다. 확인할 대상은 자료의 출발지, 변환 과정, 저장소와 목적지다.
응시자 ── 제출 답안 ──→ 채점 처리
정답표 저장소 ── 정답표 ──→ 채점 처리
채점 처리 ── 채점 결과 ──→ 결과 저장소
채점 처리 ── 총점·문항별 판정 ──→ 응시자
화살표에는 제출 답안, 정답표, 채점 결과처럼 전달되는 자료의 이름을 붙인다. 먼저 실행, 그다음 실행을 적은 실행 순서도로 읽으면 요구사항을 잘못 해석하게 된다.
구조도를 고르면 프로그램 모듈의 호출 관계를 검토하게 된다. 응시자와 저장소를 포함한 자료의 이동을 확인하려는 이 요구에는 DFD가 적합하다. N-S 차트는 채점 처리 안의 조건과 반복을 표현할 때 사용한다.
채점 실행의 하위 모듈과 전달값을 확인한다
채점 실행 모듈이 점수 계산, 결과 저장, 응답 작성 모듈을 호출하도록 설계했다. 계산된 총점과 판정 목록이 필요한 모듈에 전달되는지 검토하려 한다. 어떤 도구를 선택할까?
구조도를 선택한다. 호출 관계와 모듈별 입출력을 다음과 같이 정리할 수 있다.
채점 실행
├─ 점수 계산: 답안·정답표 → 총점·판정 목록
├─ 결과 저장: 총점·판정 목록 → 저장 결과
└─ 응답 작성: 총점·판정 목록·저장 결과 → 응시자 응답
예를 들어 결과 저장에 총점만 전달하고 판정 목록을 빠뜨렸다면, 문항별 결과를 저장한다는 요구를 만족하지 못한다. 구조도에서는 이 누락을 모듈의 입력과 출력으로 확인한다.
DFD에서 두 처리 사이에 자료가 이동한다고 해서 한 처리가 다른 처리를 함수로 호출한다고 정해지는 것은 아니다. N-S 차트로 각 모듈의 내부 절차를 그려도 전체 모듈의 호출 계층을 대신하지는 못한다.
위 구조도만으로 각 모듈의 실제 호출 순서, 반복 횟수, 실패 시 분기까지 모두 결정됐다고 읽어서도 안 된다.
문항별 판정과 반복 범위를 확인한다
각 문항은 5점이다. 모든 문항을 한 번씩 확인해 미응답·정답·오답을 기록하고, 정답일 때만 총점에 5점을 더한다. 전체 문항을 처리한 뒤 요약을 한 번 만든다. 조건과 반복의 중첩이 맞는지 확인하려면 어떤 도구를 선택할까?
N-S 차트를 선택한다. 문항 반복 안에 미응답 여부와 정답 여부의 선택 블록을 넣고, 요약 생성은 반복이 끝난 뒤에 둔다. 블록에 넣을 처리 내용을 의사코드로 확인하면 다음과 같다.
총점 = 0
판정 목록 = 빈 목록
각 문항에 대해 반복
답이 비어 있으면
판정 목록에 '미응답' 추가
그렇지 않으면
답이 정답과 같으면
총점에 5 더하기
판정 목록에 '정답' 추가
그렇지 않으면
판정 목록에 '오답' 추가
총점과 판정 목록으로 요약 생성
제출 답안과 정답표를 다음과 같이 대입해 보자.
| 문항 | 제출 답안 | 정답 | 판정 | 누적 점수 |
|---|---|---|---|---|
| 1 | 2 | 2 | 정답 | 5 |
| 2 | 미응답 | 3 | 미응답 | 5 |
| 3 | 1 | 1 | 정답 | 10 |
| 4 | 4 | 2 | 오답 | 10 |
총점은 10점이고 요약은 네 문항을 모두 처리한 뒤 한 번 생성한다. 요약 생성 블록을 반복 안에 넣으면 이 입력에서는 요약이 네 번 만들어진다. 미응답 여부를 반복 밖에서 한 번만 판단하면 문항마다 답이 다를 수 있다는 조건을 놓친다.
DFD의 자료 이동선은 이런 반복 횟수와 선택의 중첩을 정하지 않는다. 구조도 역시 점수 계산 모듈을 호출한다는 사실만으로 그 내부 판정 절차까지 보여 주지는 못한다.