C++ 프로그래밍 22 2008년 2학기 전자정보공학대학 컴퓨터공학부.

Slides:



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

5. 접근 제한자의 이해 SCJP 자격증 프로젝트 발표자 : 노효진.
01_ 가상 함수를 사용한 다형성의 구현 02_ 오버라이딩
ㅎㅎ 구조체 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스 구조체 배열.
ㅎㅎ 구조체 C++ 프로그래밍 기초 : 객체지향의 시작 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스
클래스 class, 객체 object 생성자 constructor 접근 access 제어 이벤트 event 처리.
Chap07 상속 Section 1 : 상속의 개요 Section 2 : 멤버 변수의 상속
최윤정 Java 프로그래밍 클래스 상속 최윤정
5장. 객체지향과 클래스.
컴퓨터 프로그래밍 기초 [Final] 기말고사
윤 홍 란 다형성과 가상 함수 윤 홍 란
10장 객체-지향 프로그래밍 II.
어서와 Java는 처음이지! 제7장 상속.
제 5 장 상속과 다형성.
명품 JAVA Essential.
제12장 다형성과 가상함수 다형성의 개념을 이해한다. 상향 형변환의 개념을 이해한다. 가상 함수의 개념을 이해한다.
C++ Espresso 제9장 다형성.
명품 C++ 9장 가상 함수와 추상 클래스.
제 6장. 생성자와 소멸자 학기 프로그래밍언어및실습 (C++).
Game Programming 03 - Tools of trade
8.1 인터페이스 개요와 인터페이스 정의 8.2 인터페이스의 사용 8.3 인터페이스의 상속 8.4 인터페이스 참조
5장. 참조 타입.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
어서와 Java는 처음이지! 제7장 상속.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
정적 멤버 변수/정적 멤버 함수 - friend 함수/클래스 template
자바 5.0 프로그래밍.
제4장 클래스와 객체 객체 지향 기법을 이해한다. 클래스를 작성할 수 있다. 클래스에서 객체를 생성할 수 있다.
패키지와 접근 제어 패키지에 대하여 접근 제어에 대하여.
Java 6장. 클래스 : 속성 public class SumTest {
14장. 포인터와 함수에 대한 이해.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
10장. 예외처리.
자바 5.0 프로그래밍.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
C#.
13. 연산자 오버로딩.
7장 인터페이스와 추상 클래스.
명품 C++ 9장 가상 함수와 추상 클래스.
가상함수와 추상 클래스.
19. 함수 포인터와 void 포인터.
Lesson 2. 기본 데이터형.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
20장. 객체지향 프로그래밍 01_ 객체지향 프로그래밍의 시작.
제 4장. 객체 지향 프로그래밍 시작하기 학기 프로그래밍언어및실습 (C++).
Lab 8 Guide: 멀티스레딩 예제 2 * Critical Section을 이용한 멀티스레딩 동기화 (교재 15장, 쪽)
자바 5.0 프로그래밍.
자바 가상 머신 프로그래밍 Chap 10. 자바 컴파일링의 안쪽 ② Pslab 오민경.
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
Power Java 제11장 상속.
JA A V W. 06.
12. 상속 : 고급.
객체기반 SW설계 팀활동지 4.
18강. 인터페이스 – II - 인터페이스와 다중상속 - 인터페이스를 통한 로봇 장남감 만들기 프로그래밍
데이터 동적 할당 Collection class.
클래스 : 기능 CHAPTER 7 Section 1 생성자(Constructor)
중복 멤버의 처리 조 병 규 한 국 교 통 대 학 교 SQ Lab..
제 8장. 클래스의 활용 학기 프로그래밍언어및실습 (C++).
Lecture 04 객체지향 페러다임 Kwang-Man Ko
3. 모듈 (5장. 모듈).
발표자 : 이지연 Programming Systems Lab.
Static과 const 선언 조 병 규 한 국 교 통 대 학 교 SQ Lab..
2.가상머신의 탐험 도구, Oolong에 대하여 ps lab 김윤경.
29장. 템플릿과 STL 01_ 템플릿 02_ STL.
자바 객체 지향 프로그래밍 Ps lab 김윤경.
상속 (Inheritance) private 전용부분 전용부분 공용부분 공용부분 public 기본 클래스
7 생성자 함수.
6 객체.
Presentation transcript:

C++ 프로그래밍 22 2008년 2학기 전자정보공학대학 컴퓨터공학부

상속과 포함

포함을 사용한 재사용 포함을 사용한 재사용의 예 [22-1]

포함에서의 생성자와 소멸자 Rect 클래스와 Point 클래스 각각의 생성자와 소멸자의 호출 순서 [22-7]

상속 부모 class의 속성(맴버 변수, 함수)를 물려 받는 자식 class의 개념 코드 재활용의 기본 개념

상속 앞으로의 예제 설명: 문서저장클래스 HTML저장클래스 string filename string contents string font int fontsize string fontcolor string filename string contents

생성자와 소멸자 자식 객체가 생성될 때, 자식 클래스의 생성자 뿐만 아니라 부모 클래스의 생성자도 호출된다. 부모 클래스에 오버로드된 여러 생성자가 있다면 그 중에서 어떤 생성자가 호출될 지 결정할 수 있다. (다음 페이지 참조) [22-13]

부모와 자식 객체 간의 대입(1) 부모 클래스의 객체를 자식 클래스의 객체에 대입할 수 없다. HTMLWriter hw; // 자식 클래스의 객체 생성 DocWriter dw; // 부모 클래스의 객체 생성 // 부모 클래스의 객체를 자식 클래스의 객체로 대입 hw = dw; // Error!! [22-17]

부모와 자식 객체 간의 대입(2) 자식 클래스의 객체를 부모 클래스의 객체에 대입할 수 있다. HTMLWriter hw; // 자식 클래스의 객체 생성 DocWriter dw; // 부모 클래스의 객체 생성 // 자식 클래스의 객체를 부모 클래스의 객체로 대입 dw = hw; // OK [22-19]

포인터, 레퍼런스의 형변환(1) 자식 클래스의 포인터로 부모 객체를 가리킬 수 없다. DocWriter dw; // 부모 클래스의 객체 생성 // 자식 클래스의 포인터 변수로 부모 객체를 가리킨다. HTMLWriter* phw = &dw; // Error!! [22-20]

포인터, 레퍼런스의 형변환(2) 부모 클래스의 포인터로 자식 객체를 가리킬 수 있다. HTMLWriter hw; // 자식 클래스의 객체 생성 // 부모 클래스의 포인터 변수로 자식 객체를 가리킨다. DocWriter* pDW = &hw; // OK [22-22]

포인터, 레퍼런스의 형변환(3) 레퍼런스의 경우도 포인터와 동일한 규칙을 갖는다. 자식 클래스의 레퍼런스로 부모 객체를 참조할 수 없다. 부모 클래스의 레퍼런스로 자식 객체를 참조할 수 있다. DocWriter dw; // 부모 클래스의 객체 생성 // 자식 클래스의 레퍼런스 변수로 부모 객체를 참조한다. HTMLWriter& hw = dw; // Error!! HTMLWriter hw; // 자식 클래스의 객체 생성 // 부모 클래스의 레퍼런스 변수로 자식 객체를 참조한다. DocWriter& dw = hw; // OK

접근 제어(1) 접근 제어 키워드 접근 제어 가이드라인 외부로부터 숨겨야 하는 멤버는 protected로 지정한다. 그 밖의 경우는 public으로 지정한다. 반드시 자식 클래스에 숨기고 싶다면 private로 지정한다.

접근 제어(2) 상속과 관련해서 접근 제어 키워드를 실험해 보자. class Parent { private: int priv; protected: int prot; public: int pub; }; class Child : public Parent void AccessParents() int n; // 부모의 멤버에 접근을 시도 n = priv; // 실패 n = prot; // 성공 n = pub; // 성공 }

포함과 상속의 구분 Has-a 관계와 Is-a 관계 포함과 상속을 구분해서 사용하기 위한 가이드라인 Has-a 관계 : A 가 B 를 가지고(포함하고) 있는 관계 예) 자동차는 타이어를 가지고 있다. Is-a 관계 : A 가 B 인 관계 예) 사과는 과일이다. 포함과 상속을 구분해서 사용하기 위한 가이드라인 Has-a 관계의 경우에는 포함을 사용한다. Is-a 관계의 경우에는 상속을 사용한다.

상속의 연습 – 도형 class 만들기 Shape Class 정의하기 Rectangle Class 정의하기 맴버변수: float _x,_y 생성자: Shape(float x, float y)  _x와 _y의 값을 설정 맴버함수: void Draw() const 아래와 같은 내용 출력 [SHAPE] position = ( ‘_x값’, ‘_y값’ ) Rectangle Class 정의하기 Shape Class로부터 상속 맴버변수: float _width, _height 생성자: Rectangle(float x, float y, float w, float h) 아래와 같은 내용 출력 [RECTANGLE] position = ( ‘_x값’, ‘_y값’), size = (‘_width’, ‘_height’)

상속의 연습 – 도형 class 만들기 Circle Class 정의하기 Shape Class로부터 상속 맴버변수: float _radius 생성자: Circle(float x, float y, float radius) 맴버함수: void Draw() const 아래와 같은 내용 출력 [CIRCLE] position = ( ‘_x값’, ‘_y값’), radius = ‘_radius’

상속의 연습 – 도형 class 만들기 도형 Class 테스트 int main() { Shape a(100,40); Rectangle b(120,40,50,20); Circle c(200,100,50); a.Draw(); b.Draw(); c.Draw(); return 0; }

Rectangle Class : Shape Class Circle Class : Shape Class Shape(float x, float y) void Draw() const float _x float _y Rectangle Class : Shape Class Rectangle(float x, float y, float w, float h) void Draw() const float _width float _height Circle Class : Shape Class Circle(float x, float y, float r) void Draw() const float _radius

가상함수와 오버라이딩 (virtual function and overriding)

그림 그리는 프로그램 여러 가지 형태의 도형을 저장하고 싶다 각각의 ARRAY?? 포인터의 형변환

포인터의 형변환 부모 클래스의 포인터로 자식 객체를 가리킬 수 있다. HTMLWriter hw; // 자식 클래스의 객체 생성 // 부모 클래스의 포인터 변수로 자식 객체를 가리킨다. DocWriter* pDW = &hw; // OK [22-22]

포인터의 형변환 이용 1. 부모(base) 클래스 포인터의 배열을 설정 2. 필요 시 마다 new를 이용 자식class 생성 4. 다 사용 했으면 delete를 이용 메모리 해제

다양한 클래스의 객체를 배열에 담기(1) 도형 클래스의 객체들을 배열에 담아서 사용하는 예 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; }

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

Draw의 실행 결과가 이상하다?? 부모(base) 클래스의 함수가 호출됐다?!

 가상함수 가상 함수 부모 클래스의 포인터로 자식 클래스를 가르킬 경우: 객체의 실제 내용에 따라 불릴 순 없을까? 같은 이름의 함수의 실행은 포인터 타입이 우선 객체의 실제 내용에 따라 불릴 순 없을까? 컴파일 시에 결정되지 않고 함수가 런타임 시 결정 맴버 함수의 동적인 선택(동적바인딩)! 다형성  가상함수

가상함수의 선언 부모 클래스에서 함수 선언부분에 virtual 이라고 추가 구현부분은 그대로 나둔다. class parent 구현부분은 그대로 나둔다. class parent { public: virtual void DoIt(); }; class child : class parent void DoIt();

Draw 문제의 해결 shape 클래스의 Draw() 선언부분 수정 virtual void Draw() const

다형성(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 Function) 부모 클래스의 가상함수의 구현을 생략 (구현 대신 0 을 대입)  순수 가상 함수 class parent { public: virtual void DoIt()= 0; };

순수 가상 함수(Pure Virtual Function) Shape::Draw() 함수를 순수 가상 함수로 만들어보자. class Shape { public: virtual void Draw() const = 0; … }; /* 함수의 정의 부분도 삭제 void Shape::Draw() const cout << "[Shape] Position = ( " << _x << ", " << _y << ")\n"; } */ [23-11]

추상 클래스 추상 클래스(Abstract Class) 하나 이상의 순수 가상 함수를 포함하고 있는 클래스 추상 클래스 타입의 객체 생성은 불가능 오로지 부모 클래스로서만 사용

추상 클래스 Shape::Draw() 함수를 순수 가상 함수로 만드는 것의 효과 Shape 클래스의 객체를 못만듬 오버라이딩(Overriding)을 통해서만 구현 컴파일러나 다른 개발자들에게 Shape::Draw() 함수가 자식 클래스에 의해서 오버라이딩 될 것이며, 다형성을 통해서만 호출할 것임을 알려줌

다양한 종류의 멤버 함수 상속과 관련된 멤버 함수의 종류 어떤 종류의 멤버 함수를 만들까? 일반적인 멤버 함수 가상 함수 순수 가상 함수 어떤 종류의 멤버 함수를 만들까? 기본형태  멤버 함수 다형성  가상 함수 다형성을 위한 함수의 원형만 필요  순수 가상 함수

오버로딩과 오버라이딩 오버로딩(Overloading) 오버라이딩(Overriding) 호출 인자가 다를 경우에 알맞은 것을 선택 ex) void DoIt( ); void DoIt(int i); 오버라이딩(Overriding) 부모 객체의 함수를 자식 객체에서 재정의 ex) parent::DoIt( ); child::DoIt( );

오버로딩과 오버라이딩 부모 클래스에서 오버로드 된 함수 중에서 어느 것 하나라도 오버라이드 하면 나머지 다른 함수들도 모두 사용할 수 없다. class Pet { public: void Eat(); void Eat(const string& it); string name; }; class Dog : public Pet void Eat(); // 하나만 재정의 [23-11]

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