추상화
소프트웨어 설계
개요
소프트웨어를 개발하기 위한 청사진을 만들기 위한 반복되는 과정
개발하고자 하는 것을 공학적으로 의미 있게 표현한 것
설계는 문제를 푸는 활동(Problem Solving Activity)
요구공학과정의 소프트웨어 요구사항 명세서를 받아서 자료구조, 시스템구조, 인터페이스표현, 구성요소 등의
4가지 레벨의 설계로 자세히 변화
각 설계 행위 도중에 고품질을 위한 설계개념과 원리를 적용
소프트웨어설계는 매우 귀찮은 문제(Wicked Problem)
정의
사용자의 요구를 만족시키기 위하여 제약 조건이 반영된 구현 대안을 창출하는 일
소프트웨어의 시스템의 내부를 설계
모듈의 구조
자료 구조
알고리즘 설계
소프트웨어 설계란?
설계 시 고려 사항들
모듈(Module)
독립적으로 처리할 수 있는 구별단위(Identifiable Unit), 그 단위들은 하나 이상의 프로시저들을 포함
모듈의 개념 사용
모듈은 소프트웨어에 꼭 나타남
모듈 분할의 바람직한 방법의 특징
설계의 질을 측정 시 사용
유지보수와 재사용 용이
영향을 주는 설계 형태
– 추상화(Abstraction)
– 모듈화(Modularity)
– 정보 은폐(Information Hiding)
– 복잡도(Complexity)
– 시스템 구조(System Structure)
추상화(Abstraction)
정의
복잡한 현상을 이해하는 과정에서 인간의 이해력을 돕는 도구
추상
현실세계에 있는 특정한 범위의 대상물(Things), 상태 또는 과정 등에서 일어나는 세부적인 사항이 아닌 본질적인 사항,
유사한 점을 인식하여 주의를 집중하는 것
목적
추상화 기술을 통해 사물을 간결하게 표시

효과
추상화의 개념
기계어의 어셈블러에 의한 기호화부터 시작하여 같은 형태의 변수로 묶은 배열의 추상화
프로그램의 구조도 알기 쉽게 함
- 함수, 서브루틴
자연언어를 사용하여 모듈 구조나 알고리즘을 알기 쉽게 함
계층적 기능 분할 모듈
Top 모듈은 개념적인 내용
밑으로 내려갈수록 단계적으로 상세화
독립성이 높은 범용성이 있는 모듈을 생성하는 효과
일반화시킨 기능 ->독립성 높은 모듈
상호작용을 제거 ->범용성 있는 모듈
형태
절차적 추상화(Procedural Abstraction)
분할 타입
- 하향식 분할(Top-down), 단계적(Stepwise) 분할
절차적 개념은 분할 처리의 결과로부터 하위 문제들의 표기법 제공
절차적 추상화에서 절차의 이름은 처리행위의 응답(Sequence of Action)으로 표시
소프트웨어 설계할 때 가장 간단한 형태로 입력 처리와 출력에 관한 설계로 분할
프로그램의 제어구조의 계층을 찾는 것이 목적
데이터 추상화(Data Abstraction)
프로그램의 데이터의 계층을 찾는 것이 목표
프로그램의 언어는 숫자나 진리 값을 원시 데이터구조에 제공
데이터구조를 좀더 복잡하게 만드는 스택이나 이진트리와 같은 블록도 사용
데이터추상화를 응용한 것을 때때로 객체지향 설계라 함
- 객체의 타입과 연관된 연산(Associated Operation)이 하나의 모듈로 캡슐화되어 있음
기능 추상화(Function Abstraction)
입력자료를 출력자료로 변환하는 과정을 추상화
부프로그램의 시그너처와 기능만 생각
제어 추상화(Control Abstraction)
외부 이벤트에 대한 반응을 추상화
2 모듈화
설계작업
특징

프로그래밍에서의 모듈
구조
근본은 주 모듈
분할된 각각은 하위 모듈

모듈 사이의 인터페이스
모듈 사이의 종속 관계
상위 모듈이 주 모듈이 됨
상위 모듈이 하위 모듈을 이용
모듈 사용 시 상위 모듈을 「 호출 」 또는 「 Call 한다. 」라고 함
이때 모듈 사이에는 파라미터의 주고 받음이 이루어짐

모듈 응집력(Cohesion)
모듈 안의 구성 요소들이 공동의 목적을 달성하기 위하여 관련되어 있는 정도
모듈 내에서의 관련성의 척도
목표
한 모듈이 단일 기능을 갖도록 설계
예 – finishup
최종 보고서를 출력하고, 계산 결과를 디스크에 저장
응집력의 7가지 단계
기능적(Functional) 1
모듈의 기능이 한 문장으로 떨어짐
예 – 판매세금 계산
순차적(Sequential) 2
작업의 결과가 다른 작업에 입력
예 – 거래를 읽고 마스터 파일을 변경
교환적(Communicational) 3
동일한 입력과 출력을 사용하는 작업의 모임
예 – 출력 파일을 출력하고 저장
절차적(Procedural) 4
같은 범주에 속하는 일들이 순서적으로 수행
예 – restart-RTN
총계를 출력하고, 화면을 지우고 메뉴를 뿌리고, 메뉴 선택을 받음
시간적(Temporal) 5
프로그램 초기화
논리적(Logical) 6
유사한 성격의 작업을 한 모듈로 모음
우연적(Coincidental) 7
아무 관련 없는 작업을 한 모듈에 모음
결합도(Coupling)
상호 모듈 간의 연결 강도 측정, 모듈과 모듈 간 관련성 척도

독립적인 모듈이 되기 위해서는 모듈 간의 결합도가 낮은 설계가 바람직함
결합도의 타입 정의
내용 결합도(Content Coupling)
어떤 모듈이 다른 모듈에 직접적인 영향을 미치는 것
공유 결합도(Common Coupling)
두 모듈 간 데이터를 나누는 것
외부 결합도(External Coupling)
모듈이 외부 개체(파일)와 통신하는 것
제어 결합도(Control Coupling)
하나의 모듈이 다른 모듈에게 필요한 제어 정보를 전달하는 경우
스탬프 결합도(Stamp Coupling)
완전한 자료 구조가 한 모듈에서 다른 모듈로 전달되어지는 경우에 해당
자료 결합도(Data Coupling)
자료구조는 모듈 간의 단순한 자료가 전달되어지는 경우에 해당
모듈의 독립성
모듈간의 결합도가 약하고, 모듈 구성 요소 간의 응집력이 강한 단순 인터페이스의 중요성
프로그래머 간의 대화가 단순해짐
정확성 증명(Correctness Proofs)은 유도를 좀더 쉽게 함
어떤 변화가 다른 모듈들 간에 전해지는 것을 줄임으로써, 유지비용을 줄일 수 있음
모듈 간의 재사용성(Reusability)을 증가시킬 수 있음
모듈의 판독성(Comprehesibility) 향상
경험적인 학습(Empirical Studies)은 인터페이스의 약한 결합도와 강한 응집력, 이런 속성을 가지지 않는
것보다 더 에러가 적다는 것을 보여줌
3. 정보은폐
개념
모듈 사이의 정보(데이터와 기능)의 상호작용을 제거하기 위해 모듈을 이용하기 위하여 필요한 최소한의 정보만
보이고, 그 외의 자세한 것은 외부의 모듈로부터 액세스할 수 없도록 감춤

특징
각 모듈의 자세한 처리 내용이 시스템의 다른 부분으로부터 감추어져 있어야 함
각 모듈이 다른 모듈에 구애 받지 않고 설계
인터페이스가 모듈 안의 구체적 사항을 최소로 반영
전역변수가 없어야 함
모듈 단위의 수정, 시험, 유지보수에 큰 장점
모듈 설계 평가에 기초