12. 상속 : 고급.

Slides:



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

7 장 프렌드와 연산자 중복 1 명품 C++. 친구란 ? 2 우리 집 냉장고 내 침대 우리 집 TV 우리 집 식탁 친구 친구 ? 내 가족의 일원은 아니지만 내 가족과 동일한 권한을 가진 일원으로 인정받은 사람.
1. 2 차원 배열  배열은 동일한 데이터 유형으로 여러 개의 변수를 사용할 경우 같은 이 름으로 지정하여 간편하게 사용할 수 있도록 하는 것으로서 앞에서 1 차원 배열을 공부하였습니다.  2 차원 배열은 바둑판을 생각하면 되며, 1 차원 배열에서 사용하는 첨자를 2.
01_ 가상 함수를 사용한 다형성의 구현 02_ 오버라이딩
ㅎㅎ 구조체 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스 구조체 배열.
ㅎㅎ 구조체 C++ 프로그래밍 기초 : 객체지향의 시작 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express Slide 1 (of 27)
클래스 class, 객체 object 생성자 constructor 접근 access 제어 이벤트 event 처리.
Chap07 상속 Section 1 : 상속의 개요 Section 2 : 멤버 변수의 상속
최윤정 Java 프로그래밍 클래스 상속 최윤정
5장. 객체지향과 클래스.
Java로 배우는 디자인패턴 입문 Chapter 5. Singleton 단 하나의 인스턴스
컴퓨터 프로그래밍 기초 [Final] 기말고사
8. 객체와 클래스 (기본).
윤 홍 란 다형성과 가상 함수 윤 홍 란
제12장 다형성과 가상함수 다형성의 개념을 이해한다. 상향 형변환의 개념을 이해한다. 가상 함수의 개념을 이해한다.
C++ Espresso 제9장 다형성.
명품 C++ 9장 가상 함수와 추상 클래스.
제 6장. 생성자와 소멸자 학기 프로그래밍언어및실습 (C++).
8.1 인터페이스 개요와 인터페이스 정의 8.2 인터페이스의 사용 8.3 인터페이스의 상속 8.4 인터페이스 참조
Chap08 다중 스레드 8.1 스레드 개요 8.2 Thread 클래스와 스레드 생명주기 8.3 스레드 생성과 사용
명품 C++ 7장 프렌드와 연산자 중복.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
정적 멤버 변수/정적 멤버 함수 - friend 함수/클래스 template
C++ Espresso 제12장 템플릿.
자바 5.0 프로그래밍.
명품 C++ 4장. 객체 포인터와 객체 배열, 객체의 동적 생성.
제4장 클래스와 객체 객체 지향 기법을 이해한다. 클래스를 작성할 수 있다. 클래스에서 객체를 생성할 수 있다.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
Java 6장. 클래스 : 속성 public class SumTest {
명품 C++ 8장 상속.
14장. 포인터와 함수에 대한 이해.
14. 예외처리.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
자바 5.0 프로그래밍.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
13. 연산자 오버로딩.
제14장 예외처리와 템플릿 예외 처리의 개요를 학습한다. 예외 처리를 적용할 수 있다. 템플릿의 개념을 이해한다.
7장 인터페이스와 추상 클래스.
Method & library.
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
3장 상수 변수 기본 자료형 키워드와 식별자 상수와 변수 기본 자료형 형변환 자료형의 재정의.
명품 C++ 9장 가상 함수와 추상 클래스.
가상함수와 추상 클래스.
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express Slide 1 (of 22)
19. 함수 포인터와 void 포인터.
나만의 자료 형을 만들 수 있다. C는 int, float, char 등의 자료 형을 제공한다.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
10. 문자열클래스와파일클래스.
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
Lab 8 Guide: 멀티스레딩 예제 2 * Critical Section을 이용한 멀티스레딩 동기화 (교재 15장, 쪽)
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
Power Java 제11장 상속.
C++ Espresso 제11장 예외 처리와 형변환.
멤버함수 중첩( 복사 생성자 ) - 연사자 중첩 - 동적 메모리를 가지는 클래스를 지원 하도록 멤버 함수 작성
JA A V W. 06.
5. 논리적 자료표현 : 구조체.
제 6 장 함수(functions).
처음으로 배우는 C 프로그래밍 제6부 C++의 소개 제 14 장 추가적인 클래스 기능.
클래스 : 기능 CHAPTER 7 Section 1 생성자(Constructor)
중복 멤버의 처리 조 병 규 한 국 교 통 대 학 교 SQ Lab..
가장 많이 사용 Accelerator 최상위 WM_COMMAND, OLE 메시지 관련 이벤트 처리만 가능 이 클래스를 상속받아서 다른 이벤트 처리 이벤트 처리 관련 윈도우(창) 최상위 클래스 멀티 테스킹(모듈) CFrameWnd, Cview,
제 8장. 클래스의 활용 학기 프로그래밍언어및실습 (C++).
3. 모듈 (5장. 모듈).
서브클래스 조 병 규 한 국 교 통 대 학 교 SQ Lab..
Static과 const 선언 조 병 규 한 국 교 통 대 학 교 SQ Lab..
2.가상머신의 탐험 도구, Oolong에 대하여 ps lab 김윤경.
상속 (Inheritance) private 전용부분 전용부분 공용부분 공용부분 public 기본 클래스
7 생성자 함수.
MFC 기초 윈도우 응용프로그램 개발 간략한 역사 Microsoft Foundation Classes
Presentation transcript:

12. 상속 : 고급

차례 상속에서 멤버 함수 재정의 추상 클래스 동적 형 변환 다중 상속

함수 오라이딩/동적결합/다형성/가상함수 1 함수 오버라이딩 (Function Overriding) 기반 클래스의 멤버 함수를 파생 클래스에서 다시 정의하는 것 동적 결합 (Dynamic Binding) 실행 시 호출될 함수를 결정하는 것으로 이는 하나의 함수가 여러 클래스에서 오버라이딩되었을때 사용

함수 오라이딩/동적결합/다형성/가상함수 2 다형성(Polymorphism) 하나의 함수가 여러 구현 형태로 정의되는 것을 다형성이라 함 다형성에 의해 함수 재정의시 요구조건 기반 클래스의 멤버 함수가 가상함수로 선언되어야 함 함수에서 매개변수로 전달된 변수는 객체의 주소를 포함해야 함

함수 오라이딩/동적결합/다형성/가상함수 3 함수 오버라이딩을 목적으로 기반 클래스의 함수 함수 선언시 virtual 키워드를 표시함 virtual 함수리턴형 함수이름( ) ;

소스 12-2 (ch12_02.cpp) – 동적결합이 안된 경우 #include <iostream> using namespace std; class A { public: string ClassMessage() return "class A"; } }; class B : public A return "class B"; void TestFunction1(A x) { cout << x.ClassMessage().data() << endl; } int main() A a; B b; TestFunction1(a); TestFunction1(b); return 0; 예상 실행 결과 : class A class B 실제 실행 결과 : class A

소스 12-3 (ch12_03.cpp) – 동적결합 #include <iostream> using namespace std; class A { public: string ClassMessage() return "class A"; } }; class B : public A return "class B"; #include <iostream> using namespace std; class A { public: virtual string ClassMessage() return "class A"; } }; class B : public A string ClassMessage() return "class B";

소스 12-2 (ch12_03.cpp) – 동적결합 실행 결과 : class A 실행 결과 : class A class B void TestFunction1(A x) { cout << x.ClassMessage().data() << endl; } int main() A a; B b; TestFunction1(a); TestFunction1(b); return 0; void TestFunction1(A *x) { cout << x->ClassMessage().data() << endl; } int main() A a; B b; TestFunction1(&a); TestFunction1(&b); return 0; 실행 결과 : class A 실행 결과 : class A class B

추상 클래스 순수 가상 함수 (Pure Virtual Function) 추상 클래스 (Abstract Class) 함수 내용을 정의하지 않고 파생 클래스에서 함수 오버라이딩에 의해 내용이 결정되는 형태의 함수 추상 클래스 (Abstract Class) 객체 생성이 목적이 아닌 클래스 상속에서 기반 클래스 역할을 담당 순수 가상 함수를 포함 virtual 반환형 함수이름( ) =0;

추상 클래스 AbstractClass는 객체를 생성하지 못함!!!  Error!!! 소스 12-5 ( ch12_04.cpp) #include <iostream> #include <string> using namespace std; class AbstractClass { public: virtual string SampleFunction()=0; }; class TestClass : public AbstractClass string SampleFunction() return "SampleFunction"; } int main() { AbstractClass obj1; cout << obj1.SampleFunction() << endl; return 0; } 추상 클래스 AbstractClass는 객체를 생성하지 못함!!!  Error!!!

소스 12-5 ( ch12_04.cpp) 파생 클래스 TestClass로 객체 생성!!! #include <iostream> #include <string> using namespace std; class AbstractClass { public: virtual string SampleFunction()=0; }; class TestClass : public AbstractClass string SampleFunction() return "SampleFunction"; } int main() { TestClass obj1; cout << obj1.SampleFunction() << endl; return 0; } 파생 클래스 TestClass로 객체 생성!!!

실습 1-1 다음의 클래스를 정의하자. 클래스 이름: GeometricObject 멤버 변수: 두 개의 선(line1, line2)으로 구성된 배정도형 자료를 다루며, 클래스 상속 시 파생 클래스에서 참조케 함   멤버 함수 생성자: 매개변수 없이 멤버 변수를 0으로 초기화 생성자: 두 개의 멤버 변숫값을 매개변수로 전달하여 초기화 각각의 멤버 변숫값을 매개변수로 전달하여 초기화 각각의 멤버 변숫값을 객체 외부로 전달 멤버 변수를 이용하여 도형의 면적을 계산하는 순수 가상 함수(AreaCalculation) 멤버 변수를 이용하여 도형의 둘레를 계산하는 순수 가상 함수(RoundCalculation)

실습 1-2 클래스 이름: Isosceles GeometricObject를 기반 클래스로 하는 파생 클래스   멤버 변수: 이등변 삼각형의 밑면, 높이, 면적(area)과 등변(side)으로 구성되며 밑변과 높이는 기반 클래스의 멤버 변수 line1과 line2로 사용함 멤버 함수 생성자: 매개변수 없이 멤버 변수를 0으로 초기화 생성자: 밑변과 높이의 값을 매개변수로 전달하여 초기화하고 나머지 멤버 변수는 0으로 초기화 기반 클래스의 AddCalculation( )을 면적 계산 함수로 함수 오버라이딩 기반 클래스의 Compute( )을 등변 계산 함수로 함수 오버라이딩 멤버 변수인 면적과 등변을 각각 객체 외부로 전달

실습 1-3 클래스 이름: Rectangle GeometricObject를 기반 클래스로 하는 파생 클래스   멤버 변수: 사각형의 가로와 세로, 면적(area)과 둘레(round)로 구성됨, 가로와 세로는 기반 클래스의 멤버 변수 line1과 line2로 사용함 멤버 함수 생성자: 매개변수 없이 멤버 변수를 0으로 초기화 생성자: 가로와 세로의 값을 매개변수로 전달하여 초기화하고 나머지 멤버 변수는 0으로 초기화 기반 클래스의 AddCalculation( )을 면적 계산 함수로 함수 오버라이딩 기반 클래스의 Compute( )을 사각형 둘레 계산 함수로 함수 오버라이딩 멤버 변수인 넓이와 둘레를 각각 객체 외부로 전달

객체포인터1 = dynamic_cast <클래스이름*> (객체 포인터2) 동적 형 변환 동적 형 변환 클래스 상속에서 파생 클래스의 객체를 기반 클래스 형으로 변환(업캐스팅;Upcasting) 것 또는 기반 클래스의 객체를 파생 클래스 형으로 변환(다운캐스팅;Downcasting)하는 것 객체의 포인터를 변환을 원하는 클래스의 포인터로 할당 객체포인터1 = dynamic_cast <클래스이름*> (객체 포인터2)

업 캐스팅 예제 – 소스 12-11(ch12_05.cpp) 업캐스팅은 자동으로 형변환이 실행됨 (기반  파생) #include "ch12_GeometricObject.h" int main() { GeometricObject *p1 = new Isosceles(9,15); Isosceles *p2 = new Isosceles(5,6); cout << "p1 : " << p1->GetLine1() << endl; cout << "p2 : " << p2->GetLine1() << endl; return 0; }

다운 캐스팅 예제 – 소스 12-12(ch12_06.cpp) 다운캐스팅은 dynamic_cast 연산자가 명시되어야 함 (파생  기반) #include "ch12_GeometricObject.h" void DisplayGeometricObject(GeometricObject &object) { cout << "line1 : " << object.GetLine1() << endl; cout << "line2 : " << object.GetLine2() << endl; GeometricObject *p=&object; Isosceles *p1 = dynamic_cast<Isosceles*>(p); //다운 캐스팅 Rectangle *p2 = dynamic_cast<Rectangle*>(p); //다운 캐스팅 if (p1 != NULL) p1->AreaCalculation(); p1->Compute(); cout << "이등변 삼각형의 넓이 : " << p1->GetArea() << endl; cout << "이등변 삼각형의 등변 : " << p1->GetSide() << endl; } 매개변수로 전달받은 GeometricObject 객체 포인터 주소를 저장

if (p2 != NULL) { p2->AreaCalculation(); p2->Compute(); cout << "사각형의 넓이 : " << p2->GetArea() << endl; cout << "사각형의 둘레 : " << p2->GetRound() << endl; } int main() Isosceles p1(9, 15); Rectangle p2(10, 12); DisplayGeometricObject(p1); cout << "****************************" << endl; DisplayGeometricObject(p2); return 0;

소스 12-12 설명 36번 라인 DisplayGeometricObject(Isosceles p1); 이 호출되면 함수에서 p1은 정상적인 주소의 객체, p2는 NULL이 할당되며 여러 번 동적 형 변환이 발생함!! 37번 라인 DisplayGeometricObject(Rectangle p2); 이 호출되면 함수에서 p1은 NULL이 할당되고 , p2는 정상적인 주소의 객체가 할당되고 여러 번 동적 변환이 발생함

다중 상속 클래스 상속의 형태 기반 클래스 기반 클래스 파생 클래스 파생 클래스1 파생 클래스2 기반 클래스1 기반 클래스2

소스 12-13~소스 12-17 (ch12_multi.h, ch12_multi.cpp, ch12_07.cpp) class ScoreSource { ……………………….. }; class RankGrade class SungJuk : public ScoreSource, public RankGrade