01_ 가상 함수를 사용한 다형성의 구현 02_ 오버라이딩

Slides:



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

어서와 Java는 처음이지! 제20장 실전프로젝트 #2.
Chap07 상속 Section 1 : 상속의 개요 Section 2 : 멤버 변수의 상속
인공지능실험실 석사 2학기 이희재 TCP/IP Socket Programming… 제 11장 프로세스간 통신 인공지능실험실 석사 2학기 이희재
최윤정 Java 프로그래밍 클래스 상속 최윤정
윤 홍 란 다형성과 가상 함수 윤 홍 란
10장 객체-지향 프로그래밍 II.
어서와 Java는 처음이지! 제7장 상속.
제 5 장 상속과 다형성.
명품 JAVA Essential.
제12장 다형성과 가상함수 다형성의 개념을 이해한다. 상향 형변환의 개념을 이해한다. 가상 함수의 개념을 이해한다.
C++ Espresso 제9장 다형성.
7장 배열 ②.
명품 C++ 9장 가상 함수와 추상 클래스.
제 6장. 생성자와 소멸자 학기 프로그래밍언어및실습 (C++).
Game Programming 03 - Tools of trade
8.1 인터페이스 개요와 인터페이스 정의 8.2 인터페이스의 사용 8.3 인터페이스의 상속 8.4 인터페이스 참조
5장. 참조 타입.
제 3장. C보다 나은 C++ II.
다중 상속 - 가상 상속 추상 자료형 순수 가상함수
명품 C++ 7장 프렌드와 연산자 중복.
어서와 Java는 처음이지! 제7장 상속.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
26. 매크로와 전처리기.
정적 멤버 변수/정적 멤버 함수 - friend 함수/클래스 template
C++ Espresso 제12장 템플릿.
제4장 클래스와 객체 객체 지향 기법을 이해한다. 클래스를 작성할 수 있다. 클래스에서 객체를 생성할 수 있다.
패키지와 접근 제어 패키지에 대하여 접근 제어에 대하여.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
Lesson 7. 클래스와 메소드 - 1.
14. 예외처리.
자바 5.0 프로그래밍.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
13. 연산자 오버로딩.
제14장 예외처리와 템플릿 예외 처리의 개요를 학습한다. 예외 처리를 적용할 수 있다. 템플릿의 개념을 이해한다.
7장 인터페이스와 추상 클래스.
Method & library.
자바응용.
제5장 생성자와 접근제어 객체 지향 기법을 이해한다. 클래스를 작성할 수 있다. 클래스에서 객체를 생성할 수 있다.
어서와 Java는 처음이지! 제9장 인터페이스, 패키지.
명품 C++ 9장 가상 함수와 추상 클래스.
가상함수와 추상 클래스.
Lesson 2. 기본 데이터형.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
20장. 객체지향 프로그래밍 01_ 객체지향 프로그래밍의 시작.
제 4장. 객체 지향 프로그래밍 시작하기 학기 프로그래밍언어및실습 (C++).
Lab 8 Guide: 멀티스레딩 예제 2 * Critical Section을 이용한 멀티스레딩 동기화 (교재 15장, 쪽)
자바 5.0 프로그래밍.
자바 가상 머신 프로그래밍 Chap 10. 자바 컴파일링의 안쪽 ② Pslab 오민경.
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
Power Java 제11장 상속.
제8장 포인터와 동적객체 생성 포인터의 개념을 이해한다. 포인터와 관련된 연산을 이해한다.
JA A V W. 06.
[ 단원 06 ] 상속과 다형성.
12. 상속 : 고급.
객체기반 SW설계 팀활동지 4.
18강. 인터페이스 – II - 인터페이스와 다중상속 - 인터페이스를 통한 로봇 장남감 만들기 프로그래밍
클래스 : 기능 CHAPTER 7 Section 1 생성자(Constructor)
중복 멤버의 처리 조 병 규 한 국 교 통 대 학 교 SQ Lab..
제 8장. 클래스의 활용 학기 프로그래밍언어및실습 (C++).
3. 모듈 (5장. 모듈).
2.가상머신의 탐험 도구, Oolong에 대하여 ps lab 김윤경.
실습과제 1번 /* 1. 멤버 변수로 반경 radius를 갖고, 그 값을 모니터에 출력하는
1. 지역변수와 전역변수 2. auto, register 3. static,extern 4. 도움말 사용법
29장. 템플릿과 STL 01_ 템플릿 02_ STL.
Java의 정석 제 8 장 예외처리 (Exception handling) Java 정석 남궁성 강의
자바 객체 지향 프로그래밍 Ps lab 김윤경.
상속 (Inheritance) private 전용부분 전용부분 공용부분 공용부분 public 기본 클래스
7 생성자 함수.
Presentation transcript:

01_ 가상 함수를 사용한 다형성의 구현 02_ 오버라이딩 23장. 다형성과 가상 함수 01_ 가상 함수를 사용한 다형성의 구현 02_ 오버라이딩

Shape 클래스와 자식 클래스들(1) 가상 함수가 없으면 문제가 발생하는 경우를 알아보자. // 일반적인 '도형'을 상징하는 클래 class Shape { public: void Move(double x, double y); void Draw() const; Shape(); Shape(double x, double y); protected: double _x, _y; }; void Shape::Draw() const cout << "[Shape] Position = ( " << _x << ", " << _y << ")\n"; }

Shape 클래스와 자식 클래스들(2) 가상 함수가 없으면 문제가 발생하는 경우를 알아보자. // 사각형을 상징하는 클래스 class Rectangle : public Shape { public: void Draw() const; void Resize(double width, double height); Rectangle(); Rectangle(double x, double y, double width, double height); protected: double _width; double _height; }; void Rectangle::Draw() const cout << "[Rectangle] Position = ( " << _x << ", " << _y << ") " "Size = ( " << _width << ", " << _height << ")\n"; }

Shape 클래스와 자식 클래스들(3) 가상 함수가 없으면 문제가 발생하는 경우를 알아보자. // 원을 상징하는 클래스 class Circle : public Shape { public: void Draw() const; void SetRadius(double radius); Circle(); Circle(double x, double y, double radius); protected: double _radius; }; void Circle::Draw() const cout << "[Circle] Position = ( " << _x << ", " << _y << ") " "Radius = " << _radius << "\n"; }

Shape 클래스와 자식 클래스들(4) 가상 함수가 없으면 문제가 발생하는 경우를 알아보자. int main() { // 도형 객체 생성 및 그리기 Shape s; s.Move(100, 100); s.Draw(); // 사각형 객체 생성 및 그리기 Rectangle r; r.Move( 200, 100); r.Resize( 50, 50); r.Draw(); // 원 객체 생성 및 그리기 Circle c; c.Move( 300, 100); c.SetRadius( 30); c.Draw(); return 0; }

Shape 클래스와 자식 클래스들(5) 실행 결과 도형 클래스들의 상속 계층도 [23-2] [23-3]

다양한 클래스의 객체를 배열에 담기(1) 도형 클래스의 객체들을 배열에 담아서 사용하는 예 실행 결과 – 항상 Shape::Draw() 가 호출되는 문제가 있다. 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; } [23-4]

다양한 클래스의 객체를 배열에 담기(2) 배열과 객체들의 메모리 구조 [23-5]

가상 함수로 문제점 해결하기 Draw() 함수를 가상 함수로 만들어서 문제를 해결해보자. class Shape { public: void Move(double x, double y); virtual void Draw() const; Shape(); Shape(double x, double y); protected: double _x, _y; }; [23-6]

다형성(Polymorphism)과 가상함수(1) 다른 분야에서의 다형성의 의미 객체지향 프로그래밍에서의 다형성이란 타입에 관계 없이 동일한 방법으로 다룰 수 있는 능력을 말한다. 예) Circle이나 Rectangle 객체들을 각각의 타입에 상관 없이 Shape 객체처럼 다룰 수 있는 능력 [표 23-1]

다형성(Polymorphism)과 가상함수(2) 다형성은 객체간의 결합(Coupling)을 약하게 만들어서, 객체 간의 연결을 유연하게 해준다. // 도형을 원점으로 이동하는 함수 void Controller::MoveToOrigin( Shape* p ) { p->Move( 0, 0 ); p->Draw(); } [23-7]

순수 가상 함수(Pure Virtual Functions) Shape::Draw() 함수를 순수 가상 함수로 만들어보자. 실행 결과 (이전 버전과 다른 점이 없다.) class Shape { public: void Move(double x, double y); virtual void Draw() const = 0; // 중간 생략 /* 함수의 정의를 지워도 컴파일 오류가 발생하지 않는다. void Shape::Draw() const cout << "[Shape] Position = ( " << _x << ", " << _y << ")\n"; } */ [23-11]

순수 가상 함수의 의미 하나 이상의 순수 가상 함수를 포함하고 있는 클래스를 추상 클래스(Abstract Class)라고 부른다. 추상 클래스 타입의 의 객체를 생성하는 것은 불가능하고, 오로지 부모 클래스로서만 사용할 수 있다. Shape::Draw() 함수를 순수 가상 함수로 만드는 것의 효과 Shape 클래스를 추상 클래스로 만들기 때문에 Shape 클래스의 객체를 만들 수 없다. 컴파일러나 다른 개발자들에게 Shape 클래스는 오로지 부모 클래스로만 사용할 것이라는 점을 알리는 역할을 한다. Shape::Draw() 함수를 구현하지 않아도 컴파일 오류가 발생하지 않는다. 컴파일러나 다른 개발자들에게 Shape::Draw() 함수가 자식 클래스에 의해서 오버라이딩 될 것이며, 다형성을 통해서만 호출할 것이라는 점을 알리는 역할을 한다. [23-11]

다양한 종류의 멤버 함수 상속과 관련해서 지금까지 살펴본 멤버 함수의 종류 일반적인 멤버 함수 가상 함수 순수 가상 함수 어떤 종류의 멤버 함수를 사용할 지에 대한 가이드 라인 처음엔 그냥 멤버 함수로 만든다. 다형성을 이용해야 하는 경우라면 가상 함수로 만든다. 다형성을 위해서 함수의 원형만 필요한 경우라면 순수 가상 함수로 만든다.

오버로딩과 오버라이딩 부모 클래스에서 오버로드된 함수 중에서 어느 것 하나라도 오버라이드 하면 나머지 다른 함수들도 모두 사용할 수 없다. class Pet { public: void Eat(); void Eat(const string& it); string name; }; class Dog : public Pet int main() // 강아지 생성 Dog dog1; dog1.name = "Patrasche"; // 두 가지 Eat() 함수를 호출한다. dog1.Eat(); dog1.Eat( "milk" ); // Error!! return 0; } [23-11]