C++ Espresso 제8장 상속.

Slides:



Advertisements
Similar presentations
3. 메소드와 변수 SCJP 자격증 프로젝트 발표자 : 최선웅. 1. 메 소 드 개 념 2. 메 소 드 양 식 3. 메 소 드 변 수 4. 메 소 드 예 제 5. 참 고 문 헌 / 자 료 목 차.
Advertisements

© 2010 인피니티북스 All rights reserved 제 7 장 클래스의 활용 C++ Espresso.
7 장 프렌드와 연산자 중복 1 명품 C++. 친구란 ? 2 우리 집 냉장고 내 침대 우리 집 TV 우리 집 식탁 친구 친구 ? 내 가족의 일원은 아니지만 내 가족과 동일한 권한을 가진 일원으로 인정받은 사람.
5. 접근 제한자의 이해 SCJP 자격증 프로젝트 발표자 : 노효진.
01_ 가상 함수를 사용한 다형성의 구현 02_ 오버라이딩
ㅎㅎ 구조체 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스 구조체 배열.
ㅎㅎ 구조체 C++ 프로그래밍 기초 : 객체지향의 시작 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스
클래스 class, 객체 object 생성자 constructor 접근 access 제어 이벤트 event 처리.
Chap07 상속 Section 1 : 상속의 개요 Section 2 : 멤버 변수의 상속
최윤정 Java 프로그래밍 클래스 상속 최윤정
Java로 배우는 디자인패턴 입문 Chapter 5. Singleton 단 하나의 인스턴스
제6장 객체배열과 벡터 객체 배열을 이해한다. 벡터(vector) 클래스를 사용할 수 있다.
C++ Exspresso 제5장 클래스의 기초.
8. 객체와 클래스 (기본).
어서와 Java는 처음이지! 제7장 상속.
제12장 다형성과 가상함수 다형성의 개념을 이해한다. 상향 형변환의 개념을 이해한다. 가상 함수의 개념을 이해한다.
C++ Espresso 제9장 다형성.
[INA470] Java Programming Youn-Hee Han
제 6장. 생성자와 소멸자 학기 프로그래밍언어및실습 (C++).
C++ Espresso 제6장 생성자와 소멸자.
C++ Espresso 제7장 클래스의 활용.
8.1 인터페이스 개요와 인터페이스 정의 8.2 인터페이스의 사용 8.3 인터페이스의 상속 8.4 인터페이스 참조
상속이란? - 기반클래스로부터 다른 클래스를 파생하는 법 protected란? 가상함수 (virtual function)
Chap08 다중 스레드 8.1 스레드 개요 8.2 Thread 클래스와 스레드 생명주기 8.3 스레드 생성과 사용
명품 C++ 7장 프렌드와 연산자 중복.
어서와 Java는 처음이지! 제7장 상속.
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
정적 멤버 변수/정적 멤버 함수 - friend 함수/클래스 template
C++ Espresso 제12장 템플릿.
자바 5.0 프로그래밍.
C++ Programming: chapter 7 – inheritence
두근두근 파이썬 수업 13장 객체란 무엇인가요?.
제4장 클래스와 객체 객체 지향 기법을 이해한다. 클래스를 작성할 수 있다. 클래스에서 객체를 생성할 수 있다.
제7장 클래스와 객체.
패키지와 접근 제어 패키지에 대하여 접근 제어에 대하여.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
Java 6장. 클래스 : 속성 public class SumTest {
명품 C++ 8장 상속.
14. 예외처리.
13. 연산자 오버로딩.
제14장 예외처리와 템플릿 예외 처리의 개요를 학습한다. 예외 처리를 적용할 수 있다. 템플릿의 개념을 이해한다.
7장 인터페이스와 추상 클래스.
Method & library.
제5장 생성자와 접근제어 객체 지향 기법을 이해한다. 클래스를 작성할 수 있다. 클래스에서 객체를 생성할 수 있다.
어서와 Java는 처음이지! 제9장 인터페이스, 패키지.
명품 C++ 9장 가상 함수와 추상 클래스.
C++ Espresso 제8장 객체 지향 소개.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
자바 가상 머신 프로그래밍 Chap 10. 자바 컴파일링의 안쪽 ② Pslab 오민경.
Power Java 제11장 상속.
C++ Espresso 제11장 예외 처리와 형변환.
멤버함수 중첩( 복사 생성자 ) - 연사자 중첩 - 동적 메모리를 가지는 클래스를 지원 하도록 멤버 함수 작성
제8장 포인터와 동적객체 생성 포인터의 개념을 이해한다. 포인터와 관련된 연산을 이해한다.
JA A V W. 06.
10장 상속 Section 1 상속의 개요 Section 2 상속과 한정자 Section 3 상속과 생성자
Fucntion 요약.
CHAP 21. 전화, SMS, 주소록.
12. 상속 : 고급.
18강. 인터페이스 – II - 인터페이스와 다중상속 - 인터페이스를 통한 로봇 장남감 만들기 프로그래밍
클래스 : 기능 CHAPTER 7 Section 1 생성자(Constructor)
중복 멤버의 처리 조 병 규 한 국 교 통 대 학 교 SQ Lab..
제 8장. 클래스의 활용 학기 프로그래밍언어및실습 (C++).
3. 모듈 (5장. 모듈).
서브클래스 조 병 규 한 국 교 통 대 학 교 SQ Lab..
Static과 const 선언 조 병 규 한 국 교 통 대 학 교 SQ Lab..
윤성우의 열혈 C++ 프로그래밍 윤성우 저 열혈강의 C++ 프로그래밍 개정판 Chapter 07. 상속의 이해.
자바 객체 지향 프로그래밍 Ps lab 김윤경.
상속 (Inheritance) private 전용부분 전용부분 공용부분 공용부분 public 기본 클래스
7 생성자 함수.
6 객체.
Presentation transcript:

C++ Espresso 제8장 상속

상속을 코드를 재사용하기 위한 중요한 기법입니다. 이번 장에서 학습할 내용 상속을 코드를 재사용하기 위한 중요한 기법입니다. 상속이란? 접근 제어 지정자 상속에서의 생성자와 소멸자 재정의(오버라이딩) 다중 상속

상속이란? 상속: 기존에 존재하는 유사한 클래스로부터 속성과 동작을 이어받고 자신이 필요한 기능을 추가하는 기법

상속의 장점 상속의 장점 상속을 통하여 기존 클래스의 필드와 메소드를 재사용 기존 클래스의 일부 변경도 가능 상속을 이용하게 되면 복잡한 GUI 프로그램을 순식간에 작성 상속은 이미 작성된 검증된 소프트웨어를 재사용 신뢰성 있는 소프트웨어를 손쉽게 개발, 유지 보수 코드의 중복을 줄일 수 있다.

상속 class Car { int speed; } class SportsCar : public Car bool turbo; 상속한다는 의미

자식 클래스는 부모 클래스를 포함

상속의 예

상속의 예제

Car 클래스 #include <iostream> #include <string> using namespace std; class Car { public: // 3개의멤버변수선언 int speed; // 속도 int gear; // 주행거리 string color; // 색상 // 3개의멤버함수선언 void setGear(int newGear) { // 기어설정멤버함수 gear = newGear; } void speedUp(int increment) { // 속도증가멤버함수 speed += increment; void speedDown(int decrement) { // 속도감소멤버함수 speed -= decrement; };

SportsCar 클래스 // Car 클래스를상속받아서다음과같이SportsCar 클래스를작성하여보자. class SportsCar : public Car { // Car를상속받는다. // 1개의멤버변수를추가 bool turbo; public: // 1개의멤버함수를추가 void setTurbo(bool newValue) { // 터보모드설정멤버함수 turbo = newValue; } };

SportsCar 클래스 자식 클래스는 부모 클래스의 변수와 함수를 마치 자기 것처럼 사용할 수 있다. int main() { SportsCar c; c.color = "Red"; // 부모클래스멤버변수접근 c.setGear(3); // 부모클래스멤버함수호출 c.speedUp(100); // 부모클래스멤버함수호출 c.speedDown(30); // 부모클래스멤버함수호출 c.setTurbo(true); // 자체멤버함수호출 return 0; } 자식 클래스는 부모 클래스의 변수와 함수를 마치 자기 것처럼 사용할 수 있다.

상속은 왜 필요한가? 상속

상속 계층도 상속은 여러 단계로 이루어질 수 있다.

상속 계층도

상속은 is-a 관계 상속은 is-a 관계 자동차는 탈것이다. (Car is a Vehicle). 사자, 개, 고양이는 동물이다. has-a(포함) 관계는 상속으로 모델링을 하면 안 된다. 도서관은 책을 가지고 있다(Library has a book). 거실은 소파를 가지고 있다.

중간 점검 문제 1. 상속은 왜 필요한가? 2. 사자, 호랑이, 고양이를 상속 계층 구조를 이용하여 표현하여 보자.

접근 제어 지정자

접근 제어 지정자 접근 지정자 현재 클래스 자식 클래스 외부 private ○ × protected public

예제 #include <iostream> #include <string> using namespace std; class Employee { int rrn; // Regident Resgistration Number: 주민등록번호 protected: int salary; // 월급 public: string name; // 이름 void setSalary(int salary); int getSalary(); }; void Employee::setSalary(int salary) { this->salary = salary; } int Employee::getSalary() { return salary;

예제 class Manager : public Employee { int bonus; public: Manager(int b=0) : bonus(b) { } void modify(int s, int b); void display(); }; void Manager::modify(int s, int b) { salary = s; // 부모클래스의 보호멤버 사용 가능! bonus = b; } void Manager::display() { cout << "봉급: " << salary << " 보너스: " << bonus << endl; // cout << "주민등록번호: " << rrn << endl; //

예제 int main() { Manager m; m.setSalary(2000); m.display(); m.modify(1000, 500); } 봉급: 1000 보너스: 500 계속하려면 아무 키나 누르십시오 . . .

중간 점검 문제 protected가 의미하는 바는 무엇인가? 2. 부모 클래스에서 private로 선언된 변수를 자식 클래스에서 사용할 수 있는가? 3. 자식 클래스의 객체 obj를 통하여 부모 클래스에서 protected로 선언된 변수 x를 사용할 수 있는가? 즉 obj.x = 10;과 같은 문장을 작성할 수 있는가?

상속에서의 생성자와 소멸자 자식 클래스의 객체가 생성될 때에 당연히 자식 클래스의 생성자는 호출된다. 이때에 부모 클래스 생성자도 호출될까?

상속에서의 생성자와 소멸자 (1) (2) (3)

예제 #include <iostream> #include <string> using namespace std; class Shape { int x, y; public: Shape() { cout << "Shape 생성자() " << endl; } ~Shape() { cout << "Shape 소멸자() " << endl; };

예제 class Rectangle : public Shape { int width, height; public: cout << "Rectangle 생성자()" << endl; } ~Rectangle(){ cout << "Rectangle 소멸자()" << endl; }; int main() { Rectangle r; return 0; Shape 생성자() Rectangle 생성자() Rectangle 소멸자() Shape 소멸자() 계속하려면 아무 키나 누르십시오 . . .

부모 생성자의 명시적 호출

예제 #include <iostream> #include <string> using namespace std; class Shape { int x, y; public: Shape() { cout << "Shape 생성자() " << endl; } Shape(int xloc, int yloc) : x(xloc), y(yloc){ cout << "Shape 생성자(xloc, yloc) " << endl; ~Shape() { cout << "Shape 소멸자() " << endl; };

예제 class Rectangle : public Shape { int width, height; public: Rectangle(int x=0, int y=0, int w=0, int h=0); ~Rectangle(){ cout << "Rectangle 소멸자()" << endl; } }; Rectangle::Rectangle(int x, int y, int w, int h) : Shape(x, y) { width = w; height = h; cout << "Rectangle 생성자(x, y, w, h)" << endl;

예제 int main() { Rectangle r(0, 0, 100, 100); return 0; } Shape 생성자(xloc, yloc) Rectangle 생성자(x, y, w, h) Rectangle 소멸자() Shape 소멸자() 계속하려면 아무 키나 누르십시오 . . .

예제 #include <iostream> #include <string> using namespace std; class Employee { int rrn; // Regident Resgistration Number: 주민등록번호 protected: int salary; // 월급 public: string name; // 이름 void setSalary(int salary); int getSalary(); }; void Employee::setSalary(int salary) { this->salary = salary; } int Employee::getSalary() { return salary;

예제 class Manager : public Employee { int bonus; public: Manager(int b=0) : bonus(b) { } void modify(int s, int b); void display(); }; void Manager::modify(int s, int b) { salary = s; // 부모클래스의보호멤버사용가능! bonus = b; } void Manager::display() { cout << "봉급: " << salary << " 보너스: " << bonus << endl; // cout << "주민등록번호: " << rrn << endl; //

예제 int main() { Manager m; m.setSalary(2000); m.display(); m.modify(1000, 500); } 봉급: 1000 보너스: 500 계속하려면 아무 키나 누르십시오 . . .

중간 점검 문제 1. 상속에서 자식 클래스의 생성자와 부모 클래스의 생성자 중에서 함수의 몸체가 먼저 실행되는것은? 2. 상속에서 자식 클래스의 소멸자와 부모 클래스의 소멸자 중에서 함수의 몸체가 먼저 실행되는것은?

재정의 재정의(overriding): 자식 클래스가 필요에 따라 상속된 멤버 함수를 다시 정의하는 것

예제 재정의 #include <iostream> #include <string> using namespace std; class Car { public: int getHP() { return 100; // 100마력반환 } }; class SportsCar : public Car { return 300; // 300마력반환 재정의

예제 int main() { SportsCar sc; cout << "마력: " << sc.getHP() << endl; return 0; } 마력: 300 계속하려면 아무 키나 누르십시오 . . .

원래의 함수를 호출하려면 int main() { SportsCar sc; cout << "마력: " << sc.Car::getHP() << endl; // 100이 출력된다. return 0; } 마력: 100 계속하려면 아무 키나 누르십시오 . . .

재정의의 조건 부모 클래스의 멤버 함수와 동일한 시그니처를 가져야 한다. 즉 멤버 함수의 이름, 반환형, 매개 변수의 개수와 데이터 타입이 일치하여야 한다. class Animal { void makeSound() { } }; 재정의가 아님 class Dog : public Animal { int makeSound() { } };

재정의와 중복 정의 중복 정의: 같은 이름의 멤버 함수를 여러 개 정의하는 것 재정의: 부모 클래스에 있던 상속받은 멤버 함수를 다시 정의하는 것

멤버 변수 재정의 가능하지만 혼란을 일으킴 재정의-> 가능하지만 혼란을 일으킴! class Car { public: int speed; int gear; string color; Car(): speed(0), gear(1), color("white") { } void setSpeed(int s){ speed = s; } int getSpeed(){ return speed; } }; class SportsCar : public Car { SportsCar(): speed(100), gear(3), color("blue") { } 재정의-> 가능하지만 혼란을 일으킴!

비교 int main() { SportsCar sc; cout << "스피드: " << sc.speed << endl; // 자식 클래스의 speed cout << "스피드: " << sc.Car::speed << endl; // 부모 클래스의 speed cout << "스피드: " << sc.getSpeed() << endl; // 부모 클래스의 speed 반환 return 0; } 스피드: 100 스피드: 0 계속하려면 아무 키나 누르십시오 . . .

재정의된 멤버 함수의 호출 순서 Eagle e; e.sleep();// Animal의sleep() 호출 e.eat();// Eagle의eat() 호출 e.sound();// Bird의sound() 호출

부모 클래스의 멤버 호출 부모 클래스의 함수 호출! class ParentClass { public: void print() { cout << "부모클래스의 print() 멤버함수" << endl; } }; class ChildClass : public ParentClass { int data; void print() { //멤버함수오버라이딩 ParentClass::print(); cout << "자식클래스의print() 멤버함수" << endl; int main() { ChildClass obj; obj.print(); return 0; 부모 클래스의 함수 호출!

예제 부모 클래스의 print() 멤버 함수 자식 클래스의 print() 멤버 함수 계속하려면 아무 키나 누르십시오 . . .

상속의 3가지 유형

예제 #include <iostream> using namespace std; class ParentClass { private: int x; protected: int y; public: int z; }; class ChildClass1 : public ParentClass { class ChildClass2 : protected ParentClass class ChildClass3 : private ParentClass

예제 int main() { ChildClass1 obj1; ChildClass2 obj2; ChildClass3 obj3; cout << obj1.x << endl; // 불가능 cout << obj1.y << endl; // 불가능: y는protected로유지된다. cout << obj1.z << endl; // 가능: z는public으로유지된다. cout << obj2.x << endl; // 불가능 cout << obj2.y << endl; // 불가능: y는protected로유지된다. cout << obj2.z << endl; // 불가능: z는public에서protected로변경되었다. cout << obj3.x << endl; // 불가능 cout << obj3.y << endl; // 불가능: y는protected에서private로변경되었다. cout << obj3.z << endl; // 불가능: z는public에서private로변경되었다. return 0; }

중간 점검 문제 1. 부모 클래스에 public 변수 x가 있다. 부모 클래스를 protected로 상속받은 자식 클래스 에서는 x의 접근 권한이 무엇으로 변경되는가?

다중 상속 class Sub : public Sup1, public Sup2 { ...// 추가된 멤버 ...// 재정의된 멤버 }

예제 #include <iostream> using namespace std; class PassangerCar { public: int seats; // 정원 void set_seats(int n){ seats = n; } }; class Truck { int payload; // 적재하중 void set_payload(int load){ payload = load; } class Pickup : public PassangerCar, public Truck { int tow_capability; // 견인능력 void set_tow(int capa){ tow_capability = capa; }

비교 int main() { Pickup my_car; my_car.set_seats(4); my_car.set_payload(10000); my_car.set_tow(30000); return 0; } 계속하려면 아무 키나 누르십시오 . . .

다중 상속의 문제점 class SuperA { public: int x; void sub(){ cout << "SuperA의 sub()" << endl; } }; class SuperB cout << "SuperB의 sub()" << endl;

다중 상속의 문제점 class Sub : public SuperA, public SuperB { }; int main() Sub obj; obj.x = 10; // obj.x는 어떤 부모클래스의 x를 참조하는가? return 0; } Obj.SuperA::x=10; 1>.\multi_inheri.cpp(27) : error C2385: 'x' 액세스가 모호합니다. 1> 기본 'SuperA'의 'x'일 수 있습니다. 1> 또는 기본 'SuperB'의 'x'일 수 있습니다.

예제

예제 #include <iostream> using namespace std; enum BREED { YORKIE, POODLE, BULLDOG }; class Animal { protected: int age; // 나이 int weight; // 몸무게 public: // 생성자와소멸자 Animal(); ~Animal(); // 멤버함수들 void speak() const; void sleep() const; void eat() const; };

예제 Animal::Animal() { cout << "Animal 생성자\n"; } // 멤버함수들 void Animal::speak() const cout << "Animal speak()\n"; void Animal::sleep() const cout << "Animal sleep()\n"; void Animal::eat() const cout << "Animal eat()\n";

예제 class Dog : public Animal { private: BREED breed; public: // 생성자와 소멸자 Dog(); ~Dog(); // 멤버 함수들 void wag(); void bite(); void speak() const; }; Dog::Dog() cout << "Dog 생성자\n"; }

예제 Dog::~Dog() { cout << "Dog 소멸자\n"; } // 멤버함수들 void Dog::wag() cout << "Dog wag()\n"; void Dog::bite() cout << "Dog bite()\n"; void Dog::speak() const cout << "Dog speak()\n";

예제 int main() { Dog dog; dog.eat(); dog.sleep(); dog.speak(); dog.wag(); return 0; } Animal 생성자 Dog 생성자 Animal eat() Animal sleep() Dog speak() Dog wag() Dog 소멸자 Animal 소멸자

예제 #2

예제 #include <iostream> #include <string> using namespace std; class Person { string name; int age; bool gender; public: Person(string n="", int a=0, bool g=true): name(n), age(a), gender(g) { } void setName(string s) { name = s; } string getName() const { return name; } void setAge (int a) { age = a; } int getAge() const { return age; } void setGender (bool g) { gender = g; } bool getGender() const { return gender; } };

예제 class Employee : public Person { int number; int salary; public: Employee(string n="", int a=0, bool g=true, int num=0, int s=0): Person(n, a, g), number(num), salary(s) { } void display() const; void setNumber (int n) { number = n; } int getNumber() const { return number; } void setSalary (int s) { salary = s; } int getSalary() const { return salary; } }; void Employee::display() const { cout << this->getName() << endl; cout << this->getAge() << endl; cout << this->getGender() << endl; cout << this->getNumber() << endl; cout << this->getSalary() << endl; }

예제 int main() { Employee e("김철수", 26, true, 2010001, 2800); e.display(); return 0; } 김철수 26 1 2010001 2800 계속하려면 아무 키나 누르십시오 . . .

Q & A