Microsoft PowerPoint - additional08.ppt [호환 모드]

Similar documents
윤성우의 열혈 TCP/IP 소켓 프로그래밍

C++ Programming

Microsoft PowerPoint - additional07.ppt [호환 모드]

PowerPoint Template

PowerPoint Template

Microsoft PowerPoint - Chapter 6.ppt

윤성우의 열혈 TCP/IP 소켓 프로그래밍

윤성우의 열혈 TCP/IP 소켓 프로그래밍

윤성우의 열혈 TCP/IP 소켓 프로그래밍

Microsoft PowerPoint - additional06.ppt [호환 모드]

쉽게 풀어쓴 C 프로그래밍

<4D F736F F F696E74202D2038C0E55FB0ADC0C7B3EBC6AE28B0A1BBF3C7D4BCF6BFCD20B4D9C7FCBCBA29>

gnu-lee-oop-kor-lec06-3-chap7

Microsoft PowerPoint - additional01.ppt [호환 모드]

설계란 무엇인가?

1. auto_ptr 다음프로그램의문제점은무엇인가? void func(void) int *p = new int; cout << " 양수입력 : "; cin >> *p; if (*p <= 0) cout << " 양수를입력해야합니다 " << endl; return; 동적할

1. 객체의생성과대입 int 형변수 : 선언과동시에초기화하는방법 (C++) int a = 3; int a(3); // 기본타입역시클래스와같이처리가능 객체의생성 ( 복습 ) class CPoint private : int x, y; public : CPoint(int a

C++ Programming

Microsoft PowerPoint - C++ 5 .pptx

Slide 1

PowerPoint Presentation

JAVA PROGRAMMING 실습 08.다형성

쉽게 풀어쓴 C 프로그래밍

C++ Programming

1. 상속의기본개념 다음과같은문제를위한클래스설계 자동차 속성 : 색상, 배기량, 현재속도 메서드 : 가속하라, 멈춰라, 시동을켜라 트럭 속성 : 색상, 배기량, 현재속도, 최대중량 메서드 : 가속하라, 멈춰라, 시동을켜라 택시 속성 : 색상, 배기량, 현재속도, 요금,

Microsoft PowerPoint - Chapter 10.ppt

C++ Programming

Slide 1

(Microsoft Word - \301\337\260\243\260\355\273\347.docx)

PowerPoint Presentation

Microsoft PowerPoint - additional03.ppt [호환 모드]

윤성우의 열혈 TCP/IP 소켓 프로그래밍

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2

PowerPoint 프레젠테이션

PowerPoint Template

1. 기본형의형변환복습 C/C++ 형변환의종류 자동형변환 ( 묵시적형변환 ) 강제형변환 ( 명시적형변환 ) 기본형의자동형변환의예 1. 배열 to 포인터변환 배열명은해당배열의첫번째원소의 주소로변환됨 int ary[10]; int *pary = ary; 2. 함수 to 포

PowerPoint Presentation

슬라이드 1

Chapter 6 Objects and Classes

JAVA PROGRAMMING 실습 05. 객체의 활용

C++ 기본문법 정리

Microsoft PowerPoint - Chapter 1-rev

<4D F736F F F696E74202D2036C0CFC2B05FB0B4C3BCC1F6C7E2C7C1B7CEB1D7B7A1B9D62E707074>

(Microsoft PowerPoint - 07\300\345.ppt [\310\243\310\257 \270\360\265\345])

Microsoft PowerPoint - 8ÀÏ°_Æ÷ÀÎÅÍ.ppt

1. 클래스와배열 int 형배열선언및초기화 int ary[5] = 1, 2, 3, 4, 5 ; for (int i = 0; i < 5; i++) cout << "ary[" << i << "] = " << ary[i] << endl; 5 장클래스의활용 1

Microsoft PowerPoint - additional-11_13l.ppt [호환 모드]

Microsoft PowerPoint - 6주차.pptx

PowerPoint Template

4 장클래스와객체 클래스와객체 public과 private 구조체와클래스객체의생성과생성자객체의소멸과소멸자생성자와소멸자의호출순서디폴트생성자와디폴트소멸자멤버초기화멤버함수의외부정의멤버함수의인라인함수선언 C++ 프로그래밍입문

chap10.PDF

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

080629_CFP °ø°³¿ë.hwp

JAVA PROGRAMMING 실습 07. 상속

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - Chap12-OOP.ppt

Microsoft PowerPoint - chap06-2pointer.ppt

Microsoft PowerPoint - chap11

Microsoft PowerPoint - Chapter 4-rev

(Microsoft PowerPoint - java2-lecture3.ppt [\310\243\310\257 \270\360\265\345])

Microsoft PowerPoint - java2 [호환 모드]

금오공대 컴퓨터공학전공 강의자료

프입2-강의노트-const-friend-static

쉽게 풀어쓴 C 프로그래밍

The C++ Programming Language 5 장포인터, 배열, 구조체 5.9 연습문제 다음의선언문을순서대로작성해보자. 문자에대한포인터, 10개정수의배열, 10개정수의배열의참조자, 문자열의배열에대한포인터, 문자에대한포인터에대한포인터, 상수정수, 상수

8. 클래스 D는클래스 A, 클래스 B, 클래스 C로부터상속받아맊들고싶다. 아래빈칸을채우시오. ( 대소문자주의하시오 ) class D { ; Student s; 11. 다음프로그램의실행결과는? 9. 다음프로그램의실행결과는? class A{ A(){cout << " 생성

PowerPoint 프레젠테이션

윤성우의 열혈 TCP/IP 소켓 프로그래밍

Microsoft PowerPoint - 2강

Microsoft PowerPoint - [2009] 02.pptx

PowerPoint Presentation

Microsoft PowerPoint - CSharp-10-예외처리

Design Issues

(Microsoft PowerPoint - 11\300\345.ppt [\310\243\310\257 \270\360\265\345])

PowerPoint Presentation

PowerPoint Presentation

Slide 1

JAVA PROGRAMMING 실습 02. 표준 입출력

BACK TO THE BASIC C++ 버그 헌팅: 버그를 예방하는 11가지 코딩 습관

11장 포인터

C프로-3장c03逞풚

Slide 1

C++ 기본문법 정리

PowerPoint 프레젠테이션

<432B2BC7C1B7CEB1D7B7A1B9D628BABBB9AE5FC3D6C1BE295B315D2E687770>

Programming hwp

설계란 무엇인가?

강의계획서 1. 강의개요 학습과목명 객체지향프로그래밍 Ⅰ 학점 3 학점교 강사명교 강사전화번호 강의시간 4시간강의실수강대상 2. 교과목학습목표 4차산업혁명시대의도래로컴퓨터와프로그래밍에대한관심이커지고있으며, 여러분야에서소프트웨어의중요성을강조하며, 새시대를이끌

설계란 무엇인가?

Microsoft PowerPoint - 9ÀÏ°_ÂüÁ¶ÀÚ.ppt

PowerPoint Template

프입2-강의노트-C++기초

기초컴퓨터프로그래밍

3. 1 포인터란 3. 2 포인터변수의선언과사용 3. 3 다차원포인터변수의선언과사용 3. 4 주소의가감산 3. 5 함수포인터

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

1. 표준입출력 C++ : C의모든라이브러리를포함 printf, scanf 함수사용가능예 : int, double, 문자열값을입력받고출력하기 #include <cstdio> int ivar; double dvar; char str[20]; printf("int, dou

2 247, Dec.07, 2007

쉽게 풀어쓴 C 프로그래밍

제11장 프로세스와 쓰레드

17장 클래스와 메소드

Transcription:

8. 상속과다형성 (polymorphism) 상속된객체와포인터 / 참조자의관계 정적바인딩과동적바인딩 virtual 소멸자 Jong Hyuk Park

상속의조건 public 상속은 is-a 관계가성립되도록하자. 일반화 ParttimeStd 구체화 2

상속의조건 잘못된상속의예 현실세계와완전히동떨어진모델이형성됨 3

상속의조건 HAS-A( 소유 ) 관계에의한상속! 경찰은몽둥이를소유한다 The Police have a cudgel. 상속은소유를표현하기위해서도사용함 4

#include <iostream> using std::endl; using std::cout; 예제 1 class Cudgel // 몽둥이 void Swing() cout<<"swing a cudgel!"<<endl; int main() Police pol; pol.useweapon(); class Police : public Cudgel // 몽둥이를소유하는경찰 return 0; void UseWeapon() Swing(); Police is a Cudgel (X) Police has a Cudgel (O)

상속의조건 HAS-A 에의한상속그리고대안! 포함관계를통해서소유관계를표현 객체멤버에의한포함관계의형성 예제 2 객체포인터멤버에의한포함관계의형성 예제 3 6

상속의조건 /* 예제2 */ class Cudgel // 몽둥이 void Swing() cout<<"swing a cudgel!"<<endl; class Police // 몽둥이를소유하는경찰 Cudgel cud; // 클래스객체멤버 or 객체멤버 void UseWeapon() cud.swing(); int main() Police pol; pol.useweapon(); return 0; 7

8 상속의조건 /* 예제3 */ class Cudgel // 몽둥이 void Swing() cout<<"swing a cudgel!"<<endl; class Police // 몽둥이를소유하는경찰 Cudgel* cud; Police() cud=new Cudgel; ~Police() delete cud; void UseWeapon() cud->swing(); int main() Police pol; pol.useweapon(); return 0;

상속된객체와포인터 / 참조자의관계 Jong Hyuk Park

상속된객체와포인터관계 객체포인터 객체의주소값을저장할수있는포인터 AAA 클래스의포인터는 AAA 객체의주소뿐만아니라 AAA 클래스를상속하는 Derived 클래스의객체의주소값도저장가능 AAA 클래스의참조자는 AAA 객체뿐만아니라 AAA 클래스를상속하는 Derived 클래스의객체도참조가능 10

객체의포인터예 CPointer1.cpp #include <iostream> int main(void) using std::endl; using std::cout; Person* p1=new Person; class Person Person* p2=new Student; t Person* p3=new PartTimeStd; void Sleep() cout<<"sleep"<<endl; <<endl; p1->sleep(); p2->sleep(); class Student : public Person p3->sleep(); int main(void) return 0; Person* p1=new PartTimeStd; void Study() Student* p2=new PartTimeStd; cout<<"study"<<endl; PartTimeStd * p3=new PartTimeStd; class PartTimeStd : public Student p1->sleep(); p2->sleep(); 11 void Work() cout<<"work"<<endl; p3->sleep(); return 0;

상속된객체의포인터, 참조자 객체포인터의권한 포인터를통해서접근할수있는객체멤버의영역 AAA 클래스의객체포인터는 AAA 클래스의멤버와 AAA 클래스가상속받은 Base 클래스의멤버만접근가능 AAA 클래스의참조자는 AAA 클래스의멤버와 AAA 클래스가상속받은 Base 클래스의멤버만접근가능 12

CPointer2.cpp 13 객체포인터의권한예 #include <iostream> using std::endl; using std::cout; class Person void Sleep() cout<<"sleep"<<endl; class Student : public Person int main(void) id Person* p3=new PartTimeStd; void Study() cout<<"study"<<endl; " dl p3->sleep(); p3->study(); //! 에러 p3->work(); //! 에러 class PartTimeStd : public Student void Work() cout<<"work"<<endl; return 0;

상속된객체와참조관계 객체의레퍼런스 객체를참조할수있는레퍼런스 클래스포인터의특성과일치 CReference1. cpp 객체레퍼런스의권한 객체를참조하는레퍼런스의권한 클래스포인터의권한과일치 CReference2. cpp 14

CReference1. cpp #include <iostream> 객체의참조자예 using std::endl; using std::cout; class Person void Sleep() cout<<"sleep"<<endl; class Student : public Person void Study() cout<<"study"<<endl; <<endl; class PartTimeStd : public Student void Work() cout<<"work"<<endl; <<endl; 15 int main(void) PartTimeStd p; Student& ref1=p; Person & ref2=p; p.sleep(); ref1.sleep(); ref2.sleep(); return 0;

객체참조자의권한예 CReference2. cpp #include <iostream> using std::endl; using std::cout; class Person void Sleep() cout<<"sleep"<<endl; class Student : public Person void Study() cout<<"study"<<endl; int main(void) PartTimeStd p; Person& ref=p; class PartTimeStd : public Student ref.sleep(); void Work() cout<<"work"<<endl; ref.study(); //! 에러 ref.work(); //! 에러 return 0; 16

정적바인딩과동적바인딩 Jong Hyuk Park

오버라이딩 (overriding) 오버라이딩 (Overriding) 의이해 Base 클래스에선언된멤버와같은형태의멤버를 Derived 클래스에서선언 Base 클래스의멤버를가리는효과! 보는시야 (Pointer) 에따라서달라지는효과! Overriding1.cpp, Overriding2.cpp 18

오버라이딩 (overriding) 베이스클래스에서선언된함수를파생클래스에서다시선언 Overriding1.cpp #include <iostream> using std::endl; using std::cout; class AAA void fct() cout<<"aaa"<<endl; int main(void) BBB b; b.fct(); return 0; 19 class BBB : public AAA void fct() cout<<"bbb"<<endl; BBB

Overriding2.cpp #include <iostream> using std::endl; using std::cout; class AAA void fct() cout<<"aaa"<<endl; class BBB : public AAA void fct() cout<<"bbb"<<endl; 오버라이딩예 int main(void) BBB* b=new BBB; b->fct(); AAA* a=b; a->fct(); delete b; return 0; BBB AAA 20

가상함수 (virtual function) 멤버함수를가상 (virtual) 로선언 오버라이딩되는경우의특징은? - Overriding3.cpp Virtual 의특성도상속된다. - Overriding4.cpp 21

가상함수예 Overriding3.cpp #include <iostream> using std::endl; using std::cout; class AAA virtual void fct() // 가상함수 cout<<"aaa"<<endl; class BBB : public AAA void fct() cout<<"bbb"<<endl; <<endl; int main(void) BBB* b=new BBB; b->fct(); BBB BBB AAA* a=b; a->fct(); delete b; return 0; 22

가상함수특성상속예 Overriding4.cpp #include <iostream> using std::endl; using std::cout; class AAA virtual void fct() // 가상함수 cout<<"aaa"<<endl; class BBB : public AAA void fct() // virtual void fct() cout<<"bbb"<<endl; class CCC : public BBB void fct() cout<<"ccc"<<endl; <<endl; 23 int main(void) id) BBB* b=new BBB; b->fct(); CCC CCC AAA* a=b; a->fct(); delete b; return 0;

바인딩 (binding) 과다형성 바인딩 정적바인딩 (static binding) 컴파일시 (compile-time) 호출되는함수를결정 동적바인딩 (dynamic binding) 실행시 (run-time) 호출되는함수를결정 오버라이딩된함수의호출 Overriding5.cpp 24

바인딩예 #include <iostream> using std::endl; using std::cout; class AAA virtual void fct() // 가상함수 cout<<"aaa"<<endl; class BBB : public AAA void fct() cout<<"bbb"<<endl; int main(void) BBB b; b.fct(); // 정적바인딩 ` BBB BBB AAA* a=new BBB; a->fct(); // 동적바인딩 delete b; return 0; 25

오버라이딩된함수호출예 #include <iostream> using std::endl; using std::cout; class AAA virtual void fct() cout<<"aaa"<<endl; <<endl; class BBB : public AAA void fct() AAA::fct(); // 방법 1. cout<<"bbb"<<endl; int main(void) AAA* a=new BBB; cout<<" 첫번째시도 "<<endl; a->fct(); cout<<" 두번째시도 "<<endl; a->aaa::fct(); // 방법 2. return 0; 첫번째시도 AAA BBB 두번째시도 AAA 26

바인딩 (binding) 과다형성 다형성 (polymorphism) 같은모습의형태가다른특성 a->fct() ft() 예 a라는포인터 ( 모습 ) 가가리키는대상에따라호출되는함수 ( 형태 ) 가다름 함수오버로딩, 동적바인딩등이다형성의예 27

순수가상함수 순수가상함수 (pure virtual function) 베이스클래스에서는어떤동작도정의되지않고함수의선언만을하는가상함수 순수가상함수를선언하고파생클래스에서이가상함수를중복정의하지않으면컴파일시에에러가발생 하나이상의멤버가순수가상함수인클래스를추상클래스 (abstract class) 라함 완성된클래스가아니기때문에객체화되지않는클래스 베이스클래스에서다음과같은형식으로선언 virtual 자료형함수명 ( 인수리스트 ) = 0; 28

순수가상함수예 (1) #include <iostream> using std::endl; using std::cout; class Date // 베이스클래스 protected:` int year,month,day; Date(int y,int m,int d) year = y; month = m; day = d; virtual void print() = 0; // 순수가상함수 class Adate : public Date // 파생클래스 Adate Adate(int y,int m,int d) : Date(y,m,d) /* no operation */ void print() // 가상함수 cout << year << '.' << month << '.' << day << ".\n"; class Bdate : public Date // 파생클래스 Bdate Bdate(int y,int m,int d) : Date(y,m,d) /* no operation */ void print(); // 가상함수 29 void Bdate::print() static char *mn[] = "Jan.", "Feb.", "Mar.", "Apr.", "May", "June""July", July, "Aug Aug. ","Sep Sep. ","Oct Oct. ", "Nov.","Dec." cout << mn[month-1] << ' ' << day << ' ' << year << '\n'; int main() Adate a(1994,6,1); 1) Bdate b(1945,8,15); Date &r1 = a, &r2 = b; // 참조자 r1.print(); r2.print(); return 0; 1994.6.1. 1 Aug. 15 1945

virtual 소멸자 Jong Hyuk Park

virtual 소멸자 파생클래스를가리키는베이스클래스의포인터가가리키는객체의소멸시에는파생클래스의소멸자를호출하지않음 virtual 소멸자 객체소멸시베이스클래스뿐만아니라파생클래스의소멸자도호출 소멸자앞에 virtual 키워드 31

32 virtual 소멸자필요성예 #include <iostream> using std::endl; using std::cout; class AAA char* str1; AAA(char* _str1) str1= t1 new char[strlen(_str1)+1]; [tl t 1] strcpy(str1, _str1); ~AAA() cout<<" ~AAA() call!"<<endl; delete []str1; virtual void ShowString() cout<<str1<<' '; class BBB : public AAA char* str2; BBB(char* _str1, char* _str2) : AAA(_str1) str2= new char[strlen(_str2)+1]; str2)+1]; strcpy(str2, _str2); ~BBB() cout<<"~bbb() call!"<<endl; delete []str2; virtual void ShowString() AAA::ShowString(); cout<<str2<<endl; int main() AAA * a=new BBB("Good", "evening"); BBB * b=new BBB("Good", "morning"); a->showstring(); b->showstring(); cout<<"-----객체소멸직전----"<<endl; delete a; // AAA 소멸자만호출 delete b; // BBB,AAA 소멸자호출 return 0; Good evening Good morning -----객체소멸직전---- ~AAA() call! ~BBB() call! ~AAA() call!

Virtual 소멸자의필요성 상속하고있는클래스객체소멸문제점 33

34 virtual 소멸자예 #include <iostream> using std::endl; using std::cout; class AAA char* str1; AAA(char* _str1) str1= t1 new char[strlen(_str1)+1]; [tl t 1] strcpy(str1, _str1); virtual ~AAA() cout<<" ~AAA() call!"<<endl; delete []str1; virtual void ShowString() cout<<str1<<' '; class BBB : public AAA char* str2; BBB(char* _str1, char* _str2) : AAA(_str1) str2= new char[strlen(_str2)+1]; str2)+1]; strcpy(str2, _str2); ~BBB() cout<<"~bbb() call!"<<endl; delete []str2; virtual void ShowString() St AAA::ShowString(); cout<<str2<<endl; int main() AAA * a=new BBB("Good", "evening"); BBB * b=new BBB("Good", "morning"); a->showstring(); b->showstring(); cout<<"-----객체소멸직전----"<<endl; delete a; // BBB, AAA 소멸자만호출 delete b; // BBB,AAA 소멸자호출 return 0; Good evening Good morning -----객체소멸직전---- ~BBB() call! ~AAA() call! ~BBB() call! ~AAA() call!

Virtual 소멸자의필요성 virtual 소멸자 virtual ~AAA() cout<<"~aaa() call!"<<endl; delete []str1; 35

Jong Hyuk Park