34
소프트웨어 설계 김성영교수 금오공과대학교 컴퓨터공학과

카드 게임 분석 및 설계lms.kumoh.ac.kr/lmsdata/contents/20152CD001203/002.소프트웨어... · 소프트웨어설계란? • 요구분석결과를사용하여소프트웨어속성,

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

소프트웨어설계

김성영교수금오공과대학교컴퓨터공학과

목차

• 소프트웨어설계란?• 소프트웨어설계방법• 좋은설계를위해서는?• 설계요소• 고려사항• 설계예제 – 음료자동판매기• 맺는말

소프트웨어 설계란?

• 요구분석결과를사용하여소프트웨어속성, 성능등을가장잘실현할수있는알고리즘과관련자료구조의특성을찾아서명세화

• “무엇을”에서 “어떻게”로관점변경

소프트웨어 설계방법

• 구조적설계(structured design) – Yourdon▫ 시스템을기능적관점에서다룸▫ 하향적세분화

• 객체지향설계(object-oriented design) – Coad, ...▫ 자료및적용될연산기능을함께추상화▫ 시스템은객체의모임

• 자료구조중심설계 – Jackson, Warnier▫ 입출력자료의구조파악으로소프트웨어구조추출

좋은 설계를 위해서는?

• 능력과훈련이필요▫ 개념탑재▫ 창조성▫ 기술에대한이해▫ 경험▫ "좋은" 소프트웨어에대한감각▫ 품질에대한욕심▫ 많은고민

설계 요소 (1)

• 아키텍처설계▫ 구조설계 프로그램의구조 함수/모듈의정의, 데이터의흐름

▫ 자료설계 데이터베이스또는파일구조

▫ 결과물 시스템구조도(Structure Chart) 파일또는 DB 설계도(레코드레이아웃, ERD)

설계 요소 (2)

• 상세설계▫ 인터페이스설계 내부인터페이스/외부인터페이스/휴먼인터페이스

▫ 알고리즘설계 문제를해결하는절차

▫ 데이터구조설계 자료구조또는클래스/객체설계

▫ 결과물 프로그램사양서 화면및출력물의레이아웃

고려사항성질 의미

호환성(Compatibility) 다른종류의 SW나이전버전과함께동작함

확장성(Extensibility) 구조적변경없이새기능추가가능함

결함허용성(Fault-tolerance) 일부요소의오류에도제대로동작함

유지보수(Maintainability) 수정이나개선이용이함

재사용성(Reusability) 다른 SW나다음버전에다시 사용가능함

모듈성(Modularity) 각요소가독립적으로잘정의됨

신뢰성(Reliability) 정해진기간동안주어진조건에서요구되는기능을잘수행하며결과를믿을수있음

강건성(Robustness) 입력오류나예상치못한환경변화에도잘동작함

보안(Security) 악성공격을예방하고발생에대처함

성능(Performance) 시간요구사항을만족하며공간(memory) 활용좋음

이식성(Portability) 다른환경에쉽게설치할수있음

확대가능성(Scalability) 데이터나사용자수확대에대처함

예제 – 요구 기능• 기본기능(기능적요구)▫ 돈을넣는다▫ 음료의종류를선택한다▫ 음료가나온다▫ 거스름돈이나온다 (있을경우)

• 비기능적요구▫ 제한요소: 100원단위의입력만가능하다

▫ 제한요소: 음료수는한번에한개만선택할수있다

▫ 성능: 프로그램이시작하면명시적으로종료할때까지무한히반복하여동작한다

▫ 성능: 사용자행위시 1초이내반응있어야한다

▫ 성능: 사용자행위가있을때마다반응메시지출력

예제–요구사항 상세화/변경/확장

• 사용절차상세화▫ 선택가능한음료의종류와가격출력▫ 금액입력▫ 입력금액으로구매가능한음료를출력▫ 음료선택및출력▫ 거스름돈출력

예제–요구사항 상세화/변경/확장

• ‘금액입력’ 기능상세화▫ 입력할수있는돈의종류: 100원, 500원, 1000원▫ 같은종류의돈은여러개입력가능▫ 현재까지입력된금액표시▫ 충분한거스름돈이없을때미리경고메시지출력하고, 거스름돈이필요한금액이입력되면거부

예제–요구사항 상세화/변경/확장

• 관리자기능추가▫ 음료종류와가격의결정▫ 음료의재고관리 현재수량관리 주기적으로수량증가 – 채워넣기

▫ 매상관리기능 전체수입액관리 수금 거스름돈채우기 거스름돈(동전) 종류와금액관리

예제–요구사항 상세화/변경/확장

• 자판기동작오류의가능성흉내내는기능▫ x%의확률로돈을먹어버리는오류발생

– x는관리자가결정

예제 – 입출력 설계

• 요구사항분석 및시나리오에따라 UI 설계

특정한값을입력했을때예상출력값을설정

출력

입력

출력

자동판매기가작동을시작합니다.1. 관리자모드2. 사용자모드3. 전원끄기

3

사용해주셔서감사합니다.Bye~

관리자모드 – 초기화

출력

입력

입출

자동판매기가작동을시작합니다.1. 관리자모드2. 사용자모드3. 전원끄기

1

비밀번호입력: ****

출력 작업선택:1. 초기화2. 재고관리3. 매상관리4. 작업종료

입력 1

출력 초기화를시작합니다.판매할음료가지수?

입력 10

출력 음료이름과가격입력하세요.(10종류)가격은 100원단위만가능합니다.

입출 1번음료: 코카콜라 6002번음료: 밀키스 5003번음료: 커피 550(가격은 100원단위만가능)(다시입력하세요.)3번음료: 커피 500

. . .10번음료: 홍차 800

입력을종료합니다.

입출 비밀번호설정: ****비밀번호확인: ****초기화가완료되었습니다.

비밀번호설정된상태

비밀번호미설정된상태

관리자모드 – 재고관리

작업을 선택하세요.1. 초기화2. 재고 관리3. 매상 관리4. 고장확률 설정5. 작업 완료2

현재 재고수량입니다.코카콜라: 3밀키스: 18커피: 0…홍차: 10

기계에 넣을 음료의 수를 입력하세요.코카콜라(최대27): 3030개의 콜라를 넣을 수 없습니다.27이내로 입력해 주세요.코카콜라(최대27): 27밀키스(최대12): 12커피(최대30): 3939개의 콜라를 넣을 수 없습니다.30이내로 입력해 주세요.커피(최대30): 30…홍차(최대20): 20입력이 완료 되었습니다.감사합니다.

관리자모드 – 매상관리

작업을 선택하세요.1. 초기화2. 재고 관리3. 매상 관리4. 고장확률 설정5. 작업 완료3

현재 잔액입니다.100원: 53개 5300원500원: 25개 12500원1000원: 110개 110000원합계: 127800원총매상액: 259700원

무슨작업을 하시겠습니까?1. 수금2. 동전채우기3. 작업완료1

수금할 개수를 입력하세요. 100원: 53개 40500원: 25개 30너무 많습니다. 25 이하로 입력해주세요.500원: 25개 201000원: 110개 110총 129000원을 수금하셨습니다.현재 잔액입니다. 100원: 13개 1300원500원: 5개 2500원1000원: 0개0원합계: 3800원총매상액: 259700원

무슨작업을하시겠습니까?1. 수금2. 동전채우기3. 작업완료2(이하생략)

관리자모드 – 고장확률설정

작업을 선택하세요.1. 초기화2. 재고 관리3. 매상 관리4. 고장확률 설정5. 작업 완료4

고장확률은 0.1%~5%까지 0.1 단위로설정할 수 있습니다. 확률값을 입력하세요.0.5

이제 이 자판기는 0.5%의 확률로 동전을삼킵니다.수입이 조금 늘어나겠군요!(돌아가기)

0.1 ~ 1 : 수입이 조금 늘어나겠군요!1.1 ~ 2 : 이런 걸로 부자되고 싶냐?2.1~ 3 : 소문나면 손님 끊어질텐데……3.1 ~ 4 : 손님들이 발로 차서 부서질걸?4.1 ~ 5 : 도둑놈!! 사기꾼!! 기계 바꿔!!

사용자모드 – 정상상태

안녕하세요?1. 코카콜라 500원2. 밀키스 600원3. 커피 400원…10. 홍차800원

마음을 정하셨으면 돈을 투입하세요.화폐종류(100원:1, 500원:2, 1000원:3): 2개수: 1지금까지 500원을 투입하셨습니다.계속 투입하시겠습니까? (Y/N) y화폐종류(100원:1, 500원:2, 1000원:3): 1개수: 1지금까지 1500원을 투입하셨습니다.계속 투입하시겠습니까? (Y/N) n

음료수를 선택하세요.1. 코카콜라 500원2. 밀키스 600원3. 커피 400원…10. 홍차 800원음료수 번호: 2900원이 남았습니다.계속 선택하시겠습니까?(Y/N) y음료수 번호: 1400원이 남았습니다.계속 선택하시겠습니까?(Y/N) y음료수 번호: 1돈이 모자랍니다.계속 선택하시겠습니까?(Y/N) n밀키스와 코카콜라가 나왔습니다.거스름돈은 400원입니다.이용해주셔서 감사합니다.

이 단계에서 비밀번호를입력하면 관리자 모드로들어간다.

사용자모드 – 거스름돈부족상태

안녕하세요?1. 코카콜라 500원2. 밀키스 600원3. 커피 400원…10. 홍차800원

마음을 정하셨으면 돈을 투입하세요.현재 거스름돈이 충분하지 않습니다.화폐종류(100원:1, 500원:2, 1000원:3): 2개수: 1지금까지 500원을 투입하셨습니다.계속 투입하시겠습니까? (Y/N) y화폐종류(100원:1, 500원:2, 1000원:3): 1개수: 1지금까지 1500원을 투입하셨습니다.계속 투입하시겠습니까? (Y/N) n

음료수를 선택하세요.1. 코카콜라 500원2. 밀키스 600원3. 커피 400원…10. 홍차 800원음료수 번호: 2900원이 남았습니다.계속 선택하시겠습니까?(Y/N) n거스름 돈이 부족합니다.그래도 계속할까요?(Y/N) n1500원을 돌려 드립니다. 다음 기회에~

거스름 돈이 부족합니다.그래도 계속할까요?(Y/N) y밀키스가 나왔습니다.거스름돈은 제가…. 감사합니다.

사용자모드 – 동전꿀꺽

음료수를 선택하세요.1. 코카콜라 500원2. 밀키스 600원3. 커피 400원…10. 홍차 800원음료수 번호: 2900원이 남았습니다.계속 선택하시겠습니까?(Y/N) y음료수 번호: 1400원이 남았습니다.계속 선택하시겠습니까?(Y/N) y음료수 번호: 1

(1 ~ 2초 정지)

죄송하지만제가동전을꿀꺽했는데요.어떻게반응하시겠습니까?1. 포기하고돌아간다.2. 관리자가올때까지기다린다.3. 자판기를발로뻥찬다.

(입력에따라반응)

1. 처음 화면으로 돌아간다.2. 올바른 비밀번호를 입력할 때까지 안내메시

지를 반복 출력한다.3. 1) “쾅!” 메시지를 출력한다.

2-1) 동전을 꿀꺽하는 것과 같은 확률로 모든동전이 쏟아진다.

2-2) 동전이 안 나오면 “아얏!”을 출력한다.3) 처음 화면으로 돌아간다.

예제 – 데이터 구조설계

• 사용할데이터의형, 구조, 속성등을정의▫ 추상구조로표현: 자연언어/의사코드또는그림

음료N이름: 문자열가격: 정수개수: 정수K

음료2이름: 문자열가격: 정수개수: 정수K

음료1이름: 문자열가격: 정수개수: 정수K 음료종류: 정수N

상품

백원개수: 정수 돈

오백원개수: 정수

천원개수: 정수

총매상액: 정수

N의 최대값: 20K의 최대값: 30

자판기

예제 – 데이터 구조설계

음료N이름: 문자열가격: 정수개수: 정수K

음료2이름: 문자열가격: 정수개수: 정수K

음료1이름: 문자열가격: 정수개수: 정수K 음료종류: 정수N

상품

백원개수: 정수 돈

오백원개수: 정수

천원개수: 정수

총매상액: 정수

자판기

안녕하세요?1. 코카콜라 500원2. 밀키스 600원3. 커피 400원…10. 홍차800원

마음을 정하셨으면 돈을 투입하세요.화폐종류(100원:1, 500원:2, 1000원:3): 2개수: 1지금까지 500원을 투입하셨습니다.계속 투입하시겠습니까? (Y/N) n

데이터 모델과 뷰의 분리

예제 – 데이터 구조설계데이터 객체에 대한 기본 기능 설계

Bool initialize(void)초기화를 하고 결과를 반환한다.void manageStock(goods)재고 관리를 한다.void manageSales(money, sale)매상 관리를 한다.double setFaultRate(void)고장확률 설정을 한다.

Int setSortsOfDrinks(void)음료의 종류, 이름, 가격설정

자판기 상품

Drink createDrink(name, price)음료의 이름과 가격을 설정한다.void setQuantity(name, quantity)음료의 수량을 설정한다.void sellDrink(name, quantity) 음료를 판매한다.

Money createMoney(void)돈의 종류를 설정하고각 화폐의 개수 초기화void setQuantity(name, quantity)지정된 화폐의 수량을 설정한다.void collectMoney(name, quantity)지정된 화폐를 수금한다.intgetTotalSales(void)매상액을 알아본다.void setTotalSales(amount)매상액을 설정한다.

음료 돈

예제 – 절차 설계

시작

메인메뉴

관리자모드 사용자모드 전원끄기

종료

1 2 3

비밀번호입력

1단계

예제 – 절차 설계 2단계관리자모드

메뉴출력

매상관리재고관리초기화고장확률설정

작업종료

사용자모드

예제 – 절차 설계 3단계

function ManageSale ( Money money, Sale sale )현재 잔액(100원, 500원, 1000원) 출력

작업 메뉴(수금, 동전 채우기, 종료) 출력

num ← 작업 번호 입력

if (num = 1) then // 수금 기능 선택

while(모든 금액에 대해)money[n].num 출력

collect ← 수금 개수 입력

if (collect > money[n].num) then오류 처리

elsemoney[n].num ← money[n].num

– collectsale[m].amount ← sale[m].amount +

money[n].amount * collectend if. . .

end while. . .

end if. . .

end function

기능별알고리즘작성

예제 – 알고리즘 검증

• 설계한알고리즘에값을입력하여동작검증▫ 경계값이있으면반드시확인▫ 오류값을입력하여확인

변수 테스트값1 테스트값2 테스트값3

백원_개수 35 0 35

수금할_개수 20 0 40

오백원_개수 20 0 20

수금할_개수 10 0 25

천원_개수 12 0 12

수금할_개수 12 0 20

매상액 257000 0 257000

비고 정상범위 경계값 오류값

* 금액의 상한선은 없다고 가정함

예제 – 알고리즘 검증

• 테스트결과로부터설계변경사항고려▫ 경계값(0)으로설정되어있는경우, 수금할수없으므로바로다음단계로넘어간다.

• 테스트모듈을직접작성하여검증▫ 구현가능성과성능등을테스트하기위해직접코딩으로검증하기도함

예제 – 구조 설계

• 모듈설계▫ 프로그램의정적구조▫ 어느기능을어느모듈에배치할것인가

• 모듈간인터페이스설계▫ 프로그램의동적구조반영▫ 호출관계설정

main{

자판기를생성한다.메인메뉴를출력한다.선택에따라해당함수를호출한다.관리자모드에서돌아오면사용자모드를호출한다.전원끄기입력이들어오면적절한메시지를출력하고종료한다.

}

Manager{

주메뉴를출력한다.선택에따라해당함수를호출한다.작업완료를선택하면main으로돌아간다.

}

Client{

(사용자모드동작)}

initialize manageStock manageSale setFaultRate

updateStock updateMoney

맺는 말• 복잡하고큰소프트웨어일수록설계가중요!▫ 2인이상개발시구조와인터페이스설계중요

• 되도록추상적으로표현▫ 자연언어와의사코드▫ 특정프로그래밍언어에종속되지않도록▫ 기본방향은정하는편이좋다. (ex. 객체지향)

• 설계의 1시간이구현과테스트의 10시간을보상할수있다!!

• 프로그래밍의고수는설계의고수!▫ 연습과경험, 많은고민