2022-11-21 소프트웨어공학_9

2022. 11. 21. 23:31학부 강의/소프트웨어공학

 

1. 설계 프로세스

 

소프트웨어를 설계한다는 것은 소프트웨어를 본격적으로 개발하기 이전에 소프트웨어의 뼈대를 잡는 과정이다.

 

소프트웨어를 설계할 때는…

  1. 요구사항 명세서의 모든 내용을 포함해야 한다.
  2. 이해하기가 쉬어서 구현 또는 테스트로 추적이 가능해야 한다.
  3. 유지 보수 시 변경이 용이해야 한다.

 


가. 상위 설계과 하위 설계

 

  • 상위 설계 (high-level design)
    • = 아키텍처 설계, 기본 설계, 외부 설계, 예비 설계
    • 시스템 수준에서 소프트웨어 컴포넌트들 간 관계로 구성된 시스템의 전체적인 구조
    • 시스템 구조도, 외부 파일 및 DB 설계도(레코드 레이아웃, ERD), 인터페이스 설계도 등
  • 하위 설계 (low-level design)
    • = 모듈 설계, 상세 설계, 내부 설계
    • 시스템 구성 요소들의 내부 구조(자료구조, 알고리즘), 동적 행위 등 결정
    • 각 구성 요소의 제어와 데이터 간 연결에 대한 구체적인 정의
    • 절치 기반, 자료 지향, 객체지향 설계 방법

 


나. 설계 방식

 

(1) 프로세스 지향 설계

  • 업무의 처리절차를 중심으로 설계.
  • 수행하는 절차와 생성된 입출력 자료를 중심으로 한다.

 

(2) 객체지향 설계

  • 시스템의 실제 객체 요소를 중심으로 설계
  • 자료구조와 그에 대한 연산을 묶어서 객체를 정의하고 이들 간의 상호작용을 생각하는 설계 방식

 

 


2. 설계 원리

 

  • 추상화 (abstraction)
  • 단계적 분해 (stepwise refinement)
  • 모듈화 (modularization)

 


가. 추상화 (abstraction)

 

바로 구현하기엔 너무 어려우니 큰틀안에서 점차적으로 구체화해 나가는 방식.

 

  • 과정 추상화 (procedure abstraction) → 수행 과정을 대충 설명
  • 데이터 추상화 (data abstraction) → 데이터 구조를 대충 설명
  • 제어 추상화 (control abstraction) → 제어를 대충 설명

 


나. 단계적 분해 (stepwise refinement)

 

단계적 분해란 소프트웨어를 해결할 만한 작은 문제로 나누고 구체화의 정도를 작게 해 점증적으로 문제를 다루어 나가는 방법이다.

 

문제를 낮은 수준의 독립된 단위로 나눈다. → 이를 점증적으로 구체화 작업을 수행한다.

 


다. 모듈화 (modularization)

 

모듈은 설계의 기본 단위로서 수행 가능한 명령어, 자료구조 또는 다른 모듈을 포함하고 있는 독립 단위다.

 

모듈은 이름을 가지며, 독립적으로 컴파일되고, 다른 모듈을 사용할 수 있고 다른 프로그램에서 사용될 수 있다.

 

모듈은 쉽게 이해할 수 있는 수준에서 되도록 작게 만들어지면 좋다.

 


3. 효과적인 모듈 설계

 

  • 정보 은닉
  • 기능적 독립성

 


가. 정보 은닉 (information hiding)

 

정보 은익이 잘 구현된 경우에는 모듈의 외부에서 내부의 내용에 대해서 직접적으로 접근할 수 없고, 마련된 인터페이스를 통해서만 메시지를 전달할 수 있다.

 

하나의 모듈이 수정되더라도 그 영향이 다른 모듈에 미치지 않는다.

 


나. 기능적 독립성 (funtional independence)

 

모듈이 뚜렷한 하나의 목적을 가진다.

 

또 다른 모듈과의 상호 의존도가 낮다.

 

기능적 독립성을 나타내는 지표로는 응집도(cohesion)와 결합도(coupling)이 있다.

 

응집력은 높고 결합도는 낮은 설계가 유지보수와 재사용에 유리하다.

 


(1) 응집도 (cohesion)

 

모듈 내 요소들이 서로 연관되어 있는 정도.

 

높은 응집도를 갖는 모듈이 좋다.

 

아래는 응집도의 종류를 응집도가 강한 → 낮음 순으로 정리한 것이다.

 

  1. 기능적 응집 (functional cohesion)
    : 단일 기능의 요소로 하나의 모듈 구성
  2. 순차적 응집 (sequential cohesion)
    : 한 요소의 출력이 다른 요소의 입력으로 사용되어 두 요소를 하나의 모듈로 구성한 경우
  3. 교환적 응집 (communication cohesion)
    : 같은 입력을 사용하는 구성요소들을 하나의 모듈로 구성
  4. 절차적 응집 (procedural cohesion)
    : 순서가 정해진 몇 개의 구성요소를 하나의 모듈로 구성한 경우 (단, 순차적 응집과 달리 하나의 요소의 출력이 다음 요소의 입력으로 사용되진 않음)
  5. 시간적 응집 (temporal cohesion)
    : 같은 시간대에 함께 실행되는 구성요소들을 하나의 모듈로 구성
  6. 논리적 응집 (logical cohesion)
    : 요소 간 공통점이 있거나 기능이 비슷하여 하나의 모듈로 구성한 경우
  7. 우연적 응집 (coincidental cohesion)
    : 특별한 이유 없이 같이 묶음.

 

오늘시간잘가서굿

 


(2) 결합도 (coupling)

 

모듈들 간 서로 의존하는 정도.

 

낮은 결합도가 좋다.

 

아래는 결합도의 순서를 결합도가 낮음에서 강한 순서로 정리한 것이다.

 

  1. 자료 결합 (data coupling)
    : 모듈 간 인터페이스가 자료요소로만 구성된 경우
  2. 스탬프 결합 (stamp coupling)
    : 한 모듈이 배열이나 레코드 등 자료구조를 다른 모듈에게 전달하는 경우
  3. 제어 결합 (control coupling)
    : 모듈 간 제어 플래그를 매개변수로 사용하는 경우
  4. 외부 결합 (external coupling)
    : 어떤 모듈에서 선언한 데이터(변수)를 외부의 다른 모듈에서 참조할 경우
  5. 공통 결합 (common coupling)
    : 두 모듈이 전역 자료(global data) 영역을 공유하는 경우
  6. 내용 결합 (content coupling))
    : 한 모듈이 다른 모듈의 일부분을 직접 참조 또는 수정하는 경우

 

자세제어기능

 


4. 객체지향 개념

 

객체, 클래스의 개념 그리고 객체지향 설계의 특성은 이전에도 너무 많이 다뤄서 여기선 따로 정리하진 않겠다.

 

객체지향 설계의 특성

  • 캡슐화
  • 상속
  • 다형성