프로그래밍 (object oriented...

27
객체 객체 객체 객체 지향 지향 지향 지향 프로그래밍 프로그래밍 프로그래밍 프로그래밍 (Object Oriented Programming) (Object Oriented Programming) (Object Oriented Programming) (Object Oriented Programming) 13장 강사 강대기

Upload: others

Post on 23-Jun-2020

12 views

Category:

Documents


0 download

TRANSCRIPT

객체

객체

객체

객체

지향

지향

지향

지향

프로

그래

밍프

로그

래밍

프로

그래

밍프

로그

래밍

(Obje

ct O

riente

d P

rogra

mm

ing)

(Obje

ct O

riente

d P

rogra

mm

ing)

(Obje

ct O

riente

d P

rogra

mm

ing)

(Obje

ct O

riente

d P

rogra

mm

ing)

13장

강사–

강대

차례

차례

차례

차례

(Agenda)

(Agenda)

(Agenda)

(Agenda)

�IS

A 상

속�

public

으로

파생

된클

래스

�pro

tecte

d 접

근�

생성

자멤

버초

기자

리스

트�

업캐

스트

와다

운캐

스트

�가

상멤

버함

수�

초기

(정적

) 결

합과

말기

(동적

) 결

합�

추상

화기

초클

래스

�순

수가

상함

수(p

ure

virtu

al fu

nction)

�public

상속

은언

제어

떻게

?

상속

으로

상속

으로

상속

으로

상속

으로

할 할할할수 수수수

있는

있는

있는

있는

일 일일일(8

00

(800

(800

(800쪽 쪽쪽쪽

) )))

�근

본적

으로

더높

은수

준의

재활

용성

제공

�기

존의

클래

스에

기능

을추

�클

래스

안의

데이

터에

다른

데이

터멤

버추

�클

래스

메쏘

드가

동작

하는

방식

을변

간단

한간

단한

간단

한간

단한

기초

기초

기초

기초

클래

스클

래스

클래

스클

래스

(801~

804

(801~

804

(801~

804

(801~

804쪽 쪽쪽쪽

) )))

�Table

Tennis

Pla

yer

클래

스파

생(8

03쪽

)cla

ss R

ate

dPla

yer

: public

Table

Tennis

Pla

yer

{ } �Public

상속–

기초

클래

스의

priva

te–

기초

클래

스의

public

�파

생클

래스

의public

–기

초클

래스

의priva

te �

파생

클래

스의

일부

이나

접근

불가

�파

생클

래스

는(그

림13.1

in 8

04 쪽

)–

기초

클래

스의

데이

터멤

버들

을저

–기

초클

래스

의멤

버함

수들

을사

상속

상속

상속

상속

관계

를관

계를

관계

를관

계를

나타

내는

나타

내는

나타

내는

나타

내는

도표

도표

도표

도표

(pro

tecte

d(p

rote

cte

d(p

rote

cte

d(p

rote

cte

d는 는는는

844

844

844

844쪽 쪽쪽쪽

참조

참조

참조

참조

) )))

접근

불가

접근

불가

접근

불가

Priva

te 멤

Priva

tePro

tecte

dPro

tecte

dPro

tecte

d멤

Priva

tePro

tecte

dPublic

Public

멤버

Priva

te 상

속Pro

tecte

d

상속

Public

상속

상속

형태

기초

클래

파생

파생

파생

파생

클래

스클

래스

클래

스클

래스

�초

기자

리스

트(m

em

ber in

itia

lization lis

t) –

805쪽

Rate

dPla

yer::R

ate

dPla

yer(u

nsig

ned intr, c

onst char*

fn, const char*

ln, boolht)

:

Table

Tennis

Pla

yer(f

n,ln,h

t)

{

this

->ra

ting =

r;

} Rate

dPla

yer::R

ate

dPla

yer(u

nsig

ned intr, c

onst char*

fn, const char*

ln, boolht)

:

Table

Tennis

Pla

yer(f

n,ln,h

t), ra

ting(r

)

{ }

�객

체생

성과

파괴

순서

–기

초클

래스

생성

자�

파생

클래

스생

성자

–초

기자

리스

트가

없으

면기

초클

래스

의디

폴트

생성

–파

생클

래스

파괴

자�

기초

클래

스파

괴자

멤버

멤버

멤버

멤버

초기

자초

기자

초기

자초

기자

리스

트리

스트

리스

트리

스트

#in

clu

de <

iostream

>usin

g n

am

espace s

td;

cla

ss T

est

{ priva

te:

int m

_first;

int m

_second;

// 순

서가

중요

public

:Test(

int a)

: m

_first(

a),

m_s

econd(m

_first*

2)

{ }

frie

nd o

stream

& o

pera

tor<

<(o

stream

& o

s, const Test &

t)

{re

turn

os <

< "

firs

t="

<< t.m

_first << "

, second="

<< t.m

_second;

}}; vo

id m

ain

(){

Test t(

4);

cout << t <

< e

ndl;

} �초

기화

리스

트의

초기

식들

은리

스트

에나

타난

순서

가아

니라

멤버

의선

언순

서대

로실

행�

m_f

irst와

m_s

econd

의위

치를

바꾸

면부

작용

이발

생함

Public

Public

Public

Public

상속

인상

속인

상속

인상

속인

경우

경우

경우

경우–

파생

파생

파생

파생

클래

스와

클래

스와

클래

스와

클래

스와

기초

기초

기초

기초

클래

스와

의클

래스

와의

클래

스와

의클

래스

와의

관계

관계

관계

관계

(812

(812

(812

(812쪽 쪽쪽쪽

) )))

�기

초클

래스

의priva

te 아

닌멤

버를

사용

�기

초클

래스

포인

터는

파생

클래

스지

시가

능�

기초

클래

스참

조는

파생

클래

스참

조가

능�

기초

클래

스포

인터

나참

조는

기초

클래

스메

쏘드

만호

출가

능�

파생

클래

스참

조나

포인

터는

기초

클래

스를

지칭

할수

없음

�기

초클

래스

참조

와포

인터

를전

달인

자로

사용

하는

함수

�파

생클

래스

객체

도사

용가

능�

기초

클래

스객

체를

파생

클래

스객

체로

초기

화할

수있

음�

파생

클래

스객

체를

기초

클래

스에

대입

가능

상속

상속

상속

상속

(is

(is

(is

(is- ---a

a

a

a 관

계관

계관

계관

계),

),

),

),

컴포

지션

컴포

지션

컴포

지션

컴포

지션

(has

(has

(has

(has- ---a

a

a

a 관

계관

계관

계관

계) )))

�814 쪽

�바

나나

는과

일이

지만

(is-a),

점심

은바

나나

를가

지고

있다

(has-a).

�Lunch 클

래스

의한

데이

터멤

버로

Fru

it 객

체를

포함

시킨

다.

�Arr

ay

클래

스로

부터

Sta

ck

클래

스를

파생

시키

지말

고,

Sta

ck

클래

스안

에Arr

ay

객체

를넣

는다

. (is-im

ple

mente

d-as-a)

다형

성다

형성

다형

성다

형성

– –––C

++

C++

C++

C++

�para

metric

poly

morp

his

m -

템플

리트

�subty

pe p

oly

morp

his

m –

가상

함수

, 오

버라

이딩

�ad-hoc p

oly

morp

his

m –

오버

로딩

public

public

public

public

다형

다형

다형

다형

상속

상속

상속

상속

(816

(816

(816

(816쪽 쪽쪽쪽

) )))

�호

출하

는객

체마

다메

쏘드

의행

동이

다른

–오

버라

이딩

(subty

pe p

oly

morp

his

m)

�방

–기

초클

래스

메쏘

드를

다시

정의

(ove

rrid

ing)

–820쪽

코드

–가

상메

쏘드

(가상

함수

)를사

용–

821쪽

코드

�가

상파

괴자

–올

바른

순서

로파

괴자

가호

출되

게함

(833,8

40 쪽

)

어떻

게어

떻게

어떻

게어

떻게

상위

상위

상위

상위

클래

스클

래스

클래

스클

래스

객체

의객

체의

객체

의객

체의

메쏘

드를

메쏘

드를

메쏘

드를

메쏘

드를

실행

실행

실행

실행

하는

가하

는가

하는

가하

는가

? (

826

? (

826

? (

826

? (

826쪽 쪽쪽쪽

) )))

�기

초클

래스

메쏘

드를

재정

의한

경우

–B

rass::

Vie

wAcct(

); /

/ 기

초부

분을

출력

(826쪽

)

�기

초클

래스

메쏘

드를

재정

의하

지않

은경

–B

ala

nce()

; //

(827쪽

)

�Ja

va –

super.

view

Acct(

);

단순

단순

단순

단순

대입

대입

대입

대입

Bra

ss P

iggy(

"Porc

elo

t Pig

g",

381299, 4000.0

0);

Bra

ssPlu

s H

oggy(

"Hora

tio H

ogg",

382288,

3000.0

0);

Bra

ssPlu

s d

dd;

ddd =

Pig

gy;

// 적

당한

생성

자가

있으

므로

ok

Rate

dPla

yer

rp;

Table

Tennis

Pla

yer

ttp

= r

p;

// 생

성자

없으

므로

에러

Bra

ssPlu

s*

eee =

&Pig

gy;

// 컴

파일

에러

Bra

ssPlu

s*

eee =

(B

rassPlu

s*)

&Pig

gy;

eee->Vie

wAcct(

);//

실행

에러

의소

지다

분함

대입

대입

대입

대입

, , , , 참

조참

조참

조참

조, , , , 포

인터

포인

터포

인터

포인

터코

딩코

딩코

딩코

딩실

험실

험실

험실

Bra

ss P

iggy(

"Porc

elo

t Pig

g",

381299,

4000.0

0);

Bra

ssPlu

s H

oggy(

"Hora

tio H

ogg",

382288, 3000.0

0);

Pig

gy.

Vie

wAcct(

);cout << e

ndl;

Hoggy.

Vie

wAcct(

);cout << e

ndl;

Bra

ss a

aa(P

iggy)

;//

대입

aaa.V

iew

Acct(

);cout << e

ndl;

aaa

= H

oggy;

// 나

중에

Bra

ss a

aa1(H

oggy)

;로바

꿔서

실험

aaa.V

iew

Acct(

);cout << e

ndl;

cout << e

ndl;

Bra

ss&

bbb =

Pig

gy;

// 참

조bbb.V

iew

Acct(

);cout << e

ndl;

bbb =

Hoggy;

//

나중

에B

rass&

bbb1 =

Hoggy;

로바

꿔서

실험

(429, 430쪽

)bbb.V

iew

Acct(

);cout << e

ndl;

cout << e

ndl;

Bra

ss*

ccc =

&Pig

gy;

// 포

인터

ccc->Vie

wAcct(

);cout << e

ndl;

ccc =

&H

oggy;

// 나

중에

Bra

ss*

ccc1 =

&H

oggy;

로바

꿔서

실험

ccc->Vie

wAcct(

);cout << e

ndl;

cout << e

ndl;

함수

함수

함수

함수

대입

대입

대입

대입

, , , , 함

수함

수함

수함

수참

조참

조참

조참

조, , , , 함

수함

수함

수함

수포

인터

포인

터포

인터

포인

void

func1(B

rass p

){

p.V

iew

Acct(

);}

void

func2(B

rass&

p)

{p.V

iew

Acct(

);}

void

func3(B

rass*

p)

{p->Vie

wAcct(

);}

Bra

ss d

dd(P

iggy)

;fu

nc1(d

dd);

Bra

ss d

dd1(H

oggy)

;fu

nc1(d

dd1);

Bra

ss&

eee =

Pig

gy;

func2(e

ee);

Bra

ss&

eee1 =

Hoggy;

func2(e

ee1);

Bra

ss*

fff

= &

Pig

gy;

func3(f

ff);

Bra

ss*

fff1

= &

Hoggy;

func3(f

ff1);

�리

스코

프대

체원

리–

Lis

kov

Substitu

tion P

rincip

le (

Barb

ara

Lis

kov)

–원

문:

서브

타입

은언

제나

기반

타입

으로

교체

할수

있어

야한

다.

–C

++ :

파생

클래

스는

언제

나기

초클

래스

로교

체할

수있

어야

한다

.–

즉,

하위

클래

스는

상위

클래

스와

호환

성을

생각

해야

한다

는것

–그

러려

면구

현은

선언

을준

수하

고하

위클

래스

는상

위클

래스

의규

약을

준수

해야

가상

가상

가상

가상

파괴

자가

파괴

자가

파괴

자가

파괴

자가

필요

한필

요한

필요

한필

요한

이유

이유

이유

이유

�831쪽

, 리

스팅

13.1

0 –

dele

te로

파괴

�파

괴자

가가

상이

아니

라면

포인

터형

에해

당하

는파

괴자

가호

출되

게됨

�EC

++의

규칙

7번

–다

형성

을가

진기

본클

래스

에서

는소

멸자

를반

드시

가상

소멸

자로

선언

정적

정적

정적

정적

결합

과결

합과

결합

과결

합과

동적

동적

동적

동적

결합

결합

결합

결합

�정

적결

합–

하여

간정

해진

데로

하겠

다!

–함

수이

름에

따라

어떤

코드

를실

행할

지를

컴파

일타

임에

결정

–sta

tic b

indin

g 또

는early

bin

din

g

�동

적결

합–

봐가

면서

하겠

다.

–함

수이

름에

따라

어떤

코드

를실

행할

지를

프로

그램

실행

시간

에결

–dyn

am

ic b

indin

g 또

는la

te b

indin

g

업 업업업캐

스팅

캐스

팅캐

스팅

캐스

팅, , , , 다

운다

운다

운다

운캐

스팅

캐스

팅캐

스팅

캐스

�업

캐스

팅–

파생

클래

스의

참조

나포

인터

를기

초클

래스

의참

조나

포인

터로

변환

하는

것–

Bra

ssPlu

sx;

Bra

ss*

y = &

x; B

rass&

z =

x;

–B

rassPlu

sPlu

sxx

; B

rass*

yy= &

xx;

�다

운캐

스팅

–기

초클

래스

의참

조나

포인

터를

파생

클래

스의

참조

나포

인터

로변

환하

는것 –

명시

적인

데이

터형

변환

필요

–기

초클

래스

에없

는것

을참

조하

면런

타임

에러

발생

(그림

13.4

)

동적

동적

동적

동적

결합

에결

합에

결합

에결

합에

대한

대한

대한

대한

논의

들논

의들

논의

들논

의들

�동

적결

합이

더멋

져보

인다

!–

왜두

종류

의결

합이

있는

가? (

836,8

37쪽

)–

왜정

적결

합이

디폴

트인

가?

–동

적결

합은

어떻

게동

작하

는가

?

�효

율성

–동

적결

합은

실행

시간

에객

체를

결정

해야

하므

로,

정적

결합

보다

느리

다.

–상

속을

하지

않을

거라

면정

적결

합으

로충

분하

다.

–사

용하

지않

을지

모르

는기

능때

문에

미리

부담

을떠

안지

않는

다. –

비야

네스

트롭

스트

�개

념모

델–

virtual 을

쓰지

않는

것으

로,

파생

클래

스에

서재

정의

되기

를원

하지

않는

메쏘

드들

은동

적결

합을

안한

다고

공공

연히

알림

�837쪽

팁�

그렇

다면

Java

의final cla

ss처

럼아

예막

을수

있는

방법

은? (

시험

문제

)�

그렇

다면

Java

의경

우,

가상

함수

는어

떻게

하면

되는

것일

까? (

역시

시험

문제

)

가상

가상

가상

가상

함수

의함

수의

함수

의함

수의

동작

동작

동작

동작

�가

상함

수테

이블

(vta

ble

) –

가상

함수

의주

소저

장(8

39쪽

)

�클

래스

에숨

겨진

멤버

–가

상함

수테

이블

의포

인터

�가

상함

수실

행순

서1.

그객

체클

래스

의vt

able

주소

획득

2.

vtable

에서

함수

주소

획득

3.

함수

실행

�자

원(메

모리

와속

도)의

부담

–클

래스

에대

해가

상함

수테

이블

–객

체마

다가

상함

수테

이블

포인

–테

이블

에접

근하

는단

계(indirect addre

ssin

g)

가상

가상

가상

가상

메쏘

드메

쏘드

메쏘

드메

쏘드

( (((함수

함수

함수

함수

) ) ) ) 정

리정

리정

리정

리(8

40

(840

(840

(840쪽 쪽쪽쪽

) )))

�vi

rtual 로

시작

–기

초클

래스

, 파

생클

래스

에대

해가

상메

쏘드

가됨

�포

인터

나참

조를

쓰게

되면

동적

결합

�파

상클

래스

에서

다시

정의

하고

싶은

메쏘

드는

가상

함수

로선

언하

�생

성자

–가

상함

수로

선언

할수

없다

�파

괴자

–상

속할

생각

이면

가상

으로

선언

해야

한다

. 디

폴트

로만

들게

하지

말고

무조

건선

언하

고정

함수

함수

함수

함수

오버

로딩

과오

버로

딩과

오버

로딩

과오

버로

딩과

파생

파생

파생

파생

클래

스의

클래

스의

클래

스의

클래

스의

오버

라이

오버

라이

오버

라이

오버

라이

딩 딩딩딩(8

42

(842

(842

(842쪽 쪽쪽쪽

) )))

�어

떤함

수를

파생

클래

스에

서다

시정

의하

면시

그너

처와

는무

관하

게같

은이

름을

가진

모든

함수

를가

려버

림(o

verr

ide)

�따

라서

상속

된메

쏘드

를정

의할

때는

기초

클래

스의

메쏘

드와

정확

히일

치시

켜야

혼란

이없

음�

단, 리

턴형

이기

초클

래스

의참

조나

포인

터이

면파

생클

래스

의참

조나

포인

터로

대체

됨(리

턴형

의공

변)

�또

한기

초클

래스

선언

이오

버로

딩되

어있

으면

파생

클래

스에

서는

모두

재정

의하

도록

한다

Pro

tecte

dPro

tecte

dPro

tecte

dPro

tecte

d

�파

생클

래스

에서

는접

근가

�이

건과

연쓸

만한

가? �

설계

자가

정한

인터

페이

스로

만데

이터

를바

꾼다

는원

칙(8

45쪽

)

�Sin

gle

ton 패

턴–

정확

하게

한개

의객

체만

만들

어서

호출

한쪽

에게

그객

체만

리턴

하게

한다

추상

화추

상화

추상

화추

상화

기초

기초

기초

기초

클래

스클

래스

클래

스클

래스

(ABC

)(A

BC

)(A

BC

)(A

BC

)

�구

현되

지않

는,

즉선

언만

하고

정의

는하

지않

는,

순수

가상

함수

를가

지고

있는

클래

�순

수가

상함

수는

함수

선언

뒤에

“=0”

붙임

(849쪽

) �

인터

페이

스의

개념

�왜

필요

한가

?–

원과

타원

의예

, 사

각형

과정

사각

형의

–B

aseElli

pse를

Circle

과Elli

pse로

상속

�B

rass와

Bra

ssPlu

s클

래스

에적

용(8

50쪽

~)

AB

C

AB

C

AB

C

AB

C 철

학철

학철

학철

�추

상화

기초

클래

스만

기초

클래

스가

되게

해야

한다

는주

장이

있음

(856쪽

노트

) –

Java

에서

인터

페이

스를

만드

는것

과비

파생

파생

파생

파생

클래

스에

서클

래스

에서

클래

스에

서클

래스

에서

동적

동적

동적

동적

메모

리메

모리

메모

리메

모리

할당

할당

할당

할당

�첫

번째–

파생

클래

스가

new

를사

용안

함(8

56쪽

)

–파

생클

래스

에서

명시

적파

괴자

, 복

사생

성자

, 대

입연

산자

따로

구현

할필

요없

음�

기초

클래

스에

서알

아서

해줌

�두

번째–

파생

클래

스가

new

를사

용(8

58쪽

)

–파

괴자

에선

자신

이new

한것

만dele

te

–복

사생

성자

에선

기초

클래

스복

사생

성자

먼저

호출

(859

쪽중

간코

드) �

인수

는파

생클

래스

참조

를전

달해

도무

관(업

캐스

팅)

–아

무것

도쓰

지않

으면

디폴

트생

성자

자동

호출

–대

입연

산자

의경

우자

기대

입점

검후

에바

로기

초클

래스

의대

입연

산자

실행

(860쪽

코드

)

파생

파생

파생

파생

클래

스에

서클

래스

에서

클래

스에

서클

래스

에서

프렌

드프

렌드

프렌

드프

렌드

함수

에함

수에

함수

에함

수에

의한

의한

의한

의한

연산

연산

연산

연산

자 자자자오

버로

딩오

버로

딩오

버로

딩오

버로

�opera

tor<

<

–받

은파

생클

래스

객체

를가

지고

, 기

초클

래스

로강

제로

형변

환한

후호

출(8

65쪽

)