소프트웨어 공학 lecture #6: 객체지향 설계

52
소소소소소 소소 Lecture #6: 소소소소 소소 소 소 소 [email protected] 소소 소소소 Mobilecom.tistory.com

Upload: kamin

Post on 24-Feb-2016

350 views

Category:

Documents


7 download

DESCRIPTION

소프트웨어 공학 Lecture #6: 객체지향 설계. 안 병 익 [email protected] 강의 블로그 Mobilecom.tistory.com. 학습 목표. 객체지향 분석과 설계 객체지향 개념 UML 2.0 다이어그램 정적 모델링 동적 모델링 디자인 패턴. 객체지향 기술. 절차적인 방법은 조그만 변화에도 영향이 큼 함수와 자료를 함께 클래스로 묶음으로 여러 가지 장점을 얻을 수 있음 장점 추상화 , 정보은닉 등 설계 원리에 충실 복잡함을 잘 다룰 수 있음 특징 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 소프트웨어 공학 Lecture #6:  객체지향 설계

소프트웨어 공학

Lecture #6: 객체지향 설계

안 병 익[email protected]

강의 블로그 Mobilecom.tistory.com

Page 2: 소프트웨어 공학 Lecture #6:  객체지향 설계

학습 목표

2

객체지향 분석과 설계

객체지향 개념

UML 2.0 다이어그램

정적 모델링

동적 모델링

디자인 패턴

Page 3: 소프트웨어 공학 Lecture #6:  객체지향 설계

객체지향 기술

절차적인 방법은 조그만 변화에도 영향이 큼

함수와 자료를 함께 클래스로 묶음으로 여러 가지 장점을 얻을 수 있음

장점 추상화 , 정보은닉 등 설계 원리에 충실 복잡함을 잘 다룰 수 있음

특징 유사성을 이용하는 방법을 제공 뚜렷하게 구별되는 단위로 분할 코드 재사용에 의하여 생산성을 높임 빠른 속도로 적용 , 산업계 표준화

3

Page 4: 소프트웨어 공학 Lecture #6:  객체지향 설계

6.1 객체지향 분석과 설계

명확히 나누기 어려움 공통의 개념을 사용 반복적인 싸이클로 완성

분석은 문제 영역 , 설계는 솔루션 영역을 다룸

4

Page 5: 소프트웨어 공학 Lecture #6:  객체지향 설계

객체지향 모델

여러 가지 관점에서 시스템을 모델링

객체지향에서는 크게 세 가지 관점의 모델을 작성

5

Page 6: 소프트웨어 공학 Lecture #6:  객체지향 설계

객체지향 분석 설계 과정

뚜렷한 표준 프로세스는 없음

사용사례는 맨 처음 , 최종 목표는 클래스 다이어그램

6

Page 7: 소프트웨어 공학 Lecture #6:  객체지향 설계

6.2 객체지향 개념

재래식 방법 기능중심 , 변경의 파급효과 큼

객체 지향 방법 자료와 관련 함수의 결합

프로그램 = 자료구조 + 함수

자 료

함수 1 함수 2 함수 3

프로그램 = 자료구조 + 함수

프로그램 = 객 체 + 객 체

자료함 수

자료함 수

자료함 수

자료함 수

7

Page 8: 소프트웨어 공학 Lecture #6:  객체지향 설계

객 체

객체의 정의 소프트웨어 모듈 ( 객체 ) = 자료구조 + 함수

객체는 상태 (state), 능력 (behavior), 정체성 (identity) 을 가진다 . 상태 능력 : 연산 (operation) 을 수행 할 수 있는 능력 정체성 : 구별 가능성

객체 인스턴스 (instance) = 객체

비슷한 객체의 구조와 행동은 공통 클래스로 선언

8

Page 9: 소프트웨어 공학 Lecture #6:  객체지향 설계

클래스 (Class)

클래스 (class) vs 인스턴스 (instance) 클래스 : 객체의 타입 (object type) 인스턴스 : 클래스에 속하는 개개의 객체

클래스의 속성 (attribute) 예 : 직원 클래스

• 속성 : 이름 , 직위 , 월급 , 전화 번호 등 • 함수 : 진급 , 월급 인상 , 전화 변경 등

클래스는 객체들이 갖는 속성과 적용 연산을 정의하고 있는 틀 (templet) Employee Hong_kildong(); Employee* Hone_kildong = new Emplyoee();

직원클래스

홍길동 객체

9

Page 10: 소프트웨어 공학 Lecture #6:  객체지향 설계

캡슐화 (Encapsulation) 캡슐화의 정의

관련된 항목을 모아서 갭슐을 씌움• 예 > 학사 관리 시스템• 데이터 : 학번 , 이름 , 주소 캡슐화• 함수 : 평점 계산 , 주소 변경 , 수강 신청 캡슐화

추상화의 수단 세부사항은 차후에 생각

정보은닉 (information hiding) 외부의 직접적 접근 불가 , 일종의 블랙박스

구현에 따라 선택 가능 문법 : public, private, protected

10

Page 11: 소프트웨어 공학 Lecture #6:  객체지향 설계

객체 사이의 관계

객체는 일반적으로 상호작용하여 동작 객체에 있는 서비스를 호출하면 두 객체는 관계가 맺어져야 함 상호작용할 필요가 있는지 찾아내는 작업이 필요

연관 서로 상대의 존재를 알 수 있도록 관련이 맺어진 것 예 ) 책과 출판사

서로 알게하고 접근 가능하게 하는 방법은 여러 가지가 있음집합 관계

전체 개념과 부분 개념 사이의 관계 격납의 의미 예 ) 디스크 트랙 섹터11

Publisher Book1 *

Page 12: 소프트웨어 공학 Lecture #6:  객체지향 설계

상속 (inheritance) 상속의 의미

상위 클래스의 속성과 연산을 물려 받음 슈퍼클래스 (superclass), 서브 클래스 (subclass)

예 > 직원 : 슈퍼클래스 , 관리자 : 서브클래스 복수상속 (multiple inheritance)

두개 이상의 수퍼클래스에서 상속 받음

인사대상

교 수학 생

대학원생학부생

직 원

12

Page 13: 소프트웨어 공학 Lecture #6:  객체지향 설계

다형성 (polymorphism) 다형성의 정의

여러 형태를 가지고 있다 (= 여러 형태를 받아들일 수 있다 )

같은 이름의 메시지를 다른 객체 or 서브클래스에서 호출 예 > getarea() 를 도형의 모양이 달라도 호출

메소드 : 특정한 클래스를 위하여 오퍼레이션을 구현

하나 이상의 메소드를 가진 오퍼레이션 매개변수나 객체가 속한 클래스의 이름으로 구분

13

Page 14: 소프트웨어 공학 Lecture #6:  객체지향 설계

다형성 (polymorphism) 현재 코드를 변경하지 않고 새로운 클래스를 쉽게 추가할 수 있음

PolygonArea

getarea()

Circle

getarea()

Rectangle

getarea()

다형성의 예14

Page 15: 소프트웨어 공학 Lecture #6:  객체지향 설계

6.3 UML 이란 ? 객체지향 소프트웨어를 모델링 하는 표준 그래픽 언어

시스템의 여러 측면을 그림으로 모델링 하드웨어의 회로도 같은 의미

역사 1980년대 말부터 1990년대 초에 객체지향으로 모델링 하는 과정과 모델링 언어 출현 설계와 표현 방법의 급증으로 혼란을 초래 Rumbaugh 와 Booch 가 1994년 두 가지 방법을 합병하기로 함

• Rational Software 라는 회사 설립 1995년 Jacobson 이 팀에 합류

• 사용 사례를 제안 1997년 Object Management Group(OMG) 이 UML 표준화 추진

15

Page 16: 소프트웨어 공학 Lecture #6:  객체지향 설계

UML 의 배경과 역사

Shlaer 와 Mellor 가 제안한 반복적 설계 방법

Coad 와 Yourdon 이 제안한 프로토타입 중심 방법

Worfs-Brock 등 폴랜드의 Smalltalk 그룹이 제안한 의무 중심 설계 및

CRC(Class-Responsibility-Collaboration) 카드 방법

Rational Software 의 Booch 가 제안한 Ada 설계 방법

GE 연구소의 Rumbaugh 가 중심이 되어 제안한 OMT Odell 과 Martin 의 정보공학을 기초로 한 방법

Ericsson 에서 일한 Jacobson 의 use case 개념을 소개한 방법

16

Page 17: 소프트웨어 공학 Lecture #6:  객체지향 설계

UML 다이어그램

다이어그램 이름 개략적인 모양 설 명

사용 사례 (use case) 다이어그램

액터와 사용 사례를 이용하여 시스템의 기능을 모델링

클래스 다이어그램

객체지향 시스템의 가장 근간이 되는 다이어그램으로 시스템의 정적인 구조를 나타냄

패키지 다이어그램

관련된 클래스를 패키지로 그루핑 하여 의존도를 낮추기 위하여 사용

17

Page 18: 소프트웨어 공학 Lecture #6:  객체지향 설계

UML 다이어그램

다이어그램 이름 개략적인 모양 설 명

순차 (sequence) 다이어그램

클래스 사이의 메시지 교환을 시간이 흐름에 따라 나타냄

협동 다이어그램

순차 다이어그램과 같은 내용을 나타내지만 모양이 네트워크 형태임

상태 다이어그램

외부 자극에 대한 시스템의 동적 상태 변화를 나타냄 . 외부 이벤트에 대하여 민감하게 상태를 변화시키는 객체를 모델링

18

Page 19: 소프트웨어 공학 Lecture #6:  객체지향 설계

UML 다이어그램

다이어그램 이름 개략적인 모양 설 명

액티비티(activity) 다이어그램

액티비티 단계별로 제어라는 흐름을 모델링 하여 시스템의 동적 특징을 나타냄

컴포넌트 다이어그램

소프트웨어 부품 , 예를 들면 원시코드 , 헌 타임 라이브러리 , 실행 파일 등의 구성을 나타냄

배치 다이어그램

노드 , 컴포넌트 , 커넥터 등 시스템의 물리적 자원 배치를 나타냄

19

Page 20: 소프트웨어 공학 Lecture #6:  객체지향 설계

6.4 정적 모델링

정적 모델 시간의 개념이 개입되지 않은 모델 클래스 다이어그램이 대표적

클래스 다이어그램 객체 , 클래스 , 속성 , 오퍼레이션 , 연관 등을 표현

20

Page 21: 소프트웨어 공학 Lecture #6:  객체지향 설계

클래스 , 속성 , 오퍼레이션의 표현

박스 위에 클래스 이름 추상 클래스는 이탤릭체 인터페이스 클래스는 <<interface>>

추가

속성 객체가 가지는 모든 필드를 포함

오퍼레이션 / 메소드 아주 흔한 메소드 (get/set) 는 생략 상속된 메소드도 포함할 필요 없음

21

Page 22: 소프트웨어 공학 Lecture #6:  객체지향 설계

클래스 사이의 관계

연관 (association): 객체 사이에 관련 예 ) Customer 객체가 Rental 객체에 대여 정보 문의

집합 (aggregation): 어떤 클래스가 다른 클래스의 모임으로 구성 합성 (composition): 포함된 클래스가 컨테이너 클래스가 없이는

존재할 수 없는 집합관계의 변형

일반화 (generalization): 상속 (isa) 관계 클래스 사이의 상속 인터페이스 구현

22

Page 23: 소프트웨어 공학 Lecture #6:  객체지향 설계

연관 관계

연관 (association): 어떤 클래스의 인스턴스가 작업을 수행하기 위하여 다른 클래스를 알아야 하는 함

1. 다중도 (multiplicity)• * 0, 1, or more• 1 정확히 1 개• 2..4 2 개 내지 4 개 • 3.. * 3 개 이상

2. 이름 – 객체들의 관계 이름 3. 방향성 (navigability) – 질의의 방향 , 객체 사이의 선으로 표시하며 양쪽 방향인

경우는 화살표시 없음

23

Page 24: 소프트웨어 공학 Lecture #6:  객체지향 설계

연관 관계의 다중도

1 대 1 학생 1 명이 학생증 (id card) 한 개만을 가진다 .

1 대 다 학생 1 명이 여러 클래스를 수강할 수 있다 .

24

Page 25: 소프트웨어 공학 Lecture #6:  객체지향 설계

집합과 합성

영화관이 없어지면 매표소도 없어짐 합성 그러나 영화는 아직 존재 집합

25

Page 26: 소프트웨어 공학 Lecture #6:  객체지향 설계

일반화 관계

일반화 ( 상속 ) 부모를 향한 화살표로 표시되는 하향

계층 관계 선 / 화살표는 부모 클래스의 종류에

따라 다름클래스 : 실선 /검은 헤드 화살표추상 클래스 : 실선 /흰 헤드 화살표인터페이스 : 점선 /흰 헤드 화살표

26

Page 27: 소프트웨어 공학 Lecture #6:  객체지향 설계

클래스 찾기

정적 모델링 사용사례를 작성하여 도메인 분석이 어느 정도 된 후 객체를 찾고 관계를

정의하는 작업

클래스가 될 수 있는 요소들- 구조 - 외부 시스템- 디바이스 - 역할- 운용절차 - 장소- 조직 - 완성된 시스템에 의하여 조작되어야 할 정보

클래스 후보의 세가지 유형 엔티티 클래스 경계 클래스 제어 클래스

27

Page 28: 소프트웨어 공학 Lecture #6:  객체지향 설계

엔티티 클래스

엔티티 클래스 시스템에서 계속 추적해야 할 자료가 들어 있는 클래스

엔티티 클래스를 발견하는 휴리스틱 사용사례를 이해하기 위하여 사용자와 개발자가 명확히 규정된 용어

사용사례에서 반복되어 나오는 용어

시스템이 계속 추적하여야 하는 실세계의 엔티티

자료저장소 또는 단말

자주 사용하는 응용 도메인의 용어

28

Page 29: 소프트웨어 공학 Lecture #6:  객체지향 설계

경계 클래스

시스템 외부의 액터와 상호 작용하는 클래스로사용자 인터페이스를 제어하는 역할

액터와 연결된 시스템의 인터페이스 표현

사용자 인터페이스를 개괄적으로 모형화

29

Page 30: 소프트웨어 공학 Lecture #6:  객체지향 설계

제어 클래스

경계 클래스와 엔티티 클래스 사이에 중간 역할

사용 사례의 초기에 생성되고 끝까지 존재

경계 클래스로부터 정보를 받아 엔티티 클래스에 전달 예 ) 양식의 순서 , undo, 히스토리 저장 큐 등

자료를 다른 클래스로부터 받아 처리하는 것이 주임무인 클래스

30

Page 31: 소프트웨어 공학 Lecture #6:  객체지향 설계

연관 관계

두 개 이상의 클래스 사이에 어떤 관계가 있음을 표현

연관관계의 속성 이름 : 두 클래스 사이의 연관관계 표현 . 연관관계의 이름은 생략될 수도 있으며 유일한

이름을 붙일 필요 없음 역할 : 연관관계의 양쪽 끝에 있는 클래스의 기능 표현 다중도 : 연관관계를 구성하는 인스턴스의 개수

연관관계는 상태를 나타내는 동사나 동사구로 표현 By Abbott 휴리스틱

31

Page 32: 소프트웨어 공학 Lecture #6:  객체지향 설계

연관 관계

Customer

Rental

Video Tape1 *Rent

Customer 와 VideoTape 클래스 사이의 연관관계

RentUI Video Tape1 *display

RentUI 와 VideoTape 클래스 사이의 연관관계

32

Page 33: 소프트웨어 공학 Lecture #6:  객체지향 설계

속 성

개별 객체들이 가지는 특성

속성의 요소 이름 : 객체 안에서 구별할 수 있는 속성의 이름 간단한 설명 : 구현하는 프로그래머를 위하여 간단히 설명 첨가 속성값의 타입 : 예를 들어 Name 속성은 스트링 . 또한 Status 는 열거형으로 rentable, rented, returned 라는 값을 가질수 있다 .

소유격에 따라 나오는 구나 형용사절은 속성이 가능성 높음

엔티티 객체의 경우 , 시스템에 의하여 저장될 필요가 있는 것들은모두 속성임 .

33

Page 34: 소프트웨어 공학 Lecture #6:  객체지향 설계

6.5 동적 모델링

클래스들의 상호작용이나 클래스의 상태 변화 등 시스템 내부의

동작

동적 모델링의 세가지 다이어그램 인터랙션 다이어그램 상태 다이어그램 액티비티 다이어그램

34

Page 35: 소프트웨어 공학 Lecture #6:  객체지향 설계

순서 다이어그램

객체 사이의 동작을 분산시키고 오퍼레이션을 찾는데 사용 단일 사용사례에 대한 시스템의 동작 표현

:Clerk:Ren-tUI

:Rental :Customer :VideoTape :TitleI

1.RentVideo()1.Create()

3.getCustomerDetail()return()

4. 고객정보

고객확인4.바코드스캔

4.getVideoTapeDetails()4.getTitle

return() return()display()

5.getTotal()

순서 다이어그램 ( 비디오 대여 사용사례 )35

Page 36: 소프트웨어 공학 Lecture #6:  객체지향 설계

상호작용 다이어그램

객체 간의 메시지 호출은 반드시 호출한 객체가 속하는 클래스 안에메소드로 구현되어야 함

Person

+setCompensation(s: Salary)+assign(d: Department)…

Company

:CompanyP:Person

1..* *

employee employer

Assign(d: Depart-ment)

메시지 호출과 오퍼레이션의 관계

36

Page 37: 소프트웨어 공학 Lecture #6:  객체지향 설계

상태 다이어그램

객체가 가질 수 있는 가능한 상태 표현

많은 속성값과 메시지를 가진 다이나믹한 작용을 하는 객체에게만의미가 있음

시작노드를 으로 종료 노드를 표시

둥근 사각형은 상태를 표현 조건은 화살표 위에 괄호 안에 기술 , 화살표는 상태의 전환 의미

37

Page 38: 소프트웨어 공학 Lecture #6:  객체지향 설계

상태 다이어그램

상태 다이어그램을 모델링하기에 적합한 속성의 조건 속성의 값으로 가질 수 있는 종류가 적어야 한다 . 속성의 값에 따라 허용되는 오퍼레이션이 제한되어야 한다 .

Athoriz-ing

Athoriz-ing

Athoriz-ing

Athoriz-ing

[age<=18][age>18]

그림 9.13 상태 다이어그램의 예

38

Page 39: 소프트웨어 공학 Lecture #6:  객체지향 설계

액티비티 다이어그램

시스템의 동적이 부분을 모델링하는 목적으로 사용

액티비티 사이의 제어흐름을 보여 주는 일종의 흐름도

액티비티 다이어그램의 사용 시스템의 수준에서 시스템과 상호작용하는 각 액터의 관점에서 모델링 복잡한 오퍼레이션의 수행흐름을 표현

39

Page 40: 소프트웨어 공학 Lecture #6:  객체지향 설계

40

6.6 디자인 패턴

프로그램 개발에 자주 등장하는 문제를 기술하고 같은 작업을 반복하여 설계하지 않고 여러 번 반복하여 사용할 수 있는 문제에 대한 솔루션을 기술한 것

패턴 여러 가지 상환에 적용될 수 있는 템플릿과 같은 것 문제에 대한 설계를 추상적으로 표현한 것 문제를 해결하려는 요소들을 일반화하여 잘 정리한 것 커스텀화된 객체나 클래스의 연결을 나타낸 것

패턴의 구성 요소 패턴의 이름과 구분 : 패턴을 부를 때 사용하는 이름과 패턴의 유형 문제 및 배경 : 패턴이 사용되는 분야 또는 배경 , 해결하는 문제를 의미 솔루션 : 패턴을 이루는 요소들 , 관계 , 협동 과정 사례 : 간단한 적용 사례 결과 : 패턴을 사용하면 얻게되는 이점이나 영향 샘플 코드 : 패턴이 적용된 원시코드

40

Page 41: 소프트웨어 공학 Lecture #6:  객체지향 설계

패턴의 분류 [Gamma, 1995]

목적에 의한 분류

생성유형 구조적 행위적

범위

클래스 Factory method Adapter(class)

InterpreterTemplate method

객체

Abstract fac-torySingletonPrototypeBuilder

Adapter(object)BridgeCompositeDecoratorFacadeFlyweightProxy

CommandIteratorMediatorMementoObserverStateStrategyVisitor

41

Page 42: 소프트웨어 공학 Lecture #6:  객체지향 설계

Factory 메소드 패턴

목적 객체를 생성하기 위한 인터페이스를 정의하기 위하여 어떤 클래스의 인스턴스를 생성할지에 대한 결정은 서브클래스에서 이루어지도록 책임을

미루기 위하여 위임 (delegation)

42

Page 43: 소프트웨어 공학 Lecture #6:  객체지향 설계

팩토리 메소드 패턴

사용 사례 class Hyundai extends Automobile {    . . .    Automobile createAutomobile()  {       return new Hyundai();    }    ... }

43

Page 44: 소프트웨어 공학 Lecture #6:  객체지향 설계

컴포지트 패턴

목적 객체를 집합을 다루기 위하여 객체들의 집합이 있고 또 다시 객체들이 집합을 가지게 되는 구조를 처리 할 때

사례

Circle

Rectangle

Group

Line

Group

Rectangle

Circle Line

Group

LineLineLine

LineLineLineLineCircle

CircleLine

Line

전체 그림개체들을 하나의 group 으로 간주

Part-Whole 구조44

Page 45: 소프트웨어 공학 Lecture #6:  객체지향 설계

컴포지트 패턴

45

Page 46: 소프트웨어 공학 Lecture #6:  객체지향 설계

어뎁터 패턴

목적 이미 개발된 클래스 ( 레거시 시스템이 될 수 있음 ) 의 인터페이스를 다른 클래스의 요구에 맞게 인터페이스를 변환해주기 위하여

서로 호환성이 없는 인터페이스들끼리 같이 작동할 수 있게 도와주는 변환기 적용

이미 만들어져 있는 클래스를 사용하고 싶지만 인터페이스가 원하는 방식과 일치하지 않을 때

46

Page 47: 소프트웨어 공학 Lecture #6:  객체지향 설계

어뎁터 패턴

상속을 이용한 방법

위임을 이용한 방법

47

Page 48: 소프트웨어 공학 Lecture #6:  객체지향 설계

반복자 패턴

목적 유사한 객체들의 집단 ( 예를 들면 리스트 등 ) 을 다루기 위하여 시스템 속에 존재하는 여러 객체들의 집단을 모두 동일한 인터페이스를 이용하여 접근할 수

있도록 만들어 주기 위하여 패턴 모형

48

Page 49: 소프트웨어 공학 Lecture #6:  객체지향 설계

반복자 패턴의 사례

// Client CodeIterator *iter = ds->CreateIterator();

iter->First();Element *elm = iter->CurrentItem();while ( elm ) { total += elm->GetValue(); iter->Next(); elm = iter->CurrentItem();}

LinkedListGet(int i)Add(Element *)Remove(Element *)…

BalancedTreeGet(Element *root, int i)AddNode(Element *, Element*)RemoveNode(Element *)…

LinkedListIteratorFirst()Next()CurrentItem()IsDone()

BalancedTreeIteratorFirst()Next()CurrentItem()IsDone()

Iterator자료구조 검색을 위한 Iterator 객체 생성

49

Page 50: 소프트웨어 공학 Lecture #6:  객체지향 설계

Observer 패턴

1 대 다의 객체 의존관계를 정의한 것 한 객체가 상태를 변화시켰을 때 의존관계에 있는 다른 객체들에게 자동적으로 통지하고

변화시킴 . 일명 publish-subscribe 패턴

SubjectAttach(Observer)Detach(Observer)Notify()

ObserverUpdate()

ConcreteObserver

Update()ObserverState

ConcreteSubject

GetState ()SetState ()

subjectState

for all o in observer {o->Update()

}

return subjectStateobserverState =

subject ->GetState ()

SubjectAttach(Observer)Detach(Observer)Notify()

ObserverUpdate()

ConcreteObserver

Update()ObserverState

ConcreteSubject

GetState ()SetState ()

subjectState

for all o in observer {o->Update()

}

return subjectStateobserverState =

subject ->GetState ()

50

Page 51: 소프트웨어 공학 Lecture #6:  객체지향 설계

Observer 패턴

cConcreteSubject anotherConcreteObserveraConcreteObserver

GetState ()

Notify()

Update()

Update()

GetState ()

SetState ()

cConcreteSubject anotherConcreteObserveraConcreteObserver

GetState ()

Notify()

Update()

Update()

GetState ()

SetState ()

옵서버 패턴의 협동 과정

51

Page 52: 소프트웨어 공학 Lecture #6:  객체지향 설계

Questions?