37
C++ 프프프프프 10 2007 프 2 프프 프프프프프프프프 프프프프프프

C++ 프로그래밍 10

  • Upload
    jerod

  • View
    51

  • Download
    0

Embed Size (px)

DESCRIPTION

C++ 프로그래밍 10. 2007 년 2 학기 전자정보공학대학 컴퓨터공학부. Outline. Review: Class 연습 Review: 상속과 포함 상속과 포함. class 연습 문제. int main(void) { Time time1(10); // 10 시 0 분 0 초 Time time2(10, 20); // 10 시 20 분 0 초      Time time3(10, 20, 30); // 10 시 20 분 30 초 time2.ShowTime(); - PowerPoint PPT Presentation

Citation preview

Page 1: C++  프로그래밍  10

C++ 프로그래밍 10

2007 년 2 학기전자정보공학대학

컴퓨터공학부

Page 2: C++  프로그래밍  10

Outline

• Review: Class 연습• Review: 상속과 포함• 상속과 포함

Page 3: C++  프로그래밍  10

class 연습 문제• 시간 (Time) 클래스

시 (hour), 분 (minute), 초 (second) 를 저장

• 출력은 2 가지 형식 [ 시 : 분 : 초 ] [ 초 ]

• main 함수를 참고

int main(void){ Time time1(10);

// 10 시 0 분 0초     Time time2(10, 20);

// 10 시 20 분 0초     Time time3(10, 20, 30);  

// 10 시 20 분 30초

     time2.ShowTime();     time2.ShowTimeinSec();     return 0;}

실행결과 [10 시 : 20 분 : 0초 ][37200초 ]

int main(void){ Time time1(10);

// 10 시 0 분 0초     Time time2(10, 20);

// 10 시 20 분 0초     Time time3(10, 20, 30);  

// 10 시 20 분 30초

     time2.ShowTime();     time2.ShowTimeinSec();     return 0;}

실행결과 [10 시 : 20 분 : 0초 ][37200초 ]

Page 4: C++  프로그래밍  10

Review: 포함• 포함을 사용한 재사용의 예

[22-1]

Page 5: C++  프로그래밍  10

Review 상속

• 상속의 예제 :

문서저장클래스문서저장클래스 HTML저장클래스HTML저장클래스

string filenamestring contentsstring filenamestring contents

string filenamestring contentsstring fontint fontsizestring fontcolor

string filenamestring contentsstring fontint fontsizestring fontcolor

Page 6: C++  프로그래밍  10

Review 상속

• 상속의 예제 :

문서저장클래스문서저장클래스

문서저장클래스의 일종인

HTML저장클래스 문서저장클래스의 일종인

HTML저장클래스

string filenamestring contentsstring filenamestring contents

string fontint fontsizestring fontcolor

string fontint fontsizestring fontcolor

string filenamestring contentsstring filenamestring contents

부모 클래스( 베이스 클래스 )

자식 클래스( 파생 클래스 )

Page 7: C++  프로그래밍  10

Review: 상속의 사용

• 상속 class 의 선언

class parent{public:

int a;};

class child : public parent{public:

int b;};

class parent{public:

int a;};

class child : public parent{public:

int b;};

Page 8: C++  프로그래밍  10

포인터 , 레퍼런스의 형변환 (1)

• 자식 클래스의 포인터로 부모 객체를 가리킬 수 없다 .

[22-20]

DocWriter dw; // 부모 클래스의 객체 생성

// 자식 클래스의 포인터 변수로 부모 객체를 가리킨다 .HTMLWriter* phw = &dw; // Error!!

Page 9: C++  프로그래밍  10

포인터 , 레퍼런스의 형변환 (2)

• 부모 클래스의 포인터로 자식 객체를 가리킬 수 있다 .

[22-22]

HTMLWriter hw; // 자식 클래스의 객체 생성

// 부모 클래스의 포인터 변수로 자식 객체를 가리킨다 .DocWriter* pDW = &hw; // OK

Page 10: C++  프로그래밍  10

포인터 , 레퍼런스의 형변환 (3)

• 레퍼런스의 경우도 포인터와 동일한 규칙을 갖는다 . 자식 클래스의 레퍼런스로 부모 객체를 참조할 수 없다 .

부모 클래스의 레퍼런스로 자식 객체를 참조할 수 있다 .

HTMLWriter hw; // 자식 클래스의 객체 생성

// 부모 클래스의 레퍼런스 변수로 자식 객체를 참조한다 .DocWriter& dw = hw; // OK

DocWriter dw; // 부모 클래스의 객체 생성

// 자식 클래스의 레퍼런스 변수로 부모 객체를 참조한다 . HTMLWriter& hw = dw; // Error!!

Page 11: C++  프로그래밍  10

접근 제어 (1)

• 접근 제어 키워드

• 접근 제어 가이드라인 외부로부터 숨겨야 하는 멤버는 protected 로 지정한다 . 그 밖의 경우는 public 으로 지정한다 . 반드시 자식 클래스에 숨기고 싶다면 private 로 지정한다 .

Page 12: C++  프로그래밍  10

접근 제어 (2)

• 상속과 관련해서 접근 제어 키워드를 실험해 보자 .class Parent{private:

int priv;protected:

int prot;public:

int pub;};

class Child : public Parent{public:

void AccessParents(){

int n;// 부모의 멤버에 접근을 시도n = priv; // 실패n = prot; // 성공n = pub; // 성공

}};

Page 13: C++  프로그래밍  10

포함과 상속의 구분

• Has-a 관계와 Is-a 관계 Has-a 관계 : A 가 B 를 가지고 ( 포함하고 ) 있는

관계• 예 ) 자동차는 타이어를 가지고 있다 .

Is-a 관계 : A 가 B 인 관계• 예 ) 사과는 과일이다 .

• 포함과 상속을 구분해서 사용하기 위한 가이드라인 Has-a 관계의 경우에는 포함을 사용한다 . Is-a 관계의 경우에는 상속을 사용한다 .

Page 14: C++  프로그래밍  10

상속의 연습 – 도형 class 만들기

Shape Class 정의하기• 맴버변수 : float _x,_y• 생성자 : Shape(float x, float y) _x 와 _y 의 값을 설정• 맴버함수 : void Draw() const

– 아래와 같은 내용 출력[SHAPE] position = ( ‘_x 값’ , ‘_y 값’ )

Rectangle Class 정의하기• Shape Class 로부터 상속• 맴버변수 : float _width, _height• 생성자 : Rectangle(float x, float y, float w, float h)• 맴버함수 : void Draw() const

– 아래와 같은 내용 출력[RECTANGLE] position = ( ‘_x 값’ , ‘_y 값’ ), size = (‘_width’, ‘_height’)

Page 15: C++  프로그래밍  10

상속의 연습 – 도형 class 만들기

Circle Class 정의하기• Shape Class 로부터 상속• 맴버변수 : float _radius• 생성자 : Circle(float x, float y, float radius)• 맴버함수 : void Draw() const

– 아래와 같은 내용 출력[CIRCLE] position = ( ‘_x 값’ , ‘_y 값’ ), radius = ‘_radius’

Page 16: C++  프로그래밍  10

상속의 연습 – 도형 class 만들기• 도형 Class 테스트

int main(){

Shape a(100,40);Rectangle b(120,40,50,20);Circle c(200,100,50);

a.Draw();b.Draw();c.Draw();

return 0;}

int main(){

Shape a(100,40);Rectangle b(120,40,50,20);Circle c(200,100,50);

a.Draw();b.Draw();c.Draw();

return 0;}

Page 17: C++  프로그래밍  10

도형 Class 의 계층도

Shape Class

Shape(float x, float y)void Draw() const

float _xfloat _y

Rectangle Class : Shape Class

Rectangle(float x, float y, float w, float h)void Draw() const

float _widthfloat _height

Circle Class : Shape Class

Circle(float x, float y, float r)void Draw() const

float _radius

Page 18: C++  프로그래밍  10

가상함수와 오버라이딩(virtual function and

overriding)

Page 19: C++  프로그래밍  10

그림 그리는 프로그램

• 여러 가지 형태의 도형을 저장하고 싶다

각각의 ARRAY??

포인터의 형변환

Page 20: C++  프로그래밍  10

포인터의 형변환

• 부모 클래스의 포인터로 자식 객체를 가리킬 수 있다 .

[22-22]

HTMLWriter hw; // 자식 클래스의 객체 생성

// 부모 클래스의 포인터 변수로 자식 객체를 가리킨다 .DocWriter* pDW = &hw; // OK

Page 21: C++  프로그래밍  10

포인터의 형변환 이용

• 1. 부모 (base) 클래스 포인터의 배열을 설정

• 2. 필요 시 마다 new 를 이용 자식 class 생성

• 3. 생성된 자식 class 의 주소를 부모 클래스 포인터에 할당

• 4. 다 사용 했으면 delete 를 이용 메모리 해제

Page 22: C++  프로그래밍  10

다양한 클래스의 객체를 배열에 담기(1)• 도형 클래스의 객체들을 배열에 담아서 사용하는 예

Shape* shapes[5] = {NULL};

shapes[0] = new Circle( 100, 100, 50);shapes[1] = new Rectangle( 300, 300, 100, 100);shapes[2] = new Rectangle( 200, 100, 50, 150);shapes[3] = new Circle(100, 300, 150);shapes[4] = new Rectangle( 200, 200, 200, 200);

for (int i = 0; i < 5; ++i)shapes[i]->Draw();

for (i = 0; i < 5; ++i){

delete shapes[i];shapes[i] = NULL;

}

Page 23: C++  프로그래밍  10

다양한 클래스의 객체를 배열에 담기(2)

• 배열과 객체들의 메모리 구조

[23-5]

Page 24: C++  프로그래밍  10

Draw 의 실행 결과가 이상하다 ??

• 부모 (base) 클래스의 함수가 호출됐다 ?!

Page 25: C++  프로그래밍  10

가상 함수

• 부모 클래스의 포인터로 자식 클래스를 가르킬 경우 : 같은 이름의 함수의 실행은 포인터 타입이 우선

• 객체의 실제 내용에 따라 불릴 순 없을까 ? 컴파일 시에 결정되지 않고 함수가 런타임 시 결정 맴버 함수의 동적인 선택 ( 동적바인딩 )! 다형성

가상함수 가상함수

Page 26: C++  프로그래밍  10

가상함수의 선언

• 부모 클래스에서함수 선언부분에virtual 이라고 추가

• 구현부분은 그대로 나둔다 .

class parent{public:

virtual void DoIt();};

class child : class parent{public:

void DoIt();};

class parent{public:

virtual void DoIt();};

class child : class parent{public:

void DoIt();};

Page 27: C++  프로그래밍  10

Draw 문제의 해결

• shape 클래스의 Draw() 선언부분 수정 virtual void Draw() const

Page 28: C++  프로그래밍  10

다형성 (Polymorphism) 과 가상함수(1)

• 다른 분야에서의 다형성의 의미

• 객체지향 프로그래밍에서의 다형성 : 타입에 관계 없이 동일한 방법으로 다룰 수 있는 능력 예 ) Circle 이나 Rectangle 객체들을 타입에 상관

없이 Shape 객체처럼 다룬다 .

[ 표 23-1]

Page 29: C++  프로그래밍  10

다형성 (Polymorphism) 과 가상함수(2)• 다형성은 객체간의 결합 (Coupling) 을 약하게 만들어서 , 객체 간의

연결을 유연하게 해준다 .

[23-7]

// 도형을 원점으로 이동하는 함수void Controller::MoveToOrigin( Shape* p ){

p->Move( 0, 0 );p->Draw();

}

Page 30: C++  프로그래밍  10

순수 가상 함수 (Pure Virtual Function)

• 부모 클래스의 가상함수의 구현을 생략 ( 구현 대신 0 을 대입 )

class parent{public:

virtual void DoIt()= 0;};

class parent{public:

virtual void DoIt()= 0;};

순수 가상 함수

Page 31: C++  프로그래밍  10

순수 가상 함수 (Pure Virtual Function)

• Shape::Draw() 함수를 순수 가상 함수로 만들어보자 .

[23-11]

class Shape{public:

virtual void Draw() const = 0;…};

/* 함수의 정의 부분도 삭제void Shape::Draw() const{

cout << "[Shape] Position = ( " << _x << ", " << _y << ")\n";

}*/

Page 32: C++  프로그래밍  10

추상 클래스

• 추상 클래스 (Abstract Class) 하나 이상의 순수 가상 함수를 포함하고 있는 클래스 추상 클래스 타입의 객체 생성은 불가능 오로지 부모 클래스로서만 사용

Page 33: C++  프로그래밍  10

추상 클래스

• Shape::Draw() 함수를 순수 가상 함수로 만드는 것의 효과 Shape 클래스의 객체를 못만듬

• 컴파일러나 다른 개발자들에게 Shape 클래스는 오로지 부모 클래스로만 사용할 것이라는 점을 알려줌

오버라이딩 (Overriding) 을 통해서만 구현• 컴파일러나 다른 개발자들에게 Shape::Draw() 함수가

자식 클래스에 의해서 오버라이딩 될 것이며 , 다형성을 통해서만 호출할 것임을 알려줌

Page 34: C++  프로그래밍  10

다양한 종류의 멤버 함수

• 상속과 관련된 멤버 함수의 종류 일반적인 멤버 함수 가상 함수 순수 가상 함수

• 어떤 종류의 멤버 함수를 만들까 ? 기본형태 멤버 함수 다형성 가상 함수 다형성을 위한 함수의 원형만 필요 순수 가상 함수

Page 35: C++  프로그래밍  10

오버로딩과 오버라이딩

• 오버로딩 (Overloading) 호출 인자가 다를 경우에 알맞은 것을 선택 ex) void DoIt( );

void DoIt(int i);

• 오버라이딩 (Overriding) 부모 객체의 함수를 자식 객체에서 재정의 ex) parent::DoIt( );

child::DoIt( );

Page 36: C++  프로그래밍  10

오버로딩과 오버라이딩• 부모 클래스에서 오버로드 된 함수 중에서 어느 것 하나라도

오버라이드 하면 나머지 다른 함수들도 모두 사용할 수 없다 .

[23-11]

class Pet{public:

void Eat();void Eat(const string& it);

string name;};

class Dog : public Pet{public:

void Eat(); // 하나만 재정의};

Page 37: C++  프로그래밍  10

오버로딩과 오버라이딩• 부모 클래스에서 오버로드 된 함수 중에서 어느 것 하나라도

오버라이드 하면 나머지 다른 함수들도 모두 사용할 수 없다 .

[23-11]

int main(){

// 강아지 생성Dog dog1;dog1.name = "Patrasche";

// 두 가지 Eat() 함수를 호출한다 .dog1.Eat();dog1.Eat( "milk" ); // Error!!

return 0;}