7. 상속 (inheritance) 의이해 상속의기본개념 상속의생성자, 소멸자 protected 멤버 Jong Hyuk Park
상속의기본개념 Jong Hyuk Park
상속의기본개념 상속의예 1 " 철수는아버지로부터좋은목소리와큰키를물려받았다." 상속의예 2 "Student 클래스가 Person 클래스를상속한다." 아버지 Person 철수 Stduent 3
파생클래스 (derived class) 상속 (inheritance) 한클래스가다른클래스에서정의된속성 ( 자료, 함수 ) 를이어받아그대로사용 이미정의된클래스를바탕으로필요한기능을추가하여정의 소프트웨어재사용지원 파생클래스는 C++ 에서각클래스의속성을공유하고물려받는객체지향프로그래밍의상속 (inheritance) 을구현한것 이미만들어진기존의클래스를베이스클래스 (base class) 또는부모클래스 (parent class) 이를상속받아새로만들어지는클래스를파생클래스 (derived class) 라함 4
공용부분상속 class 파생클래스명 : public[private] 베이스클래스명 ; public 베이스클래스 파생클래스 전용부분 공용부분 상속 전용부분 공용부분 private 전용부분 베이스클래스 상속 파생클래스 전용부분 공용부분 공용부분 5
베이스클래스와파생클래스예 class Person int age; char name[20]; int GetAge() const const char* GetName() const Person(int _age=1, char* _name="noname") ; Derived class class Student: public Person char major[20]; // 전공 ; Student(char* _major) const char* GetMajor() const void ShowData() const Base class 6
public 상속예 1 7 #include <iostream> using std::endl; using std::cout; class Person int age; char name[20]; ; int GetAge() const return age; const char* GetName() const return name; Person(int _age=1, char* _name="noname") age=_age; strcpy(name, _name); class Student: public Person char major[20]; // 전공 Student(char* _major) strcpy(major, _major); const char* GetMajor() const return major; void ShowData() const cout<<" 이름 : "<<GetName()<<endl; cout<<" 나이 : "<<GetAge()<<endl; cout<<" 전공 : "<<GetMajor()<<endl; ; int main(void) Student Kim("computer"); Kim.ShowData(); ; return 0;
public 상속예 2 #include <iostream> using std::endl; using std::cout; class Point // 베이스클래스 Point int px,py; void setpt(int x, int y) px = x; py = y; int getx() return px; int gety() return py; ; class Circle : public Point // Point 의파생클래스 Circle float r; void setrd(float d) r = d; float area() return 3.14*r*r; ; int main() Circle c; c.setpt(10,20); // 베이스클래스의멤버호출 c.setrd(12.5); // 베이스클래스의멤버호출 cout << "Center of Circle : x = " << c.getx(); cout << ", y = " << c.gety() << endl; cout << "Area of circle : " << c.area() << endl; return 0; Center of Circle : x = 10, y = 20 Area of circle : 490.625 베이스클래스 Point 의공용멤버 setpt(), getx(), gety() 함수를 Point 의파생클래스인 Circle 이공용멤버로상속받아서객체 c 가호출한예이다. 8
private 상속예 #include <iostream> using std::endl; using std::cout; int main() Circle c; 9 class Point // 베이스클래스 Point int px,py; void setpt(int x, int y) px = x; py = y; int getx() return px; int gety() return py; ; class Circle : private Point // Point 의파생클래스 Circle float r; void setrd(float d) r = d; float area() return 3.14*r*r; void center(int x, int y) setpt(x,y); // 베이스클래스의멤버 setpt() 호출 ; void showxy() cout << "Center of Circle : x = " << getx(); cout << ", y = " << gety() << '\n'; // 베이스클래스의멤버 getx(),gety() 호출 c.center(10,20); c.setrd(12.5); c.showxy(); cout << "Area of circle : " << c.area() << '\n'; return 0; Center of Circle : x = 10, y = 20 Area of circle : 490.625 베이스클래스 Point 의공용멤버 setpt(), getx(), gety() 함수를 Point 의파생클래스인 Circle 이전용멤버로상속받았기때문에클래스의외부에서는이함수들에접근할수없으므로클래스의멤버함수인 center(),showxy() 함수를통하여이함수들을상속받아호출한예이다. 클래스외부의주프로그램에서 c.setpt() 와같이호출하면 setpt() 는객체 c 의전용멤버이므로에러가발생한다.
상속의생성자, 소멸자 Jong Hyuk Park
생성자, 소멸자 베이스클래스, 파생클래스가생성자, 소멸자를갖는경우에생성자는파생되는순서에따라호출되고소멸자는파생된순서의반대로호출 파생클래스의객체가생성될때먼저베이스클래스의생성자가호출되어실행된후파생클래스의생성자가호출되어실행 소멸자인경우에는실행순서가생성자와는반대로파생클래스의소멸자가실행된후베이스클래스의소멸자가실행 베이스클래스의생성자에인수를전달하고자하는경우파생클래스의생성자를정의할때베이스클래스에전달될인수를다음과같이기술 파생클래스 _ 생성자명 ( 인수리스트 ) : 베이스클래스 _ 생성자명 ( 인수리스트 ) ; 11
상속의생성자예 1 12 #include <iostream> using std::endl; using std::cout; class AAA //Base 클래스 AAA() cout<<"aaa() call!"<<endl; AAA(int i) cout<<"aaa(int i) call!"<<endl; ; class BBB : public AAA //Derived 클래스 BBB() cout<<"bbb() call!"<<endl; BBB(int j): AAA(j) cout<<"bbb(int j) call!"<<endl; ; int main(void) cout << " 객체 1 생성 " << endl; BBB bbb1; cout << " 객체 2 생성 " << endl; BBB bbb2(10); return 0; 객체 1 생성 AAA() call! BBB() call! 객체 2 생성 AAA(int i) call! BBB(int j) call!
상속의생성자예 2 #include <iostream> using std::endl; using std::cout; class Person int age; char name[20]; ; int GetAge() const return age; const char* GetName() const return name; Person(int _age=1, char* _name="noname") age=_age; strcpy(name, _name); class Student: public Person char major[20]; // 전공 Student(int _age, char* _name, char* _major) age=_age; // 컴파일에러 strcpy(name, _name); // 컴파일에러 strcpy(major, _major); const char* GetMajor() const return major; void ShowData() const cout<<" 이름 : "<<GetName()<<endl; cout<<" 나이 : "<<GetAge()<<endl; cout<<" 전공 : "<<GetMajor()<<endl; ; int main(void) Student Kim(20, "Hong Gil Dong", "computer"); Kim.ShowData(); ; return 0; 13
14 상속의생성자예 3 #include <iostream> using std::endl; using std::cout; class Person int age; char name[20]; ; int GetAge() const return age; const char* GetName() const return name; Person(int _age=1, char* _name="noname") age=_age; strcpy(name, _name); class Student: public Person char major[20]; // 전공 Student(int _age, char* _name, char* _major) : Person(_age, _name) strcpy(major, _major); const char* GetMajor() const return major; void ShowData() const cout<<" 이름 : "<<GetName()<<endl; cout<<" 나이 : "<<GetAge()<<endl; cout<<" 전공 : "<<GetMajor()<<endl; ; int main(void) Student Kim(20, "Hong Gil Dong", "computer"); Kim.ShowData(); return 0; ;
15 #include <iostream> using std::endl; using std::cout; 상속의소멸자예 class AAA //Base 클래스 AAA() cout<<"aaa() call!"<<endl; ~AAA() cout<< ~AAA(int i) call!"<<endl; ; class BBB : public AAA //Derived 클래스 BBB() cout<<"bbb() call!"<<endl; ~BBB() cout<<"~bbb() call!"<<endl; ; int main(void) BBB bbb; return 0; AAA() call! BBB() call! ~BBB() call! ~AAA() call!
protected 멤버 Jong Hyuk Park
protected 멤버상속 (1) 파생클래스의멤버함수는베이스클래스의공용멤버에직접접근이가능하지만베이스클래스의전용멤버에대해서는접근할수없음 파생클래스의멤버함수가베이스클래스의전용멤버를상속받아자유로이사용을위해서는다음두가지방식사용 프렌드함수를사용 베이스클래스정의시 protected 키워드를사용한보호부분을정의 보호부분에있는멤버는전용멤버와같이외부에서는직접접근할수없지만파생클래스의멤버함수에서는직접접근이가능 보호부분멤버가파생클래스에서 public으로상속받으면파생클래스의 protected 멤버가됨 private으로상속받으면파생클래스에서전용부분멤버가됨 17
protected 멤버상속 (2) class 클래스명 [private:] protected: // 전용부분멤버정의 // 클래스외부접근및상속안됨 // 보호부분멤버정의 // 클래스외부접근안됨, 상속됨 // 공용부분멤버정의 // 클래스외부접근및상속됨 ; Base 클래스 상속형태 public 상속 protected 상속 private 상속 public 멤버 public protected private Protected 멤머 protected protected private Private 멤버접근불가접근불가접근불가 18
세가지형태의상속 class Base private: int a; protected: int b; int c; ; int main(void) Derived object; return 0; ; class Derived : public Base // public 상속 // EMPTY ; 19
protected 멤버상속예 1 class AAA private: int a; protected: int b; ; class BBB: public AAA void SetData() a=10; // private 멤버, 따라서에러 b=10; // protected 멤버, OK! ; int main(void) AAA aaa; aaa.a=10; // private 멤버, 따라서에러 aaa.b=20; // protected 멤버, 따라서에러!! BBB bbb; bbb.setdata(); return 0; 20
protected 멤버상속예 2 21 #include <iostream> using std::endl; using std::cout; class Person protected: int age; char name[20]; ; int GetAge() const return age; const char* GetName() const return name; Person(int _age=1, char* _name="noname") age=_age; strcpy(name, _name); class Student: public Person char major[20]; // 전공 Student(int _age, char* _name, char* _major) age=_age; strcpy(name, _name); strcpy(major, _major); const char* GetMajor() const return major; void ShowData() const cout<<" 이름 : "<<GetName()<<endl; cout<<" 나이 : "<<GetAge()<<endl; cout<<" 전공 : "<<GetMajor()<<endl; ; int main(void) Student Kim(20, "Hong Gil Dong", "computer"); Kim.ShowData(); return 0; ;
상속을하는이유 문제의도입 운송수단에관련된클래스정의 자동차 (car), 열차 (train), 선박 (ship), 비행기 (Airplane) 등등 class Airpalne int passenger; // 탑승인원 int baggage; // 수하물의무게 int crew_man; // 승무원인원 Airpalne(int p=0, int w=0, int c=0); void Ride(int person); // 탑승하다. void Load(int weight) // 짐을싣다. void TakeCrew(int crew) // 승무원탑승 class Train int passenger; // 탑승인원 int baggage; // 수하물의무게 int length; // 열차의칸수 Train(int p=0, int w=0, int l=0); void Ride(int person); // 탑승하다. void Load(int weight); // 짐을싣다. void SetLength(int len); // 열차의칸수설정 ; 22
상속을하는이유 문제의해결 class Vehicle int passenger; int baggage; Vehicle(int person=0, int weight=0); void Ride(int person); // 탑승하다. void Load(int weight); // 짐을싣다. ; Airplane Train 23
과제 1. 연습문제 7-2: Person 클래스프로그램 2. 7-8 절의은행계좌관리과제프로그램에다음을추가하여라 고객의전화번호정보를추가하여라. 전화번호는다음과같이 private 으로선언하라. char *phone; ( 이름, 전화번호 ) 와계좌번호로잔액조회를하는 Inquire() 오버로딩함수를작성하여라. void Inquire(char *name, char *phone); void Inquire(int id); 24
Jong Hyuk Park