[설계의 정의]
: 개발될 제품에 대한 의미있는 공학적 표현
: 고객의 요구사항으로 추적 가능, 좋은 설계의 범주에 들도록 품질 검증 필요.
[소프트웨어 설계의 종류]
: 소프트웨어 구성 뼈대 정의해 기반을 만드는것
– 상의 설계(High-Level Design)
: 아키텍처 설계, 예비 설계 / 하위 설계를 위한 바탕
: 시스템 수준에서의 소프트웨어 구성 컴포넌트들 간의 관계 (= 전체적 구조 )
– 하위 설계(Low-Level Design)
: 모듈 설계, 상세 설계 / 하위 설계 완료되면 구현(기계적 작업) 실시.
: 시스템의 각 구성요소들의 내부구조, 동적 행위 등을 결정
# 하위 설계 방법 : 절차기반 / 자료위주 / 객체지향 설계 방법
# 상위 설계와 하위 설계의 구조도
: 하위 설계의 자료구조, 알고리즘 설계는 개발자 재량이다.
[설계 프로세스]
: 요구사항 분석과 소프트웨어 기능등 명세 후, 이 기능들을 구현하기 위한 큰 그림 필요
# 좋은 설계 조건
– 요구사항 명세서의 모든 내용을 포함(= 완전성)
– 이해가 쉬워서 구현 또는 테스트로 추적이 가능
– 유지 보수시 변경이 용이(= 변경의 용이성)
# 설계 방식
1) 프로젝트 지향 설계(Process Oriented Design)
: 업무의 처리절차 중심으로 설계 구성 요소 구분
: 어떠한 절차를 거쳐 작업을 수행 / 어떤 입출력 자료를 생성 에 초점
: 함수 절차 구현엔 유리하지만 함수들간의 관계 및 재사용 데이터 유형등 고려 어려움
2) 객체지향 설계(Object Oriented Design)
: 시스템의 실제 객체 요소 중심 설계
: ‘자료구조’와 ‘그에 대한 연산’을 묶어서 구성되는 객체들을 정의, 이들의 상호작용의 기본이 되도록 설계
# 시스템을 해석하는 관점의 차이
: 객체 지향 설계는 내재 일관성이 같은것을 객체로 묶음
[설계 원리]
: 소프트웨어 설계의 중심 원리 3가지 개념
1) 추상화(Abstraction) : 자세한 구현 전에, 상위 레벨에서의 제품의 구현을 먼저 생각해보는 것.
# 추상화의 종류
– 과정 추상화 : 자세한 단계 고려하지 않고, 상위 수준에서 수행 흐름만 먼저 설계
– 데이터 추상화 : 데이터 구조를 대표할 수 있는 표현으로 대체
– 제어 추상화 : 분기를 생각하며 추상화
# 추상화 예시(원하는 날짜 입력 받아 요일을 알려주는 달력 프로그램)
2) 단계적 분해(Stepwise Refinement)
: 문제를 상위 수준에서 점증적으로 좀더 구체적인 하위 수준으로 분할하는 기법
# 단계적 분해 과정
– 문제를 하위 수준의 독립된 단위로 나눈다.
– 구분된 문제의 자세한 내용은 가능한 뒤로 미룬다.
– 점증적으로 구체화 작업 계속한다.
3) 모듈화
- 모듈 : 설계의 기본 단위. 수행 가능 명령어, 자료구조, 다른 모듈 포함 독립 단위
# 모듈의 특성
– 이름을 가진다
– 독립적으로 컴파일 된다
– 다른 모듈을 사용가능하다
– 다른 프로그램에서 사용 가능하다
# 모듈의 크기 : 쉽게 이해 되도록 가능한 작아야 하지만, 너무 작아도 안됨(적당한 크기)
[효과적인 모듈 설계]
1) 정보 은닉(Information Hiding)
: 각 모듈 내부 내용에 대해서 비밀로 묶고, 인터페이스를 통해서만 메세지 전달 개념
: 설계상의 결정 사항들이 각 모듈안에 감춰져있어 다른 모듈이 접근하거나 변경 못함
# 정보 은닉의 장점
: 모듈의 구현을 독립적으로 맡길 수 있다.
: 설계 과정에서 하나의 모듈이 변경 되더라도 설계에 영향을 주지 않는다.
2) 기능적 독립성(Functional Independence)
: 모듈은 뚜렷한 하나의 목적을 가지면서, 다른 모듈과의 상호 의존도가 낮을수록 기능적으로 독립적이라고 한다.
- 독립성을 나타내는 지표 : 응집력, 결합도
[모듈의 응집력(Cohesion)]
: 모듈 안의 요소들이 서로 관련되어 있는 정도
# Myers의 응집력 정도 구분
: Myers는 7단계, Schach는 6단계로 표현(기능+정보 하나로 취급)
: 응집력 강할수록 좋은 설계
# 응집력 정도 종류
1) 기능적 응집 : 모듈이 잘 정의된 하나의 기능만 수행
ex) ‘성적 입력 기능’ 과 ‘출석 처리 기능’이 각각의 모듈로 존재
2) 교환적 응집 : 한 모듈 내에 2개 이상의 기능이 존재, 단계별 순서에 의해서만 수행
ex) ‘성적 입력 기능’과 ‘성적 비율 확인 기능’ 이 한 모듈로 존재 : 단계적 순서로 진행, 입출력 공유
3) 절차적 응집 : 큰 테두리 안에서 같은 작업에 속하고, 입출력 공유 X, 순서에 따라 수행
ex) ‘일어난다’, ‘양치한다’, ‘이메일 확인한다’ 가 한 모듈에 위치 : 단계적 순서지만, 입출력 공유X, 교환적 응집과 구별 유의
4) 시간적 응집 : 프로그램의 초기화 모듈 같이 한번만 수행되는 요소 포함 형태
ex) 비슷한 타이밍에 수행되는거 묶음
5) 논리적 응집 : 비슷한 성격을 가지거나 특정 형태로 분류되는 처리 요소
ex) print 객체 (사용자 print, 성적 print, 분반 print 등)
6) 우연적 응집 : 아무 관련 없는 처리 요소들로 모듈이 형성
ex) util 클래스 : 어디에도 넣기 애매한것들 묶음
[모듈의 결합도]
: 모듈간의 연결되어 상호 의존하는 정도
# schach의 결합도 5단계
: 결합도 약할수록 좋은 설계(Loosely coupled)
# 결합도 정도 종류
1) 자료 결합 : 모듈간 인터페이스가 자료 요소로만 구성 / 각 모듈들이 단순 입력값, 리턴값으로만 연관(과정 은닉)
2) 구조 결합 : 모듈간 인터페이스로 배열이나 레코드같은 자료 구조가 전달 / 단순 변수가 아닌 필요 없는 부분까지 포함된 배열 전달
3) 제어 결합 : 한 모듈이 다른 모듈에 제어 요소(funciton code, switch, tag등) 전달
ex) 한 모듈에서 operand 함수의 add, sub 함수들이 존재할때, 다른 모듈에 add나 sub 전달
4) 공통 결합 : 여러 모듈이 공통 자료 영역 사용하는 경우
ex) 전역변수, 공유메모리 사용
5) 내용 결합 : 한 모듈이 다른 모듈의 일부분을 직접 참조, 수정하는 경우
ex) goto문
* 좋은 설계는 높은 응집성과 낮은 결합성을 가진다
[객체지향(Object-Oriented) 개념]
– 객체 : 특성(Attribute)과 행위(Behavior)를 가지고 있는 인지 할수 있는 개체(Entity)
# 클래스와 객체
– 클래스(class) : 객체의 대표적 구조, 객체 내부 구성 설명
– 객체(Obiect) : 클래스의 실체(Instance), 각 객체내 변수명은 같지만 서로 독립적
ex) ‘차’는 클래스, ‘홍길동의 차’는 객체
# 객체지향 방법 특징
– 절차 강조 구조적 방법 : 데이터 소홀
– 시스템 개발의 복잡한 문제들을 캡슐화, 상속, 다형성 개념으로 해결.
[캡슐화(Encapsulation)]
: 소프트웨어 모듈(객체내 상세 정보, 처리방식)을 외부로 부터 감추는것
: 객체의 추상화를 통해 독립성을 보장
# 캡슐화의 예
– private 으로 변수 선언 : 다른 클래스에서 사용 불가능
[상속(Inheritance)]
: 다른 클래스의 속성을 물려받아 내 것처럼 사용 (상위 클래스 / 하위 클래스)
# 상속의 예
[다형성(Polymorphism)]
: 하나의 인터페이스를 통해 서로 다른 구현을 제공
ex) 동일한 print 메세지지만, 객체에 따라 text print, graphic print 처럼 다른 구현 제공
'기타 > [소프트웨어 공학]' 카테고리의 다른 글
소프트웨어 공학 8, 9강 - 생략 (0) | 2019.10.27 |
---|---|
소프트웨어 공학 7-2장. UML 설계 (1) | 2019.10.27 |
6.5장. 소프트웨어 공학 중간정리 (0) | 2019.04.22 |
6장. 리스크 관리 (0) | 2019.04.17 |
5장. 프로젝트 계획 및 통제 (0) | 2019.04.10 |