o d for agile software developmentpds6.egloos.com/pds/200709/12/40/ood_02_20070912... · 2....

38
1 O O bject bject - - O O riented riented D D esign esign for for Agile Agile Software Development Software Development Story 2. Story 2. : 고형호 : [email protected] : http://www.innosigma.com 최초 작성일 : 2006.10.09 최종 작성일 : 2007.09.12

Upload: others

Post on 20-Jul-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: O D for Agile Software Developmentpds6.egloos.com/pds/200709/12/40/OOD_02_20070912... · 2. 상속(Inheritance) 3. 다형성(Polymorphism) 재사용 다형성 은닉 캡슐화(Encapsulation)

1

OObjectbject--OOrientedriented DDesignesign

for for AgileAgile Software DevelopmentSoftware Development

Story 2.Story 2.

작 성 자 : 고형호

메 일 : [email protected]

홈 페 이 지 : http://www.innosigma.com

최초 작성일 : 2006.10.09

최종 작성일 : 2007.09.12

Page 2: O D for Agile Software Developmentpds6.egloos.com/pds/200709/12/40/OOD_02_20070912... · 2. 상속(Inheritance) 3. 다형성(Polymorphism) 재사용 다형성 은닉 캡슐화(Encapsulation)

http

://w

ww

.inn

osig

ma.

com

2

Goal

Object - Oriented

Page 3: O D for Agile Software Developmentpds6.egloos.com/pds/200709/12/40/OOD_02_20070912... · 2. 상속(Inheritance) 3. 다형성(Polymorphism) 재사용 다형성 은닉 캡슐화(Encapsulation)

http

://w

ww

.inn

osig

ma.

com

3

Content

1. Voice of Customer

2. Innovation

3. Object-Oriented

4. The Fragile-Base-Class Problem

5. Customer Requirement

6. Class vs. Object

7. Object-Oriented Design

8. Design Pattern

9. Class Diagram in Practice

10. Summary

Page 4: O D for Agile Software Developmentpds6.egloos.com/pds/200709/12/40/OOD_02_20070912... · 2. 상속(Inheritance) 3. 다형성(Polymorphism) 재사용 다형성 은닉 캡슐화(Encapsulation)

4

1. Voice of Customer

Page 5: O D for Agile Software Developmentpds6.egloos.com/pds/200709/12/40/OOD_02_20070912... · 2. 상속(Inheritance) 3. 다형성(Polymorphism) 재사용 다형성 은닉 캡슐화(Encapsulation)

http

://w

ww

.inn

osig

ma.

com

5

Voice of Customer

신제품 실패 원인(IBM, 1996)

출처 : "DMAIC" 발표자료 인용(2005.04.06 삼성경제연구소 6시그마실 김종만)

Page 6: O D for Agile Software Developmentpds6.egloos.com/pds/200709/12/40/OOD_02_20070912... · 2. 상속(Inheritance) 3. 다형성(Polymorphism) 재사용 다형성 은닉 캡슐화(Encapsulation)

http

://w

ww

.inn

osig

ma.

com

6

?Basic

Performance

-. Basic: 고객의당연히제공될것이라고생각하는품질-. Performance: 고객의이야기하는품질-. Excitement: 고객의기대하지도않는, 이야기도하지않는매력적인품질

Voice of Customer

출처: http://blog.naver.com/mrjeylee/60002668241

Page 7: O D for Agile Software Developmentpds6.egloos.com/pds/200709/12/40/OOD_02_20070912... · 2. 상속(Inheritance) 3. 다형성(Polymorphism) 재사용 다형성 은닉 캡슐화(Encapsulation)

http

://w

ww

.inn

osig

ma.

com

7

고객에게 감동을 줄 수 있는 어떤 품질 요소를 발굴하여 개발해야 할까?

Unexpected, Unspoken

< Kano Model >

- Basic: 제공되더라도 만족에 크게 영향을 미치지

않으나 제공되지 않으면 부정적인 반응을 유발.

- Performance: 제공할수록 만족이 증가하고, 제공되지

않을 수록 불만이 증가

- Excitement: 제공되지 않더라도 불만을 유발하지 않지만

제공되면 만족이 증가.

Voice of Customer

Page 8: O D for Agile Software Developmentpds6.egloos.com/pds/200709/12/40/OOD_02_20070912... · 2. 상속(Inheritance) 3. 다형성(Polymorphism) 재사용 다형성 은닉 캡슐화(Encapsulation)

8

2. Innovation

Page 9: O D for Agile Software Developmentpds6.egloos.com/pds/200709/12/40/OOD_02_20070912... · 2. 상속(Inheritance) 3. 다형성(Polymorphism) 재사용 다형성 은닉 캡슐화(Encapsulation)

http

://w

ww

.inn

osig

ma.

com

9

Innovation

Page 10: O D for Agile Software Developmentpds6.egloos.com/pds/200709/12/40/OOD_02_20070912... · 2. 상속(Inheritance) 3. 다형성(Polymorphism) 재사용 다형성 은닉 캡슐화(Encapsulation)

http

://w

ww

.inn

osig

ma.

com

10

Innovation

Page 11: O D for Agile Software Developmentpds6.egloos.com/pds/200709/12/40/OOD_02_20070912... · 2. 상속(Inheritance) 3. 다형성(Polymorphism) 재사용 다형성 은닉 캡슐화(Encapsulation)

http

://w

ww

.inn

osig

ma.

com

11

1. 테스트는 언제 하나요?

2. 설계는 어떻게 진행하고 있나요?

3. 추가되는 요구사항을 어떻게 구현하나요?

테스트 먼저 구현한다(Test-Driven Development)

반복적이고 점진적인 설계(Refactoring)

해당 객체만 추가 구현한다(Design Pattern)

Innovation

Page 12: O D for Agile Software Developmentpds6.egloos.com/pds/200709/12/40/OOD_02_20070912... · 2. 상속(Inheritance) 3. 다형성(Polymorphism) 재사용 다형성 은닉 캡슐화(Encapsulation)

12

3. Object-Oriented

Page 13: O D for Agile Software Developmentpds6.egloos.com/pds/200709/12/40/OOD_02_20070912... · 2. 상속(Inheritance) 3. 다형성(Polymorphism) 재사용 다형성 은닉 캡슐화(Encapsulation)

http

://w

ww

.inn

osig

ma.

com

13

유연한 소프트웨어 개발을 위한 Object-Oriented의 장점

1. 데이터 지향적이다.

2. 인터페이스 지향적이다.

1 : N

3. Real World 지향적이다.

Read World : Mapping ≒ 1 : 1

DATA FUNCTION(변경 횟수)

Creation : Use =(객체 사용 횟수)

Object-Oriented

Page 14: O D for Agile Software Developmentpds6.egloos.com/pds/200709/12/40/OOD_02_20070912... · 2. 상속(Inheritance) 3. 다형성(Polymorphism) 재사용 다형성 은닉 캡슐화(Encapsulation)

http

://w

ww

.inn

osig

ma.

com

14

유연한 소프트웨어 개발을 위한 Object-Oriented의 특징

1. 캡슐화(Encapsulation)

2. 상속(Inheritance)

3. 다형성(Polymorphism)

재사용 다형성 은닉

캡슐화(Encapsulation)

은닉(Hiding)

구현(Implement) 상속

인터페이스(Interface) 상속

∆∆O O

구현 상속을 통한 재사용-. 구현 상속을 통한 재사용은 불필요한 결합도를 증가시킨다. 재사용을 위해서는 Composition을 사용하자.-. 구현 상속은 여러 클래스가 공통의 연산 집합을 공유하고 있을 때 정규화를 위해 사용하자.

Object-Oriented

구현 상속을 통한 다형성-. 깨지기 쉬운 기반 클래스 문제가 있기 때문에 다형성 획득 측면서 인터페이스 상속보다 안전하지 못 하다.

: 데이터와 연산을 한데 묶는 것

: 내부 데이터, 내부 연산을 외부에서 접근하지 못하도록 격리 시키는 것

이 둘을 조합하여 런타임에 ‘무엇을’ ‘어떻게’ 실행시킬 것인지를 동적으로 정하게 된다.

출처 : 실전 코드로 배우는 실용주의 디자인 패턴(사이텍미디어, 송치형)

Page 15: O D for Agile Software Developmentpds6.egloos.com/pds/200709/12/40/OOD_02_20070912... · 2. 상속(Inheritance) 3. 다형성(Polymorphism) 재사용 다형성 은닉 캡슐화(Encapsulation)

15

4. The Fragile-Base-Class Problem

Page 16: O D for Agile Software Developmentpds6.egloos.com/pds/200709/12/40/OOD_02_20070912... · 2. 상속(Inheritance) 3. 다형성(Polymorphism) 재사용 다형성 은닉 캡슐화(Encapsulation)

http

://w

ww

.inn

osig

ma.

com

16

깨지기 쉬운 기반 클래스 문제(The Fragile-Base-Class Problem)

class ArrayList{public:

void Add(int nIndex, String strData){

…}String Remove(int nIndex){

…}void Clear(){

// 모든 데이터 삭제…

}…

};

class Stack : public ArrayList{ private:

int m_nTopOfStack;

public:void Push(String strData){

Add(m_nTopOfStack++, strData);}String Pop(){

return Remove(--m_nTopOfStack);}

}

Stack stack = new Stack();stack.Push("1");stack.Push("2");stack.Clear();stack.Push(“3”); // m_nTopOfStack가 올바른 위치를 지정할 수 없다

clear 메소드 호출로 인하여 스택 인텍스(m_nTopOfStack)가 올바른 위치를 지정할 수 없게 된다.즉, 원하지 않는 메소드(clear)까지 모두 상속 받기 때문이다.

Page 17: O D for Agile Software Developmentpds6.egloos.com/pds/200709/12/40/OOD_02_20070912... · 2. 상속(Inheritance) 3. 다형성(Polymorphism) 재사용 다형성 은닉 캡슐화(Encapsulation)

http

://w

ww

.inn

osig

ma.

com

17

1. Stack 내부의 상태를 변경하는 모든 메소드(clear, …)를 상속 받는다.

2. clear 메소드가 예외를 던지도록 상속 받는다.

기반 클래스에 clear와 같은 메소드를 추가하는 경우에는 속수무책이다.

기반 클래스의 규약은 파생 클래스가 기반 클래스의 몇몇 메소드가 작동하길 원하지 않을 때예외를 던진다고 말해 주지 않는다.

깨지기 쉬운 기반 클래스 문제(The Fragile-Base-Class Problem)

예외로 인하여 클라이언트는 다형성을 이용한 코딩을 하지 못하게 된다(LSP 위반).

컴파일 타임 에러(해당 메소드를 찾을 수 없음)를 런타임으로 옮기게 된다.

단순 해결책

Page 18: O D for Agile Software Developmentpds6.egloos.com/pds/200709/12/40/OOD_02_20070912... · 2. 상속(Inheritance) 3. 다형성(Polymorphism) 재사용 다형성 은닉 캡슐화(Encapsulation)

http

://w

ww

.inn

osig

ma.

com

18

깨지기 쉬운 기반 클래스 문제(The Fragile-Base-Class Problem)

Implement Inheritance 대신 Composition를 사용하자

class ArrayList{public:

void Clear(){

// 모든 데이터 삭제…

}…

};

class Stack : public ArrayList{ private:

int m_nTopOfStack;

public:Stack() : m_nTopOfStack(0){}void Push(String strData){

Add(m_nTopOfStack++, strData);}String Pop(){

return Remove(--m_nTopOfStack);}

}

Implement Inheritance

class Stack{ private:

int m_nTopOfStack = 0;ArrayList m_data;

public:Stack() : m_nTopOfStack(0) {}public void Push(String strData){

m_data.Add(m_nTopOfStack++, strData);}public String Pop(){

return m_data.Remove(--m_nTopOfStack);}

}

Composition

Favor Object Composition(with Interface Inheritance) over Class Implementation.

(Implement Inheritance)

Page 19: O D for Agile Software Developmentpds6.egloos.com/pds/200709/12/40/OOD_02_20070912... · 2. 상속(Inheritance) 3. 다형성(Polymorphism) 재사용 다형성 은닉 캡슐화(Encapsulation)

http

://w

ww

.inn

osig

ma.

com

19

class Stack{ private:

int m_nTopOfStack = 0;ArrayList m_data;

public:Stack() : m_nTopOfStack(0) {}public void Push(String strData){

m_data.Add(m_nTopOfStack++, strData);}public String Pop(){

return m_data.Remove(--m_nTopOfStack);}

}

Stack stack = new Stack();stack.Push("1");stack.Push("2");stack.Clear();

clear 메소드 호출로 인하여 컴파일러 에러가 발생된다.즉, 구현상속으로 인한 문제점(런타임시 발생될 에러 가능성)을 제거할 수 있다.

깨지기 쉬운 기반 클래스 문제(The Fragile-Base-Class Problem)

Page 20: O D for Agile Software Developmentpds6.egloos.com/pds/200709/12/40/OOD_02_20070912... · 2. 상속(Inheritance) 3. 다형성(Polymorphism) 재사용 다형성 은닉 캡슐화(Encapsulation)

20

5. Customer Requirement

Page 21: O D for Agile Software Developmentpds6.egloos.com/pds/200709/12/40/OOD_02_20070912... · 2. 상속(Inheritance) 3. 다형성(Polymorphism) 재사용 다형성 은닉 캡슐화(Encapsulation)

http

://w

ww

.inn

osig

ma.

com

21

Log

+Write(const void*, UINT)

void Log::Write(const void* lpBuf, int nLen){

// File 저장}

요구사항 구현

요구사항: Log 데이터를 File과 DB에저장한다.

1. 변수 추가 2. 함수 추가 3. 구현 상속

Customer Requirement

Page 22: O D for Agile Software Developmentpds6.egloos.com/pds/200709/12/40/OOD_02_20070912... · 2. 상속(Inheritance) 3. 다형성(Polymorphism) 재사용 다형성 은닉 캡슐화(Encapsulation)

http

://w

ww

.inn

osig

ma.

com

22

void Log::Write(const void* lpBuf, int nLen){

if(저장판단){

// File 저장}else{

// DB 저장}

}

1. 변수변수 추가

추가요구사항: 데이터를 Log Viewer에저장한다.

1. 변수 추가 : 조건문 수정 필요

추가 요구 사항 구현은 ?

Customer Requirement

2. 함수 추가 : 조건문 수정 필요, 함수 추가 필요(WriteViewer)

3. 구현 상속 : 깨지기 쉬운 베이스 클래스 및 불안정한 다형성 획득의 잠재적 문제 소유

int _tmain(int argc, _TCHAR* argv[]){

...if(저장판단)

pLog->WriteFile( … );else

pLog->WriteDB( … );...

}

2. 함수함수 추가

class Log{

virtual void Write(const void*, UINT){

//do something...}

};

class LogFile : public Log{

virtual void Write(const void*, UINT){

// File 저장}

};

class LogDB : public Log{

virtual void Write(const void*, UINT){

// DB 저장}

};

3. 구현구현 상속

Page 23: O D for Agile Software Developmentpds6.egloos.com/pds/200709/12/40/OOD_02_20070912... · 2. 상속(Inheritance) 3. 다형성(Polymorphism) 재사용 다형성 은닉 캡슐화(Encapsulation)

23

6. Class vs. Object

Page 24: O D for Agile Software Developmentpds6.egloos.com/pds/200709/12/40/OOD_02_20070912... · 2. 상속(Inheritance) 3. 다형성(Polymorphism) 재사용 다형성 은닉 캡슐화(Encapsulation)

http

://w

ww

.inn

osig

ma.

com

24

Class

Object

VS.

= User Defined Data Type

= Service Provider

Class vs. Object

Page 25: O D for Agile Software Developmentpds6.egloos.com/pds/200709/12/40/OOD_02_20070912... · 2. 상속(Inheritance) 3. 다형성(Polymorphism) 재사용 다형성 은닉 캡슐화(Encapsulation)

http

://w

ww

.inn

osig

ma.

com

25

Object (Service Provider)

‘무엇을 하는가(WHAT)’ 하는 연산으로 정의되어야 한다(변화하지 않는 것).

‘어떻게(HOW)’ 연산을 수행하는가는 철저히 은닉되어야 한다(변화하는 것).

Class vs. Object

Page 26: O D for Agile Software Developmentpds6.egloos.com/pds/200709/12/40/OOD_02_20070912... · 2. 상속(Inheritance) 3. 다형성(Polymorphism) 재사용 다형성 은닉 캡슐화(Encapsulation)

http

://w

ww

.inn

osig

ma.

com

26

요구사항 : Log 데이터를 File과 DB에 출력(저장)한다.

HOW(세부 구현, 변화하는 것)

WHAT(외부와의 계약, 변화하지 않는 것)

철저히 은닉되어야 한다.

Class vs. Object

Page 27: O D for Agile Software Developmentpds6.egloos.com/pds/200709/12/40/OOD_02_20070912... · 2. 상속(Inheritance) 3. 다형성(Polymorphism) 재사용 다형성 은닉 캡슐화(Encapsulation)

27

7. Object-Oriented Design

Page 28: O D for Agile Software Developmentpds6.egloos.com/pds/200709/12/40/OOD_02_20070912... · 2. 상속(Inheritance) 3. 다형성(Polymorphism) 재사용 다형성 은닉 캡슐화(Encapsulation)

http

://w

ww

.inn

osig

ma.

com

28

책임을 기준으로 캡슐화(Encapsulation) 시킨다.

캡슐화(Encapsulation)

void Log::Write(const void* lpBuf, UINT nLen){

// File 저장}

요구사항: Log 데이터를 File과 DB에 출력(저장)한다.

Log

+Write(const void*, UINT)

‘무엇을’과 ‘어떻게’를 분리 시킨다.

문제점: 기존 설계를 유지하면서 요구사항을 반영할 수 없다.

(Write함수 수정 없이는)

void Log::SetOutputStream(OutputStream* pOutputStream){

m_pOutputStream = pOutputStream;}

void Log::Write(const void* lpBuf, UINT nLen){

m_pOutputStream->Write(lpBuf, nLen); // delegate}

출력(저장)WHAT

(외부와의 계약, 변화하지 않는 것)

OutputStream

+Write(const void*, UINT)delegate

출력(저장) / FileWHAT/ HOW

Log

+SetOutputStream(OutputStream*)+Write(const void*, UINT)

출력(저장) 서비스 이용CLIENT

(서비스 사용자)

Page 29: O D for Agile Software Developmentpds6.egloos.com/pds/200709/12/40/OOD_02_20070912... · 2. 상속(Inheritance) 3. 다형성(Polymorphism) 재사용 다형성 은닉 캡슐화(Encapsulation)

http

://w

ww

.inn

osig

ma.

com

29

은닉(Hiding)

클라이언트는 구체 클래스가 아닌 인터페이스에 의존하여 변화에 대처한다.(Concrete Class)

구체 클래스는 변화기 쉽다.

문제점추가 요구사항을 위해 OutputStream::Write 함수 구현은 변경된다(SRP:변경의 국지화).Log는 OutputStream(Concrete Class)을 인지(Acquaintance)하고 있다.그러므로, Log는 OutputStream 변화에 영향을 받는다.

Log OutputStream

+SetOutputStream(OutputStream*)

+Write(const void*, UINT)+Write(const void*, UINT)

delegate

Log <<interface>>IOutputStream

+SetOutputStream(IOutputStream*)

+Write(const void*, UINT)+Write(const void*, UINT)

delegate

출력(저장)WHAT

(외부와의 계약, 변화하지 않는 것)

출력(저장) 서비스 이용CLIENT

(서비스 사용자)

Page 30: O D for Agile Software Developmentpds6.egloos.com/pds/200709/12/40/OOD_02_20070912... · 2. 상속(Inheritance) 3. 다형성(Polymorphism) 재사용 다형성 은닉 캡슐화(Encapsulation)

http

://w

ww

.inn

osig

ma.

com

30

다형성(Polymorphism)

인터페이스 상속으로 다형성 구현

Log <<interface>>IOutputStream

+SetOutputStream(IOutputStream*)

+Write(const void*, UINT)+Write(const void*, UINT)

delegate

DBOutputStream

+Write(const void*, UINT)

FileOutputStream

+Write(const void*, UINT)

Log <<interface>>IOutputStream

+SetOutputStream(IOutputStream*)

+Write(const void*, UINT)+Write(const void*, UINT)

delegate

File과 DBHOW

(세부 구현, 변화하는 것)

출력(저장)WHAT

(외부와의 계약, 변화하지 않는 것)

출력(저장) 서비스 이용CLIENT

(서비스 사용자)

Page 31: O D for Agile Software Developmentpds6.egloos.com/pds/200709/12/40/OOD_02_20070912... · 2. 상속(Inheritance) 3. 다형성(Polymorphism) 재사용 다형성 은닉 캡슐화(Encapsulation)

31

8. Design Pattern

Page 32: O D for Agile Software Developmentpds6.egloos.com/pds/200709/12/40/OOD_02_20070912... · 2. 상속(Inheritance) 3. 다형성(Polymorphism) 재사용 다형성 은닉 캡슐화(Encapsulation)

http

://w

ww

.inn

osig

ma.

com

32

Design Pattern

캡슐화

은닉

다형성

Log

+Write(const void*, UINT)

void Log::SetOutputStream(IOutputStream* pOutputStream){

m_pOutputStream = pOutputStream;}

void Log::Write(const void* lpBuf, int nLen){

m_pOutputStream->Write(lpBuf, nLen); // delegate}

Log OutputStream

+SetOutputStream(OutputStream*)

+Write(const void*, UINT)+Write(const void*, UINT)

delegate

Log <<interface>>IOutputStream

+SetOutputStream(IOutputStream*)

+Write(const void*, UINT)+Write(const void*, UINT)

delegate

DBOutputStream

+Write(const void*, UINT)

FileOutputStream

+Write(const void*, UINT)

Log <<interface>>IOutputStream

+SetOutputStream(IOutputStream*)

+Write(const void*, UINT) +Write(const void*, UINT)

delegate

Page 33: O D for Agile Software Developmentpds6.egloos.com/pds/200709/12/40/OOD_02_20070912... · 2. 상속(Inheritance) 3. 다형성(Polymorphism) 재사용 다형성 은닉 캡슐화(Encapsulation)

33

9. Class Diagram in Practice

Page 34: O D for Agile Software Developmentpds6.egloos.com/pds/200709/12/40/OOD_02_20070912... · 2. 상속(Inheritance) 3. 다형성(Polymorphism) 재사용 다형성 은닉 캡슐화(Encapsulation)

http

://w

ww

.inn

osig

ma.

com

34

C++ Program Code로 표현해 보자!

Class Diagram in Practice

DBOutputStream

+Write(const void*, UINT)

FileOutputStream

+Write(const void*, UINT)

Log <<interface>>IOutputStream

+SetOutputStream(IOutputStream*)+Write(const void*, UINT)

+Write(const void*, UINT)

delegation

Page 35: O D for Agile Software Developmentpds6.egloos.com/pds/200709/12/40/OOD_02_20070912... · 2. 상속(Inheritance) 3. 다형성(Polymorphism) 재사용 다형성 은닉 캡슐화(Encapsulation)

http

://w

ww

.inn

osig

ma.

com

35

class Log{public:

Log();~Log();

private:IOutputStream* m_pOutputStream;

public:void SetOutputStream(IOutputStream* pOutputStream);void Write(const void*, UINT);

};

Class Diagram in Practice

Log <<interface>>IOutputStream

+SetOutputStream(IOutputStream*)+Write(const void*, UINT)

+Write(const void*, UINT)

delegation

Page 36: O D for Agile Software Developmentpds6.egloos.com/pds/200709/12/40/OOD_02_20070912... · 2. 상속(Inheritance) 3. 다형성(Polymorphism) 재사용 다형성 은닉 캡슐화(Encapsulation)

http

://w

ww

.inn

osig

ma.

com

36

class IOutputStream{public:

IOutputStream();virtual ~IOutputStream();

public:virtual void Write(const void*, UINT) = 0;

};

class DBOutputStream : public IOutputStream{public:

DBOutputStream();virtual ~DBOutputStream();

public:virtual void Write(const void*, UINT);

};

class FileOutputStream : public IOutputStream{public:

FileOutputStream();virtual ~FileOutputStream();

public:virtual void Write(const void*, UINT);

};

DBOutputStream

+Write(const void*, UINT)

<<interface>>IOutputStream

+Write(const void*, UINT)

FileOutputStream

+Write(const void*, UINT)

Class Diagram in Practice

Page 37: O D for Agile Software Developmentpds6.egloos.com/pds/200709/12/40/OOD_02_20070912... · 2. 상속(Inheritance) 3. 다형성(Polymorphism) 재사용 다형성 은닉 캡슐화(Encapsulation)

37

10. Summary

Page 38: O D for Agile Software Developmentpds6.egloos.com/pds/200709/12/40/OOD_02_20070912... · 2. 상속(Inheritance) 3. 다형성(Polymorphism) 재사용 다형성 은닉 캡슐화(Encapsulation)

http

://w

ww

.inn

osig

ma.

com

38

Object =Object = Service ProviderService Provider

Summary