소프트웨어 공학 7장. 설계 및 구현

기타/[소프트웨어 공학]

2019. 5. 1. 18:42

 

[설계의 정의]

: 개발될 제품에 대한 의미있는 공학적 표현

: 고객의 요구사항으로 추적 가능, 좋은 설계의 범주에 들도록 품질 검증 필요.

 

 

[소프트웨어 설계의 종류]

: 소프트웨어 구성 뼈대 정의해 기반을 만드는것

– 상의 설계(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 처럼 다른 구현 제공