7. 하위 설계 - gnudev.tnaru.com...상속(Inheritance) (1/2) 의미 - 다른 클래스의...

30
© 2008 Software Engineering 1 7. 하위 설계

Transcript of 7. 하위 설계 - gnudev.tnaru.com...상속(Inheritance) (1/2) 의미 - 다른 클래스의...

Page 1: 7. 하위 설계 - gnudev.tnaru.com...상속(Inheritance) (1/2) 의미 - 다른 클래스의 속성을 물려받아 내 것처럼 쓰는 것 상위 클래스(Super-class) - 바퀴가

© 2008 Software Engineering 1

7. 하위 설계

Page 2: 7. 하위 설계 - gnudev.tnaru.com...상속(Inheritance) (1/2) 의미 - 다른 클래스의 속성을 물려받아 내 것처럼 쓰는 것 상위 클래스(Super-class) - 바퀴가

© 2008 Software Engineering 2

주요내용

효과적인 모듈 설계는 어떠해야 하는가?

객체지향 설계란 무엇인가?

알고리즘 설계 표현은 어떻게 하는가?

Page 3: 7. 하위 설계 - gnudev.tnaru.com...상속(Inheritance) (1/2) 의미 - 다른 클래스의 속성을 물려받아 내 것처럼 쓰는 것 상위 클래스(Super-class) - 바퀴가

© 2008 Software Engineering 3

목차

강의 내용

- 효과적인 모듈 설계

- 객체지향의 개념

- 알고리즘 설계

팀 프로젝트 (11주차)

- 설계 문서 작성 및 제출

Page 4: 7. 하위 설계 - gnudev.tnaru.com...상속(Inheritance) (1/2) 의미 - 다른 클래스의 속성을 물려받아 내 것처럼 쓰는 것 상위 클래스(Super-class) - 바퀴가

© 2008 Software Engineering 4

하위 설계 (Revisited)

하위 설계(Low-Level Design)

- 의미

• 모듈 설계(Module Design), 상세 설계 (Detail Design)이라고 함 • 시스템의 각 구성 요소들의 내부 구조, 동적 행위 등을 결정 • 각 구성 요소의 제어와 데이터들간의 연결에 대한 구체적인 정의를 하는 것

- 하위 설계 방법

• 절차기반(Procedure-Oriented) • 자료위주(Data-Oriented) • 객체지향(Object-Oriented) 설계 방법

컴포넌트 설계

알고리즘 설계

하위설계

자료구조 설계

Page 5: 7. 하위 설계 - gnudev.tnaru.com...상속(Inheritance) (1/2) 의미 - 다른 클래스의 속성을 물려받아 내 것처럼 쓰는 것 상위 클래스(Super-class) - 바퀴가

© 2008 Software Engineering 5

객체지향(Object-Oriented) 개념

Page 6: 7. 하위 설계 - gnudev.tnaru.com...상속(Inheritance) (1/2) 의미 - 다른 클래스의 속성을 물려받아 내 것처럼 쓰는 것 상위 클래스(Super-class) - 바퀴가

© 2008 Software Engineering 6

객체지향

객체지향의 등장 배경

- 기존의 구조적 기법으로 유지보수가 어렵다는 단점을 극복하기 위해 등장

객체란?

- 특성(Attribute)와 행위(Behavior)를 가지고 있는 인지할 수 있는 개체(Entity)

• 특성 해당 객체에 저장되어 있는 데이터

• 행위 객체가 할 수 있는 일, 객체의 상태가 변하게 하는 원인을 제공

- 다른 객체와 구별할 수 있는 정체성(identity)을 가짐

• 정체성 해당 객체를 다른 개체와 구별 할 수 있는 식별 값

객체의 예: 차

- 특성: 검정색 차체, 6기통 엔진, 자동 변속기, 4개의 바퀴 등

- 행위: 출발하다, 정지하다, 가속하다, 감속하다 등

- 정체정: 차량 번호

Page 7: 7. 하위 설계 - gnudev.tnaru.com...상속(Inheritance) (1/2) 의미 - 다른 클래스의 속성을 물려받아 내 것처럼 쓰는 것 상위 클래스(Super-class) - 바퀴가

© 2008 Software Engineering 7

클래스와 객체

클래스(Class)

- 여러 객체들을 위한 대표적 구조

- 객체들이 내부적으로 어떻게 구성되어 있는지 설명

- 객체의 특성은 클래스의 변수로, 행위는 메소드로 표현됨

객체(Object)

- 클래스의 실례 또는 실체(Instance)라고도 부름

• 객체가 클래스에서 정의하는 변수, 메소드를 그대로 가지면서 메모리에 할당되기 때문

- 각 객체 내부의 변수 이름은 같지만 서로 독립적임

public class Car { … String carName; //차 이름 Int carNumber; //차 번호 … }

Car myCar = new Car();

클래스

객체

Page 8: 7. 하위 설계 - gnudev.tnaru.com...상속(Inheritance) (1/2) 의미 - 다른 클래스의 속성을 물려받아 내 것처럼 쓰는 것 상위 클래스(Super-class) - 바퀴가

© 2008 Software Engineering 8

객체지향 방법의 특징

절차를 강조하는 구조적 방법

- 데이터를 소홀히 하게 됨

객체지향 방법

- 시스템을 구성하는 요소들은 객체로,

- 시스템 개발의 복잡한 문제들을

• 캡슐화(Encapsulation),

• 상속(Inheritance),

• 다형성(Polymorphism) 개념으로 해결하려 함

Page 9: 7. 하위 설계 - gnudev.tnaru.com...상속(Inheritance) (1/2) 의미 - 다른 클래스의 속성을 물려받아 내 것처럼 쓰는 것 상위 클래스(Super-class) - 바퀴가

© 2008 Software Engineering 9

캡슐화(Encapsulation) (1/2)

의미

- 소프트웨어 모듈인 객체의 내부에 가진 상세한 정보와 처리 방식을 외부로부터

감추는 것

- 객체의 추상화를 통해 독립성을 보장해 주는 개념

Page 10: 7. 하위 설계 - gnudev.tnaru.com...상속(Inheritance) (1/2) 의미 - 다른 클래스의 속성을 물려받아 내 것처럼 쓰는 것 상위 클래스(Super-class) - 바퀴가

© 2008 Software Engineering 10

캡슐화(Encapsulation) (2/2)

캡슐화의 예

class Car { … private String carName; //차 이름 private Int carNumber; //차 번호 public String getCarName() // 차 이름 반환 { return carName; } public Int getCarNumber() // 차 번호 반환 { return carNumber; } … }

public 이용 외부에 공개

private 이용 외부에 감춤

Page 11: 7. 하위 설계 - gnudev.tnaru.com...상속(Inheritance) (1/2) 의미 - 다른 클래스의 속성을 물려받아 내 것처럼 쓰는 것 상위 클래스(Super-class) - 바퀴가

© 2008 Software Engineering 11

상속(Inheritance) (1/2)

의미

- 다른 클래스의 속성을 물려받아 내 것처럼 쓰는 것

상위 클래스(Super-class) - 바퀴가 굴러서 나아감 - 사람이나 짐을 실어 옮기는 기관

하위클래스(Sub-class) - 각각의 구체적인 기능

Page 12: 7. 하위 설계 - gnudev.tnaru.com...상속(Inheritance) (1/2) 의미 - 다른 클래스의 속성을 물려받아 내 것처럼 쓰는 것 상위 클래스(Super-class) - 바퀴가

© 2008 Software Engineering 12

상속(Inheritance) (1/2)

상속의 예

class Car { … String carName; //차 이름 Int carNumber; //차 번호 … }

class Bus extends Car{ … int seatCount; //좌석 수 … }

상위클래스

하위클래스

Page 13: 7. 하위 설계 - gnudev.tnaru.com...상속(Inheritance) (1/2) 의미 - 다른 클래스의 속성을 물려받아 내 것처럼 쓰는 것 상위 클래스(Super-class) - 바퀴가

© 2008 Software Engineering 13

다형성(Polymorphism)

의미

- 하나의 인터페이스를 통해 서로 다른 구현을 제공하는 것

Different objects

Text doc Graphic doc

Same message:

print

Page 14: 7. 하위 설계 - gnudev.tnaru.com...상속(Inheritance) (1/2) 의미 - 다른 클래스의 속성을 물려받아 내 것처럼 쓰는 것 상위 클래스(Super-class) - 바퀴가

© 2008 Software Engineering 14

알고리즘 설계

Page 15: 7. 하위 설계 - gnudev.tnaru.com...상속(Inheritance) (1/2) 의미 - 다른 클래스의 속성을 물려받아 내 것처럼 쓰는 것 상위 클래스(Super-class) - 바퀴가

프로그램을 작성하기 이전에 알고리즘 작성은 필수 요건이다.

알고리즘은 모듈의 명세서에 해당한다. • 모듈의 세부처리 기능을 기술한 내역

• 시스템 구조도의 박스에 표현되지 않은 자세한 알고리즘을 기술

• 모듈의 내부 자료에 대한 설명을 포함

• 프로그램 구조도와 함께 시스템의 동작 상태를 예측할 수 있는 근거 제공

알고리즘(프로그램) 설계 (1/2)

소수확인

숫자 결과 Module 소수 확인(숫자, 결과) 내부자료: .... 처리기능: 숫자보다 작은 이미 구한 모든 소수로 나누어 나머지가 0이 아니면 결과는 소수이다.

Page 16: 7. 하위 설계 - gnudev.tnaru.com...상속(Inheritance) (1/2) 의미 - 다른 클래스의 속성을 물려받아 내 것처럼 쓰는 것 상위 클래스(Super-class) - 바퀴가

상세 설계의 표현 • 설계의 표현과 코딩이 용이해야 할 것

• 수행이 가능해야 할 것

• 유지보수가 용이해야 할 것

상세 설계의 표현 • 흐름도(flow chart)

• N-S 도표(Nassi-Schneiderman Chart) // 나씨-슈나이더 도표

• 의사 코드(pseudo code)

• 의사 결정표(decision table)

• 의사 결정도(decision diagram)

• PDL(Program Design Language)

• 상태천이도(state transition diagram)

• 행위도(action diagram)

알고리즘(프로그램) 설계 (2/2)

Page 17: 7. 하위 설계 - gnudev.tnaru.com...상속(Inheritance) (1/2) 의미 - 다른 클래스의 속성을 물려받아 내 것처럼 쓰는 것 상위 클래스(Super-class) - 바퀴가

정확성 • 모듈이 정확하게 수행되지 않는 조건을 점검

• 예: 음수, 0, 경계 값 입력 예외 조건에 대해서 잘 처리해야 함

• 재사용 증명된 알고리즘을 활용하고, 이미 있는 모듈은 그냥 가져다 쓴다.

효율성 • 기억 공간 최소화 최근 들어서는 일반적으로 큰 문제가 되지는 않는다.

• 처리 소요 시간 최소화

• 예: 1에서 N까지의 합

알고리즘의 선택 기준 (1/4)

1

n

ii

=∑

<방법 1>

SeriesSum = 0

for Counter = 1 to N do

SeriesSum = SeriesSum + Counter

write "The sum is", SeriesSum

<방법 2>

SeriesSum = (1.0 + N)*(N/2.0)

write "The sum is", SeriesSum

( )O N(1)O

Page 18: 7. 하위 설계 - gnudev.tnaru.com...상속(Inheritance) (1/2) 의미 - 다른 클래스의 속성을 물려받아 내 것처럼 쓰는 것 상위 클래스(Super-class) - 바퀴가

효율성 (계속)

알고리즘의 선택 기준 (2/4)

복잡도가 높은 경우(N3 이상, 특히 exponential인 경우) 휴리스틱을 많이 사용함 대표적 휴리스틱 방법: Greedy Algorithm

분석 방법 이름 입력 개수

1 10 100 1,000 10,000

1 Constant 1 1 1 1 1

log N Logarithmic 1 4 7 10 14

N Linear 1 10 100 1,000 10,000

N log N N log N 1 40 700 10,000 140,000

N2 Quadratic 1 100 10,000 1,000,000 100,000,000

N3 Cubic 1 1,000 1,000,000 1,000,000,000 1012

2n Exponential 2 1,024 1.27 x 1030 1.07 x 10301 1.99 x 103010

Page 19: 7. 하위 설계 - gnudev.tnaru.com...상속(Inheritance) (1/2) 의미 - 다른 클래스의 속성을 물려받아 내 것처럼 쓰는 것 상위 클래스(Super-class) - 바퀴가

외판원 문제(TSP: Traveling Salesman Problem) 문제 정의

• N개의 도시(C1, C2, … CN)와 두 도시 i와 j 사이의 거리 dij가 주어졌을 때, 모든 도시를 한번씩 방문해야 하는 외판원이 다리 품을 가장 적게 파는 경로(shortest tour)는?

경로의 가짓수 계산 • 첫 번째 도시를 선택할 수 있는 가짓수: N가지

• 두 번째 도시를 선택할 수 있는 가짓수: (N-1)가지

• … 경로의 가짓수 = N(N-1)(N-2)…(2)(1) = N!

TSP를 풀기 위해 얼마나 걸리는가? • 하나의 경로 계산을 위해 1 ns가 걸린다고 가정 (1 GHz 1 flop/1 ns)

• N=10: 3,628,800 ns = 0.0036288 sec.

• N=50: 3.02 x 1064 ns = 3.02 x 1055 seconds = 3.50 x 1050 days = 9.59 x 1047 years 해결할 수 있는 방법은? (Refer to http://www.tsp.gatech.edu//index.html)

56

32

51

62

115

73

108 49

89 94

알고리즘의 선택 기준 (3/4)

Page 20: 7. 하위 설계 - gnudev.tnaru.com...상속(Inheritance) (1/2) 의미 - 다른 클래스의 속성을 물려받아 내 것처럼 쓰는 것 상위 클래스(Super-class) - 바퀴가

적합성

• 알고리즘이 주어진 문제를 정확히 기술하였는가?

• 입력은 sequential file인데, 알고리즘은 random access file을 가정하면 되겠나요?

알고리즘의 선택 기준 (4/4)

Page 21: 7. 하위 설계 - gnudev.tnaru.com...상속(Inheritance) (1/2) 의미 - 다른 클래스의 속성을 물려받아 내 것처럼 쓰는 것 상위 클래스(Super-class) - 바퀴가

표현하기 쉽다.

BUT, 제어 흐름이 구조적이 되지 못해서 코드가 엉키는, 이른바 스파게티 코드가 되기 쉽다.

현재는 거의 사용하지 않는다.

프로그래밍을 배우는 초기 단계에 활용되곤 한다.

알고리즘 표현 – 흐름도(or 순서도)

순서도 그리는 법, http://m.blog.naver.com/mdown/220162562200

Page 22: 7. 하위 설계 - gnudev.tnaru.com...상속(Inheritance) (1/2) 의미 - 다른 클래스의 속성을 물려받아 내 것처럼 쓰는 것 상위 클래스(Super-class) - 바퀴가

일반적으로 가장 많이 사용하는 방법이다.

- “자바로 쓴 알고리즘”,

- “C로 쓴 알고리즘”,

- “Pascal로 쓴 알고리즘” 등이 이 범주에 해당한다고 볼 수 있다.

모듈의 입출력 자료, 내부 자료, 수행 절차 등을 알고리즘의 형태로 기술

실제 프로그램과 유사하나 특정 프로그래밍 언어에는 독립적임

- 전문적 용어의 사용은 가능함

- 프로그래머의 고유한 스타일이나 특성이 무시될 수 있음

의사 코드를 쓰는 방식이 다를 수 있으므로 한 프로젝트 안에서 표준을 만들 필요가 있음

알고리즘 표현 – 의사 코드 (1/5)

Page 23: 7. 하위 설계 - gnudev.tnaru.com...상속(Inheritance) (1/2) 의미 - 다른 클래스의 속성을 물려받아 내 것처럼 쓰는 것 상위 클래스(Super-class) - 바퀴가

알고리즘 표현 – 의사 코드 (2/5)

http://www.cs.ubbcluj.ro/~dana/2013-2014/DSA/Notes/1-Conventions.pdf

Page 24: 7. 하위 설계 - gnudev.tnaru.com...상속(Inheritance) (1/2) 의미 - 다른 클래스의 속성을 물려받아 내 것처럼 쓰는 것 상위 클래스(Super-class) - 바퀴가

의사 코드 사례

주급계산

고용자레코드 주급총액 고용자 레코드 = 급여형태 + 성명 + 주간근무시간

급여형태 = [1|2|3]

Module 주급계산(고용자 레코드; 주급총액) Assume 1<급여형태<3 0<주간 근무 시간<100 End Assume Define Rate: Real /* 시간 당 급료 */ End Define If (급여형태=1) Then Rate=4.2 Elseif (급여 형태=2) Then Rate=6.0 Else Rate=9.0 Endif Select Using (주간근무시간) From Case (1-40): 주급총액=주간근무시간*Rate Case (41-50): 주급총액=(주간근무시간*Rate)*0.5 Case (51-99): 주급총액=(주간근무시간*Rate)*1.0 Endselect End Module

알고리즘 표현 – 의사 코드 (4/5)

Page 25: 7. 하위 설계 - gnudev.tnaru.com...상속(Inheritance) (1/2) 의미 - 다른 클래스의 속성을 물려받아 내 것처럼 쓰는 것 상위 클래스(Super-class) - 바퀴가

Example (https://en.wikipedia.org/wiki/Breadth-first_search)

Breadth-First-Search(Graph, root): for each node n in Graph: n.distance = INFINITY n.parent = NIL create empty queue Q root.distance = 0 Q.enqueue(root) while Q is not empty: current = Q.dequeue() for each node n that is adjacent to current: if n.distance == INFINITY: n.distance = current.distance + 1 n.parent = current Q.enqueue(n)

알고리즘 표현 – 의사 코드 (5/5)

Input: A graph Graph and a starting vertex root of Graph Output: All vertices reachable from root labeled as explored. A non-recursive implementation of breadth-first search:

Page 26: 7. 하위 설계 - gnudev.tnaru.com...상속(Inheritance) (1/2) 의미 - 다른 클래스의 속성을 물려받아 내 것처럼 쓰는 것 상위 클래스(Super-class) - 바퀴가

요구 분석에서의 구조적 언어 vs. 의사 코드

특성 구조적 언어 의사 코드

논리 구조

동일한 논리 구조 사용

순차 (sequence)

선택 (selection)

반복 (iteration)

사용 단계 요구분석 단계 설계 단계

명세 대상 자료 흐름도 상의 최소 단위로 사용 설계 구조도 상의 모든 모듈

명세 방법 사용자 중심 프로그래머 중심

상세 정도 처리의 기본적인 기능 수행 절차 모듈의 기본적인 기능 수행 절차 및 세부

적 방법

알고리즘 표현 – 의사 코드 (3/5)

Page 27: 7. 하위 설계 - gnudev.tnaru.com...상속(Inheritance) (1/2) 의미 - 다른 클래스의 속성을 물려받아 내 것처럼 쓰는 것 상위 클래스(Super-class) - 바퀴가

논리 기술의 기본 형태인 순차, 선택, 반복을 박스로 표현

알고리즘 표현 – NS 도표 (1/4)

a. 순차 b. 선택(if-then-else)

action A

action B action A action B

Decision T F

c. 선택(if-then) d. 다중선택(case)

e. 반복(while) f. 반복(repeat-until)

Decision T F

action A

action A

action A

action A action B action C action D action E

Value 1 Value 2 Value 3 Value 4 Value 5

Selector

Condition

Condition

Page 28: 7. 하위 설계 - gnudev.tnaru.com...상속(Inheritance) (1/2) 의미 - 다른 클래스의 속성을 물려받아 내 것처럼 쓰는 것 상위 클래스(Super-class) - 바퀴가

NS 도표의 표현 규칙

• 도표는 항상 사각형

• 도표의 제어 흐름은 위에서 아래로

• 수평으로 그어진 줄은 항상 평행

• 빈 박스 – null statement

• 모든 사각형은 다시 하나의 NS 도표

알고리즘 표현 – NS 도표 (2/4)

Page 29: 7. 하위 설계 - gnudev.tnaru.com...상속(Inheritance) (1/2) 의미 - 다른 클래스의 속성을 물려받아 내 것처럼 쓰는 것 상위 클래스(Super-class) - 바퀴가

NS 도표의 예 (잡지 구독 시스템의 구독 레코드 처리)

While there are records in the correspondence file

Read next correspondence

Check general format

T Errors F

Write error message

Transaction type

New subscription Renewal Cancellation Other

Call Handle New Subscription

Pull sibactiber’s record

Pull sibactiber’s record

Update expire date

Calculate amount of refund

Call update Account

Call update Account

Print error message

알고리즘 표현 – NS 도표 (3/4)

Page 30: 7. 하위 설계 - gnudev.tnaru.com...상속(Inheritance) (1/2) 의미 - 다른 클래스의 속성을 물려받아 내 것처럼 쓰는 것 상위 클래스(Super-class) - 바퀴가

NS 도표의 장점

• 구조적 프로그램

• 배우기 쉽고, 읽기 쉬우며 원시 코드로 전환이 쉬움

• 프로그램의 구조를 쉽게 파악할 수 있다

• 프로그램의 복잡도, 제어구조를 한 눈에 볼 수 있다.

NS 도표의 단점

• 도표를 그려야 하는 불편함

• 수정이 용이하지 않음

알고리즘 표현 – NS 도표 (4/4)