Chapter 6 Objects and Classes

Similar documents
gnu-lee-oop-kor-lec06-3-chap7

C++ Programming

쉽게 풀어쓴 C 프로그래밍

1. auto_ptr 다음프로그램의문제점은무엇인가? void func(void) int *p = new int; cout << " 양수입력 : "; cin >> *p; if (*p <= 0) cout << " 양수를입력해야합니다 " << endl; return; 동적할

(8) getpi() 함수는정적함수이므로 main() 에서호출할수있다. (9) class Circle private double radius; static final double PI= ; // PI 이름으로 로초기화된정적상수 public

Microsoft PowerPoint - additional08.ppt [호환 모드]

쉽게 풀어쓴 C 프로그래밍

PowerPoint Presentation

Slide 1

JAVA PROGRAMMING 실습 08.다형성

Slide 1

1. 객체의생성과대입 int 형변수 : 선언과동시에초기화하는방법 (C++) int a = 3; int a(3); // 기본타입역시클래스와같이처리가능 객체의생성 ( 복습 ) class CPoint private : int x, y; public : CPoint(int a

설계란 무엇인가?

<4D F736F F F696E74202D2036C0CFC2B05FB0B4C3BCC1F6C7E2C7C1B7CEB1D7B7A1B9D62E707074>

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

1. 상속의기본개념 다음과같은문제를위한클래스설계 자동차 속성 : 색상, 배기량, 현재속도 메서드 : 가속하라, 멈춰라, 시동을켜라 트럭 속성 : 색상, 배기량, 현재속도, 최대중량 메서드 : 가속하라, 멈춰라, 시동을켜라 택시 속성 : 색상, 배기량, 현재속도, 요금,

PowerPoint Template

Microsoft PowerPoint - Chap12-OOP.ppt

Microsoft PowerPoint - additional01.ppt [호환 모드]

Microsoft PowerPoint - additional07.ppt [호환 모드]

PowerPoint Presentation

(Microsoft PowerPoint - java2-lecture3.ppt [\310\243\310\257 \270\360\265\345])

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2

PowerPoint Template

Microsoft PowerPoint - 2강

PowerPoint Presentation

Chapter 6 Objects and Classes

자바 프로그래밍

Microsoft PowerPoint - C++ 5 .pptx

Microsoft PowerPoint - java1-lab5-ImageProcessorTestOOP.pptx

PowerPoint Presentation

C++ 기본문법 정리

쉽게 풀어쓴 C 프로그래밍

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

Microsoft PowerPoint - 6주차.pptx

PowerPoint Presentation

Microsoft PowerPoint - Chapter 6.ppt

4 장클래스와객체 클래스와객체 public과 private 구조체와클래스객체의생성과생성자객체의소멸과소멸자생성자와소멸자의호출순서디폴트생성자와디폴트소멸자멤버초기화멤버함수의외부정의멤버함수의인라인함수선언 C++ 프로그래밍입문

1. 클래스와배열 int 형배열선언및초기화 int ary[5] = 1, 2, 3, 4, 5 ; for (int i = 0; i < 5; i++) cout << "ary[" << i << "] = " << ary[i] << endl; 5 장클래스의활용 1

Microsoft PowerPoint - Lect04.pptx

PowerPoint 프레젠테이션

<4D F736F F F696E74202D2038C0E55FB0ADC0C7B3EBC6AE28B0A1BBF3C7D4BCF6BFCD20B4D9C7FCBCBA29>

Microsoft PowerPoint 장강의노트.ppt

(Microsoft Word - \301\337\260\243\260\355\273\347.docx)

슬라이드 1

C++ Programming

Design Issues

JAVA PROGRAMMING 실습 02. 표준 입출력

제11장 프로세스와 쓰레드

PowerPoint 프레젠테이션

PowerPoint Presentation

PowerPoint 프레젠테이션

C++ Programming

chap10.PDF

쉽게 풀어쓴 C 프로그래밍

윤성우의 열혈 TCP/IP 소켓 프로그래밍

JAVA PROGRAMMING 실습 07. 상속

C++ Programming

No Slide Title

Microsoft PowerPoint - java2 [호환 모드]

PowerPoint Template

Microsoft PowerPoint - CSharp-10-예외처리

1. 기본형의형변환복습 C/C++ 형변환의종류 자동형변환 ( 묵시적형변환 ) 강제형변환 ( 명시적형변환 ) 기본형의자동형변환의예 1. 배열 to 포인터변환 배열명은해당배열의첫번째원소의 주소로변환됨 int ary[10]; int *pary = ary; 2. 함수 to 포

JAVA PROGRAMMING 실습 05. 객체의 활용

제 1 강 희망의 땅, 알고리즘

1

강의계획서 1. 강의개요 학습과목명 객체지향프로그래밍 Ⅰ 학점 3 학점교 강사명교 강사전화번호 강의시간 4시간강의실수강대상 2. 교과목학습목표 4차산업혁명시대의도래로컴퓨터와프로그래밍에대한관심이커지고있으며, 여러분야에서소프트웨어의중요성을강조하며, 새시대를이끌

Microsoft PowerPoint - chap11

쉽게 풀어쓴 C 프로그래밍

Slide 1

5장.key

Microsoft PowerPoint - chap06-2pointer.ppt

Microsoft PowerPoint - 8ÀÏ°_Æ÷ÀÎÅÍ.ppt

01-OOPConcepts(2).PDF

쉽게 풀어쓴 C 프로그래밍

<432B2BC7C1B7CEB1D7B7A1B9D628BABBB9AE5FC3D6C1BE295B315D2E687770>

(Microsoft PowerPoint - 07\300\345.ppt [\310\243\310\257 \270\360\265\345])

PowerPoint Presentation

금오공대 컴퓨터공학전공 강의자료

Microsoft Word - java19-1-midterm-answer.doc

PowerPoint Presentation

슬라이드 1

Microsoft PowerPoint - additional06.ppt [호환 모드]

PowerPoint Presentation

Slide 1

Slide 1

PowerPoint Presentation

C++ 기본문법 정리

PowerPoint Presentation

10.0pt1height.7depth.3width±â10.0pt1height.7depth.3widthÃÊ10.0pt1height.7depth.3widthÅë10.0pt1height.7depth.3width°è10.0pt1height.7depth.3widthÇÁ10.0pt1height.7depth.3width·Î10.0pt1height.7depth.3width±×10.0pt1height.7depth.3width·¡10.0pt1height.7depth.3width¹Ö pt1height.7depth.3widthŬ10.0pt1height.7depth.3width·¡10.0pt1height.7depth.3width½º, 10.0pt1height.7depth.3width°´10.0pt1height.7depth.3widthü, 10.0pt1height.7depth.3widthº¯10.0pt1height.7depth.3width¼ö, 10.0pt1height.7depth.3width¸Þ10.0pt1height.7depth.3width¼Ò10.0pt1height.7depth.3widthµå

쉽게

17장 클래스와 메소드

쉽게 풀어쓴 C 프로그래밍

PowerPoint Presentation

PowerPoint Presentation

유니티 변수-함수.key

PowerPoint Presentation

C# Programming Guide - Types

class Sale void makelineitem(productspecification* spec, int qty) SalesLineItem* sl = new SalesLineItem(spec, qty); ; 2. 아래의액티비티다이어그램을보고 Java 또는 C ++,

Network Programming

Transcription:

11 장상속과다형성 1

강의목표 상속 (inheritance) 을이용하여기본클래스 (base class) 로부터파생클래스 (derived class) 생성 (11.2) 파생클래스유형의객체를기본클래스유형의매개변수 (parameter) 로전달함으로써일반화프로그래밍 (generic programming) 작업 (11.3) 생성자와소멸자의연쇄적처리 (chaining) 에대한이해 (11.4) 기본클래스의인수가있는생성자호출방법 (11.4) 파생클래스에서함수재정의 (redefining)(11.5) 재정의와오버로딩 (overloading) 의차이점 (11.5) 다형성 (polymorphism) 과가상함수 (virtual function) 를사용한동적결합 (binding) 의이해 (11.6) 재정의와오버라이딩 (overriding) 의차이점 (11.6) 정적결합 (static matching) 과동적결합 (dynamic binding) 의차이점 (11.6) 파생클래스로부터기본클래스의보호멤버 (protected member) 접근 (11.7) 순수가상함수 (pure virtual function) 를포함하고있는추상클래스 (abstract class) 선언 (11.8) dynamic_cast 연산자를사용하여기본클래스유형의객체를파생클래스유형으로형변환 (11.9) 2

기본클래스와파생클래스 -color: string -filled: bool GeometricObject +GeometricObject() +GeometricObject(color: string, filled: bool) +getcolor(): string +setcolor(color: string): void +isfilled(): bool +setfilled(filled: bool): void +tostring(): string -radius: double +Circle() Circle +Circle(radius: double) +Circle(radius: double, color: string, filled: bool) +getradius(): double +setradius(radius: double): void +getarea(): double +getperimeter(): double +getdiameter(): double 객체의색상 ( 기본 : 흰색 ) 객체가색으로채워졌는지의여부 ( 기본 : 거짓 ) GeometricObject 생성 특정색상과채워짐값으로 GeometricObject 생성 색상반환 새로운색상으로설정 채워짐속성반환 새로운채워짐속성설정 객체의문자열표현반환 -width: double -height: double +Rectangle() Rectangle +Rectangle(width: double, height: double) +Rectangle(width: double, height: double, color: string, filled: bool) +getwidth(): double +setwidth(width: double): void +getheight(): double +setheight(height: double): void +getarea(): double +getperimeter(): double GeometricObject.h GeometricObject.cpp DerivedCircle.h DerivedCircle.cpp Rectangle.h Rectangle.cpp TestGeometricObject Run 3

일반화프로그래밍 기본클래스유형의객체가요구되는곳이면어디에서든지파생클래스의객체도사용이가능하다. 이는객체인수의넓은범위에서함수를포괄적으로사용할수있게해주는데, 이를일반화프로그래밍 (generic programming) 이라고한다. 만약어떤함수의매개변수가기본클래스 ( 예로써 GeometricObject) 유형이라고한다면파생클래스 ( 예로써 Circle 이나 Rectangle) 의객체에대해서도이함수로매개변수로의전달이가능하다. 4

기본클래스생성자호출 생성자는클래스의인스턴스를생성하기위해서사용된다. 데이터필드나함수와는달리기본클래스의생성자는파생클래스로상속되지않고, 단지기본클래스의데이터필드를초기화하기위해서파생클래스의생성자로부터호출될수있다. 호출구문은다음과같다. DerivedClass(parameterList): BaseClass() { // 초기화수행 } 또는 DerivedClass(parameterList): BaseClass(argumentList) { // 초기화수행 } 5

기본클래스에서인수없는생성자 파생클래스의생성자는항상기본클래스의생성자를호출해야한다. 만약기본클래스생성자가명시적으로호출되지않는다면, 기본적으로기본클래스의인수없는생성자가호출된다. 예를들면다음과같다. public Circle() { radius = 1; } 같다 public Circle(): GeometricObject() { radius = 1; } public Circle(double radius) { this->radius = radius; } 같다 public Circle(double radius) : GeometricObject() { this->radius = radius; } 6

생성자와소멸자의연쇄적처리 클래스의인스턴스를생성할때상속연결을따라모든기본클래스들의생성자를호출한다. 기본클래스의생성자는파생클래스의생성자앞에서호출된다. 그에비해소멸자는자동적으로역순으로호출되는데, 즉파생클래스의소멸자가먼저호출된다. 이를생성자와소멸자의연쇄적처리 (constructor and destructor chaining) 라고한다. ChainingDemo Run 7

인수없는생성자 클래스가확장되도록설계를하였다면프로그램오류를피하기위해서인수없는생성자를제공하는것이더바람직하다. 다음코드를살펴보자. class Fruit { public: Fruit(int id) { } }; class Apple: public Fruit { public: Apple() { } }; 8

함수재정의 tostring() 함수가 GeometricObject의문자열내용을반환하기위해서 GeometricObject 클래스에서정의되었다. Circle과 Rectangle 객체에맞는좀더특정한내용을반환하기위해 Circle과 Rectangle 클래스에서이함수를재정의 (redefine) 할수있다. 9

기본클래스의함수호출 만약호출하는객체 circle 에대해 GeometricObject 클래스에서정의된 tostring 함수를호출하고자할때는다음과같이기본클래스이름의영역결정연산자 (scope resolution operator, ::) 를사용한다 : circle.geometricobject::tostring() 10

재정의와오버로딩 5.7 절함수오버로딩 에서함수오버로딩에관하여배웠다. 함수를오버로딩하는것은같은이름을가지긴하지만다른특성을갖는하나이상의함수를제공하는방법이다. 함수를재정의하기위해서는파생클래스에서의함수가기본클래스에서의함수와같은특성을갖고같은반환유형을사용하도록해야된다. 11

가상함수 다형성 (polymorphism) 을설명하기전에리스트 11.9 의예부터시작하겠다. C++ 에서는파생클래스에서가상함수를재정의하는것을함수오버라이딩 (overriding) 이라고한다. WhyPolymorphismDemo PolymorphismDemo Run Run 12

가상함수정의 함수에대해동적결합이가능하도록하려면다음두가지가필요하다. 함수는기본클래스에서 virtual 로선언되어야한다. 함수에대한객체를참조하는변수는객체의주소를포함하고있어야한다. 13

Note 만약함수가기본클래스에서 virtual 로정의되었다면자동적으로모든파생클래스에서도 virtual 이된다. 파생클래스에서함수선언에 virtual 키워드를추가하는것이반드시필요한것은아니다. 14

정적결합과동적결합 함수의특성을맞추고함수구현을결합하는것은두가지분리된문제이다. 변수의선언유형으로는컴파일될때어떤함수가적합한지가결정된다. 컴파일러는매개변수유형과매개변수의수, 매개변수의순서에따라컴파일을할때적합한함수를찾아낸다. 반면가상함수는몇몇파생클래스에서구현될수있는데, C++ 에서는변수에의한참조로객체의실제클래스가결정되어실행시함수의구현이동적으로결합된다. 15

가상함수사용? 기본클래스에서정의된함수가파생클래스에서재정의될필요가있다면혼동과실수를피하기위해가상 (virtual) 으로선언해야된다. 이와는반대로함수가재정의되지않을것이라면가상으로선언하지않는것이더효과적인데, 이는실행시에동적으로가상함수들을결합하는데에는더많은시간과시스템자원이사용되기때문이다. 16

보호 (protected) 키워드 지금까지는클래스의밖으로부터데이터필드와함수가접근가능한지를지정하기위해전용 (private) 과범용 (public) 키워드를사용하였다. 전용멤버는단지클래스안에서만접근이가능하고범용멤버는다른클래스로부터도접근이가능하다. 기본클래스에서보호 (protected) 데이터필드또는보호함수는파생클래스에서이름에의해서접근될수있다. VisibilityDemo 17

추상클래스 상속계층에서클래스는여러개의새로운파생클래스를가짐으로써좀더구체적인상태가된다. 파생클래스로부터부모나조상클래스로거꾸로이동한다면클래스는구체적인상태와는반대로좀더일반적이며덜구체적인상태를나타내게될것이다. 클래스설계에서기본클래스는파생클래스의일반적인특징을포함하도록해야한다. 때로는기본클래스가너무추상적이어서어떤특정인스턴스를가질수없을때가있다. 그와같은클래스를추상클래스 (abstract class) 라고한다. 18

추상함수 모든기하학객체에대해면적과둘레를계산할수있으므로 GeometricObject 클래스에서 getarea() 와 getperimeter() 함수를선언하는것이더좋은방법이다. 그러나이들함수는 GeometricObject 클래스에서구현될수없는데, 그함수의구현이기하학객체의유형에따라달라지기때문이다. 이와같은함수를추상함수 (abstract function) 라고한다. GeometricObject 에서추상함수를선언한후에는 GeometricObject 는추상클래스가된다. 19

추상클래스예 # 표시는보호 (protected) 수식자를나타냄 -color: string -filled: bool GeometricObject #GeometricObject() #GeometricObject(color: string, filled: bool) +getcolor(): string +setcolor(color: string): void +isfilled(): bool +setfilled(filled: bool): void +tostring(): string +getarea(): double +getperimeter(): double AbstractGeometricObject.h AbstractGeometricObject.cpp DerivedCircle2.h DerivedCircle2.cpp Rectangle2.h -radius: double +Circle() Circle +Circle(radius: double) +Circle(radius: double, color: string, filled: bool) +getradius(): double +setradius(radius: double): void +getdiameter(): double -width: double -height: double +Rectangle() Rectangle +Rectangle(width: double, height: double) +Rectangle(width: double, height: double, color: string, filled: bool) +getwidth(): double +setwidth(width: double): void +getheight(): double +setheight(height: double): void Rectangle2.cpp TestGeometricObject2.cpp Run 20

동적형변환 리스트 11.18 에서 displaygeometricobject 함수에대한헤더는 void displaygeometricobject(geometricobject &object) 이다. 객체가원인경우반지름, 직경, 면적, 둘레를출력하도록이함수를수정하고자한다고해보자. 어떻게하면되는가? 21

동적형변환예 다음코드에서보는바와같이 GeometricObject 유형의매개변수를 Circle 유형으로형변환하기위해 dynamic_cast 연산자를사용하고, Circle 클래스에서정의된 getradius() 와 getdiameter() 함수를호출한다. GeometricObject *p = &object; Circle *p1 = dynamic_cast<circle*>(p); if (p1!= 0) // NULL은 0과같은 C++ 상수임 { cout << "The radius is " << p1->getradius() << endl; cout << "The diameter is " << p1->getdiameter() << endl; } 22

업캐스팅과다운캐스팅 파생클래스유형의포인터를기본클래스유형의포인터로할당하는것을업캐스팅 (upcasting) 이라고하고, 기본클래스유형의포인터를파생클래스유형의포인터로할당하는것을다운캐스팅 (downcasting) 이라고한다. 23

업캐스팅과다운캐스팅 업캐스팅은 dynamic_cast 연산자를사용하지않고암시적으로수행할수있다. 예를들어, 다음코드는옳은것이다 : GeometricObject *p = new Circle(1); Circle *p1 = new Circle(2); p = p1; 그러나다운캐스팅은명시적으로수행되어야한다. 예를들어, p1 에 p 를할당하기위해서는다음을사용해야한다. p1 = dynamic_cast<circle>(p); 24

업캐스팅과다운캐스팅 DynamicCastingDemo Run 25

typeid 연산자 가끔객체의클래스에관한정보를알아내는것이유용할때가있다. type_info 클래스의객체로참조를반환하기위해 typeid 연산자를사용할수있다. 예를들어, x 객체에대한클래스이름을출력하기위해서는다음문장을사용한다. string x; cout << typeid(x).name() << endl; x 가 string 클래스의객체이기때문에문자열을출력한다. 26