Microsoft PowerPoint - 5주_강의노트

Similar documents
Microsoft PowerPoint - Chapter 6.ppt

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

C++ Programming

Microsoft PowerPoint - C++ 5 .pptx

Microsoft PowerPoint - Chapter 4-rev

설계란 무엇인가?

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

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

슬라이드 1

Microsoft PowerPoint - Chap12-OOP.ppt

Microsoft PowerPoint - Chapter 10.ppt

C++ Programming

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

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

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

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

슬라이드 1

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

PowerPoint Template

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

C++ Programming

Microsoft PowerPoint - chap10-함수의활용.pptx

쉽게 풀어쓴 C 프로그래밍

PowerPoint 프레젠테이션

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

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

설계란 무엇인가?

PowerPoint Template

<4D F736F F F696E74202D2036C0CFC2B05FB0B4C3BCC1F6C7E2C7C1B7CEB1D7B7A1B9D62E707074>

Microsoft PowerPoint - chap06-2pointer.ppt

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

쉽게 풀어쓴 C 프로그래밍

PowerPoint Presentation

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

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - ch07 - 포인터 pm0415

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning

JAVA PROGRAMMING 실습 08.다형성

학습목차 2.1 다차원배열이란 차원배열의주소와값의참조

chap10.PDF

11장 포인터

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

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

11장 포인터

PowerPoint Presentation

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

구조체정의 자료형 (data types) 기본자료형 (primitive data types) : char, int, float 등과같이 C 언어에서제공하는자료형. 사용자정의자료형 (user-defined data types) : 다양한자료형을묶어서목적에따라새로운자료형을

KNK_C_05_Pointers_Arrays_structures_summary_v02

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

JAVA PROGRAMMING 실습 05. 객체의 활용

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

C++ Programming

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

1 장 C 언어복습 표준입출력배열포인터배열과포인터함수 const와포인터구조체컴파일러사용방법 C++ 프로그래밍입문

Microsoft PowerPoint - chap11-포인터의활용.pptx

The C++ Programming Language 5 장포인터, 배열, 구조체 5.9 연습문제 다음의선언문을순서대로작성해보자. 문자에대한포인터, 10개정수의배열, 10개정수의배열의참조자, 문자열의배열에대한포인터, 문자에대한포인터에대한포인터, 상수정수, 상수

설계란 무엇인가?

Microsoft PowerPoint - Java7.pptx

Microsoft PowerPoint - chap06-5 [호환 모드]

프입2-강의노트-const-friend-static

이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다. 2

C프로-3장c03逞풚

JAVA PROGRAMMING 실습 02. 표준 입출력

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

4. 1 포인터와 1 차원배열 4. 2 포인터와 2 차원배열 4. 3 포인터배열 4. 4 포인터와문자그리고포인터와문자열

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

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

Lab 3. 실습문제 (Single linked list)_해답.hwp

Slide 1

Slide 1

PowerPoint Presentation

Microsoft PowerPoint - Chapter 1-rev

PowerPoint Presentation

목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

<4D F736F F F696E74202D20C1A63137C0E520B5BFC0FBB8DEB8F0B8AEBFCD20BFACB0E1B8AEBDBAC6AE>

PowerPoint Template

Microsoft PowerPoint 자바-기본문법(Ch2).pptx

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

PowerPoint 프레젠테이션

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

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

Microsoft Word - FunctionCall

The C++ Programming Language 4 장타입과선언 4.11 연습문제 Hello,world! 프로그램을실행시킨다. 프로그램이컴파일되지않으면 B3.1 을참고하자. #include<iostream> //#include 문, 헤더파일, 전처리지시

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

PowerPoint Presentation

PowerPoint Presentation

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CC0E7B0EDB0FCB8AE5C53746F636B5F4D616E D656E74732E637070>

02장.배열과 클래스

8. 클래스 D는클래스 A, 클래스 B, 클래스 C로부터상속받아맊들고싶다. 아래빈칸을채우시오. ( 대소문자주의하시오 ) class D { ; Student s; 11. 다음프로그램의실행결과는? 9. 다음프로그램의실행결과는? class A{ A(){cout << " 생성

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

쉽게 풀어쓴 C 프로그래밍

3. 1 포인터란 3. 2 포인터변수의선언과사용 3. 3 다차원포인터변수의선언과사용 3. 4 주소의가감산 3. 5 함수포인터

Microsoft PowerPoint - chap03-변수와데이터형.pptx

No Slide Title

Microsoft PowerPoint - chap06-1Array.ppt

<4D F736F F F696E74202D2038C0E55FB0ADC0C7B3EBC6AE28B0A1BBF3C7D4BCF6BFCD20B4D9C7FCBCBA29>

Microsoft PowerPoint - [2009] 02.pptx

제 14 장포인터활용 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

PowerPoint 프레젠테이션

Transcription:

C++ 프로그래밍 강의노트 #5: 5 장클래스특징 I 5.1 복사생성자 (copy constructor) 5.2 객체포인터와객체배열 5.3 this 포인터 5.4 friend 함수 5.5 실습문제 2007. 4. 4 담당교수 : 조재수 E-mail: jaesoo27@kut.ac.kr 1 학습내용 복사생성자 (copy constructor) 객체포인터와객체배열 this 포인터 friend 함수 실습문제 2/50 1

복사생성자 (copy constructor) class myclass int a; myclass() cout << "myclass() 생성자호출 << endl; myclass(int x) cout << "myclass(int x) 생성자호출 <<endl; a = x; myclass(const myclass &y) cout << "myclass(const myclass &y) 생성자호출 <<endl; a = y.a; int get (); ; int myclass::get() return a; myclass ob1; // myclass() 생성자호출 // myclass(int x) 생성자호출, C스타일의초기화 myclass ob2 = 20; // a를 20으로초기화 myclass ob3(10); // myclass(int x) 생성자호출, C++ 스타일 myclass ob4(ob3); // myclass(const myclass &y) 생성자호출 myclass ob5 = ob4; // myclass(const myclass &y) 생성자호출 cout << "ob1 객체 a= " << ob1.get() << endl; cout << "ob2 객체 a= " << ob2.get() << endl; cout << "ob3 객체 a= " << ob3.get() << end; cout << "ob4 객체 a= " << ob4.get() << end; cout << "ob5 객체 a= " << ob5.get() << end; 3/50 복사생성자 (copy constructor) 앞예제프로그램의실행결과 ------------------------------------- myclass() 생성자호출 myclass(int x) 생성자호출 myclass(int x) 생성자호출 myclass(const myclass &y) 생성자호출 myclass(const myclass &y) 생성자호출 ob1 객체 a = -89123456 ob2 객체 a = 20 ob3 객체 a = 10 ob4 객체 a = 10 ob5 객체 a = 10 ------------------------------------------ 복사생성자함수란? 자기자신과같은형태의 ( 자료형 ) 객체를인자로받을수있는생성자함수 생성자함수의오버로딩된형태 매개변수선언에서 const 는반드시붙여주지않아도되지만, & 선언은반드시해주어야함 & 선언을하지않으면 -> 무한루프에빠져버린다.(?) -> 컴파일에러가발생 4/50 2

기본 (default) 복사생성자 1: 2: 3: 4: class myclass 5: int a, b; 6: 9: myclass(intx, inty) 10: cout << "myclass(int x) 생성자호출 <<endl; 11: a = x; 12: b = y; 13: 14: 15: void ShowData () 16: cout << "a: " << a << ' ' << "b: " << b << endl; 17: 17: ; 18: 19: 20: 24: 25: myclass ob1(10, 20); 26: myclass ob2(ob1); // myclass ob2 = ob1; 27: 28: ob1.showdata(); 29: ob2.showdata(); 30: 31: 32: 실행결과 a: 10 b: 20 a: 10 b: 20 기본 (default) 복사생성자함수 : 전달된매개객체와의멤버변수대멤버변수를복사 ( copy) 해주는일을수행하고, 컴파일러가자동으로삽입 ---------------------------------------- class myclass int a, b; myclass(int x, int y) cout << "myclass(int x) 생성자호출 <<endl; a = x; b = y; // 기본 ( 디폴트 ) 복사생성자 myclass(const myclass &ob) a = ob.a; b = ob.b; int ShowData () cout << "a: " << a <<' ' << "b: " << b << endl; ; ------------------------------------------- 5/50 사용자정의복사생성자 #include<iostream> class Person char *name; char *phone; int age; Person(char* _name, char* _phone, int _age); ~Person(); void ShowData(); ; Person::Person(char* _name, char* _phone, int _age) name=new char[strlen(_name)+1]; strcpy(name, _name); phone=new char[strlen(_phone)+1]; strcpy(phone, _phone); age=_age; Person::~Person() delete []name; delete []phone; void Person::ShowData() //name 포인터가가리키는주소값출력 printf("name=%d n, name); //phone 포인터가가리키는주소값출력 printf("phone=%d n, phone); cout<<"age: "<<age<<endl; Person p1("cho", "041-560-1491", 36); Person p2=p1; // Person p2(p1); p1.showdata(); p2.showdata(); 위프로그램은런 - 타임에러가발생한다. 런 - 타임에러의원인은? 6/50 3

사용자정의복사생성자 실행결과는다음과같다. --------------------------------------- name = 4726352 phone = 4726288 age = 36 name = 4726352 phone = 4726288 age = 36 ----------------------------------- 7/50 사용자정의복사생성자 p1 Person 객체의메모리구조 기본복사생성자함수를통한 p2 객체생성 8/50 4

사용자정의복사생성자 p2 객체의소멸 9/50 사용자정의복사생성자 다음과같은사용자정의복사생성자함수를추가하여실행해보자 ----------------------------------------------- Person::Person(const Person& p) name=new char[strlen(p.name)+1]; strcpy(name, p.name); phone=new char[strlen(p.phone)+1]; strcpy(phone, p.phone); age=p.age; ----------------------------------------------------- 10/50 5

사용자정의복사생성자 실행결과는다음과같다. -------------------------------------- name = 4726352 phone = 4726288 age = 36 name = 4726240 phone = 4725792 age = 36 -------------------------------------- 11/50 사용자정의복사생성자 사용자정의복사생성자에의한 p1, p2 객체메모리구조 12/50 6

사용자정의복사생성자 복사생성자가호출되는경우 1 객체생성시생성선언문에서다른객체를이용하여초기화할때 2 객체가매개변수로서함수에게전달될때 3 함수의반환값으로사용되는임시객체가만들어질때 복사생성자함수의일반적인형식 classname (const classname &obj) // body of copy constructor 13/50 #include <cstdlib> class array int *p; int size; array(int sz) // 생성자함수 p = new int[sz]; if (!p) exit(1); size = sz; cout << "Using 'normal' constructor n"; ~array() delete [] p; // 복사생성자 array(const array &a); void put(int i, int j) if (i>=0 && i<size) p[i] = j; int get(int i) return p[i]; ; array::array(const array &a) int i; size = a.size; p = new int[a.size]; // 복사본을위해메모리를할당한다. if (!p) exit(1); for(i=0; i<a.size; i++) p[i] = a.p[i]; // 내용을복사한다. cout << "Using copy constructor n"; /* 복사생성자함수정의 : 이경우, 메모리는복사본을위해할당되고, 이메모리의주소가 p 에저장된다. 이러한방법으로, p 는원본객체와같은메모리를가리키지않게된다. */ array num(10); // 보통의 생성자를호출한다. int i; // 값들을배열에저장한다. for(i=0; i<10; i++) num.put(i, i); // num 을출력한다. for(i=9; i>=0; i--) cout << num.get(i) << endl; // 또다른배열을생성하고 num 으로초기화한다. array x = num; // 이문장은복사생성자함수를호출한다. // x 를출력한다. for(i=0; i<10; i++) cout << x.get(i) << endl; 14/50 7

사용자정의복사생성자 다음은복사생성자함수를호출하는가? array a(10); array b(20); b = a; 이경우복사생성자함수호출? 15/50 #include <cstring> #include <cstdlib> void show(strtype x) // 전역함수의매개변수로객체전달 char *s; class strtype char *p; strtype(char *s); // 생성자함수 ~strtype() delete [] p; char *get() return p; ; s = x.get(); cout << s << " n"; strtype a("hello"), b("there"); strtype::strtype(char *s) int i; i = strlen(s)+1; p = new char [i]; if (!p) cout << "Allocation error n"; exit(1); strcpy(p, s); show(a); show(b); 위프로그램은런 - 타임에러가발생한다. 그이유는? 에러가생기지않도록복사생성자함수를정의해보자. 16/50 8

사용자정의복사생성자함수 strtype(const strtype &o); // 복사생성자함수 // 복사생성자함수 strtype::strtype(const strtype &o) cout << " 복사생성자함수호출! << endl; p = new char [strlen(o.p)+1]; // 복사본을위한메모리를할당한다. if (!p) cout << "Allocation error n"; exit(1); strcpy(p, o.p); // 문자열을복사본에복사한다. 참고로객체가매개변수로전달되는과정에서모든경우에대하여복사생성자함수를정의해줄필요는없다. 그객체의멤버변수중동적으로메모리를할당하는경우가아닌경우에는컴파일러가제공하는기본복사생성자함수를이용해도실행에러가발생하지않는다. 17/50 사용자정의복사생성자함수 class myclass int i, j; myclass(int x, int y) i=x; j=y; ~myclass() void ShowData() cout << "i= " << i << endl; cout << "j= " << j << endl; void fct(myclass a); ; void fct(myclass a) cout << " 함수 fct 입니다." << endl; a.showdata(); myclass ob1(1,2); ob1.showdata(); fct(ob1); // 함수호출시매개변수로객체전달 실행결과는다음과같으며실행에러는없다. ---------------------------- i=1 j=2 함수 fct 입니다. i=1 j=2 ---------------------------- 객체의멤버변수중동적으로메모리를할당하는경우가아닌경우에는컴파일러가제공하는기본복사생성자함수를이용해도실행에러가발생하지않는다. 18/50 9

#include <cstring> #include <cstdlib> class strtype char *p; strtype(char *s); // 생성자함수 ~strtype() delete [] p; void show(); strtype fct(); // 함수 fct 는리턴형으로 strtype 객체를리턴 ; strtype::strtype(char *s) int i; i = strlen(s)+1; p = new char [i]; if (!p) cout << "Allocation error n"; exit(1); strcpy(p, s); void strtype::show() cout << p << " n"; strtype strtype::fct() strtype temp("hi! This is function fct"); return temp; strtype a("hello"); a.show(); // b 객체가 fct 함수에서리턴된 temp 객체로초기화 strtype b = a.fct(); b.show(); 위프로그램은런 - 타임에러를발생한다. 이유는? 런 - 타임에러가발생하지않도록수정하라. 19/50 사용자정의복사생성자함수 fct 함수내에서의객체 temp 와 main 함수에서의객체 b 의메모리구조 20/50 10

사용자정의복사생성자함수 fct 함수내에서의 temp 객체와 main 함수에서의 b 객체메모리구조 21/50 연습문제 5-1 다음프로그램은 Book이라는클래스를나름대로설계하여그사용예를프로그램한것이다. 이것을실행하면실행에러가나타난다. 그이유를설명하고실행에러를수정하기위해코드를추가하라. --------------------------------------------------------- class Book char *title; Book(char*); ~Book() delete title; void showtitle(void); ; Book::Book(char *string = NULL) title = new char[strlen(string)+1]; // 메모리동적할당 strcpy(title, string); void Book::showtitle(void) cout << title << endl; void main(void) Book Book1("A C++ Programming"); Book Book2 = Book1; Book1.showtitle(); Book2.showtitle(); --------------------------------------------------------- 22/50 11

연습문제 5-2 다음프로그램에서잘못된부분을찾아서그이유를설명하고, 올바르게수정하라. ------------------------------------- // 이프로그램은에러를포함한다. #include <cstdlib> class myclass int *p; myclass(int i); ~myclass() delete p; int getval(myclass o); ; int myclass::getval(myclass o) return *o.p; // 값을얻는다. myclass a(1), b(2); myclass::myclass(int i) p = new int; if (!p) cout << "Allocation error n"; exit(1); *p = i; cout << a.getval(a) << " " << a.getval(b) << endl; cout << b.getval(a) << " " << b.getval(b) << endl; 23/50 연습문제 5-3 연습문제 5-2 에서함수매개변수로객체가아닌객체레퍼런스로전달할경우복사생성자함수가호출되는가? 그리고함수에객체레퍼런스로전달된그함수가종료될때그객체의소멸자함수는호출되는가? 직접실행해보고메모리구조를이용하여실행결과에대하여자세하게설명하라. ------------------------------------------------- int myclass::getval(myclass &o) return *o.p; // 값을얻는다. ------------------------------------ 24/50 12

5.2 객체포인터와객체배열 클래스의객체도객체포인터를선언하고포인터를통해해당객체의멤버를액세스가능 -> 연산자사용 class myclass int a; myclass(int x); // 생성자 int get (); ; myclass::myclass(int x) a = x; int myclass::get() return a; myclass ob(120); // 객체를생성한다. myclass *p; // 객체포인터를생성한다. p = &ob; // ob 의주소를 p 에저장한다. cout << "Value using object: " << ob.get(); cout << " n"; cout << "Value using pointer: " << p->get(); 25/50 5.2 객체포인터와객체배열 객체포인터의의미 26/50 13

[2] 동적할당객체 1: 2: 3: 4: class Date 5: 6: int Year, Month, Day; 7: 8: Date(int yy=1, int mm=1, int dd=1); 9: void SetDate(int yy, int mn, int dd); 10: void Display(); 11: ; 12: 13: Date::Date(int yy, int mm, int dd) 14: 15: Year = yy; 16: Month = mm; 17: Day = dd; 18: 19: 20: 21: void Date::SetDate(int yy, int mm, int dd) 22: 23: Year = yy; 24: Month = mm; 25: Day = dd; 26: 28: void Date::Display() 29: 30: cout << Year << '.' << Month << '.' << Day << endl; 31: 32: 33: void main() 34: 35: // 객체포인터와동적할당객체선언 36: Date *Today = new Date(2005, 9, 22); 37: Date *Tomorrow = new Date(2005, 9, 23); 38: 39: Today->Display(); 40: Tomorrow->Display(); 41: 42: delete Today; 43: delete Tomorrow; 44: 실행결과 2005.9.22 2005.9.23 동적할당객체는프로그램의실행도중만들어지며힙영역에저장 동적할당객체를사용하면실행프로그램의크기를줄일수있다. 27/50 [3] 객체배열 /* PointArr1.cpp */ #include<iostream> class Point int x; int y; Point() cout<<"void 생성자호출!"<<endl; x=y=0; Point(int _x, int _y) x=_x; y=_y; int GetX() return x; int GetY() return y; void SetX(int _x) x=_x; void SetY(int _y) y=_y; ; Point arr[3]; for(int i=0; i<3; i++) arr[i].setx(i*2); arr[i].sety(i*3); for(int j=0; j<3; j++) cout<<"x: "<<arr[j].getx()<<' '; cout<<"y: "<<arr[j].gety()<<endl; 실행결과는다음과같다. void 생성자호출! void 생성자호출! void 생성자호출! x: 0 y: 0 x: 2 y: 3 x: 4 y: 6 28/50 14

[3] 객체배열 객체배열은배열안에객체가존재한다. 객체배열생성과정에서도생성자의호출을요구한다. 객체배열 29/50 [3] 객체배열 배열초기화 class Date int Year, Month, Day; Date(int yy=1, int mm=1, int dd=1); void SetDate(int yy, int mn, int dd); void Display(); ; Date::Date(int yy, int mm, int dd) Year = yy; Month = mm; Day = dd; void Date::SetDate(int yy, int mm, int dd) Year = yy; Month = mm; Day = dd; void Date::Display() cout << Year << '.' << Month << '.' << Day << endl; void main() Date d[7] = 2000, Date(2001), Date(2002,2), Date(2002, 12, 25), Date(2003, 4, 18); int i; for(i=0 ;i<7; i++) cout << i << " : "; d[i].display(); cout << endl; delete [] d; 실행결과는다음과같다. --------------------------------------- 0: 2000.1.1 1: 2001.1.1 2: 2002.2.1 3: 2002.12.25 4: 2003.4.18 5: 1.1.1 6: 1.1.1 --------------------------------------- 30/50 15

동적객체배열 void main() Date *d = new Date[10]; // 동적객체배열의선언... d[0] Year Month Day Date *d = new Date[10]; d[1] d[2] d[9] Year Month Day Year Month Day. Year Month Day 동적객체배열 d 의메모리할당형태 31/50 2 차원객체배열 // 2 차원객체배열을생성한다. class samp int a; samp(int n) a = n; int get_a() return a: ; samp ob[4][2] = 1, 2, 3, 4, 5, 6, 7, 8 ; int i; 위프로그램의출력결과는다음과같다. -------------------------------- 1 2 3 4 5 6 7 8 --------------------------------- for(i = 0; i < 4; i++) cout << ob[i][0].get_a() << ' '; cout << ob[i][1].get_a() << endl; cout << endl; 32/50 16

연습문제 5-4 Date 클래스에서다음과같은세문장의의미를설명하세요. 특히, 가와나의차이점은무엇인가? 가. Date *d = new Date[10]; 나. Date d[10]; 다. Date d(10); 33/50 연습문제 5-5 다음과같은클래스선언을사용하여, 10 개의원소를갖는배열을생성하고멤버변수 ch 를 A 부터 J 까지의값으로초기화하라. 그리고실제로배열이이값들을가지고있는지보여라. --------------------------------------------------------- class letters char ch; letters(char c) ch = c; char get_ch() return ch; ; --------------------------------------------------------- 34/50 17

연습문제 5-6 다음과같은클래스선언을사용하여 10개의원소를갖는배열을생성하고 num을 1부터 10까지의값으로, sqr를 num의제곱으로초기화하라. ------------------------------------------------------ class squares int num, sqr; squres(int a, int b) num = a; sqr = b; void show() cout << num << ' ' << sqr << " n"; ; ------------------------------------------------------ 35/50 5.3 This 포인터 this는멤버함수가호출될때멤버함수에자동으로전달되는포인터로, 호출한객체를가리키는포인터 ob.f1(); //ob는객체이다. 위문장의함수 f1( ) 은호출한객체인 ob에대한포인터를자동으로전달받는다. 이포인터가 this이다. 멤버함수에게만 this 포인터가전달된다는사실을아는것이중요하다. 36/50 18

5.3 This 포인터 class Person Person* GetThis() return this; //this 포인터를리턴. ; Person *p1 = new Person(); cout<<" 포인터 p1 이가리키는주소 : "<<p1<<endl; cout<<"p1 의 this 가가리키는주소 : "<<p1-> GetThis()<< endl << endl; Person *p2 = new Person(); 위의예제프로그램에대한실행결과는다음과같다. -------------------------------------- 포인터 p1 이가리키는주소 : 00480030 p1 의 this 가가리키는주소 : 00480030 포인터 p2 가가리키는주소 : 00481DB0 p2 의 this 가가리키는주소 : 00481DB0 -------------------------------------- cout<<" 포인터 p2 가가리키는주소 : "<<p2<<endl; cout<<"p2 의 this 가가리키는주소 : "<<p2-> GetThis()<<endl; 37/50 5.3 This 포인터 this p1 객체멤버함수내에서 Person p1 객체 this p2 객체멤버함수내에서 Person p2 객체 [ 그림 5-11] This 포인터의의미 38/50 19

This 포인터의용도 실행결과는다음과같다. class Data int a; int b; public : Data(int a, int b) //a=a; this->a=a; //b=b; this->b=b; void printall() cout<< a: " << a<<" b: "<<b<<endl; ; --------------------------------- a: 10 b: 20 ----------------------------------- 생각해야할변수의이름이하나줄어들기때문이다. 주석처리부분을이용해서실행해보자? 어떻게되는가? int main(void) Data d(10, 20); d.printall(); 39/50 연습문제 5-7 다음프로그램의클래스멤버에대한참조를명시적으로 this 포인터를사용한참조로바꾸어라. class myclass int a, b; myclass(int n, int m) a = n; b = m; int add() return a+b; void show(); ; void myclass::show() int t; t = add(); // 멤버함수를호출한다. cout << t << " n"; myclass ob(10, 14); ob.show(); 40/50 20

5.4 friend 키워드 friend 함수 클래스의실제멤버함수가아닌함수를이용하여클래스의 private 멤버에접근해야할필요가있다. 이를해결하기위해서 C++ 는 friend 함수를지원 friend는클래스의멤버가아니면서도클래스의 private 원소에접근할수있다. friend 함수가유용한두가지이유는 연산자오버로딩과특정한유형의입출력함수의생성에서사용되기때문 friend 함수를사용하는또다른이유는하나의함수가두개이상의서로다른클래스들의 private 멤버에액세스하도록하는것 friend 함수는멤버함수가아닌일반함수로정의 41/50 5.4 Friend 함수 // friend 함수의예 #include<iostream> class myclass int n, d; myclass(int i, int j) n = i; d = j; // myclass 의 friend 를선언한다. friend int isfactor(myclass ob); ; /* 다음은 friend 함수의정의. 이것은 d 가 n 의인수이면참을반환한다. 키워드 friend 가 isfactor() 의정의에서는사용되지않는다는점에유의하세요. */ int isfactor(myclass ob) if (!(ob.n % ob.d)) return 1; else myclass ob1(10, 2), ob2(13, 3); if (isfactor(ob1)) cout << "2 is a factor of 10 n"; else cout << "2 is not a factor of 10 n"; if (isfactor(ob2)) cout << "3 is a factor of 13 n"; else cout << "3 is not a factor of 13 n"; 42/50 21

Friend 함수 isfactor() 가 myclass의 friend이므로 isfactor() 는클래스의 private 부분에접근할수있다. friend 함수는 friend로사용되는클래스의멤버가아니라는것을이해하는것이매우중요 ob1.isfactor(); // 잘못된사용이다. isfactor는멤버함수가아니다. 대신 friend 함수는일반함수처럼호출 비록 friend 함수가 friend로사용되는클래스의 private 요소들에대하여알고있지만, 클래스의객체를통해서만요소들에접근할수있다. 43/50 두개의서로다른클래스형이서로비교할필요가있는공통성을지닐때 friend 함수가유용하게사용된다. car 라는클래스와 truck 이라는클래스는각각의클래스가나타내는차종의속도를나타내는 private 변수를포함하고있다. class truck; // 전방선언 (forward declaration) class car int passengers; int speed; car(int p, int s) passengers = p; speed = s; friend int sp_greater(car c, truck t); ; /* car 가 truck 보다빠르면양수를반환한다. 속도가같으면 0 을반환한다. truck 이 car 보다빠르면음수를반환한다. */ int sp_greater(car c, truck t) return c.speed - t.speed; int t; car c1(6, 55), c2(2, 120); truck t1(10000, 55), t2(20000, 72); cout << "Compare c1 and t1: n"; t = sp_greater(c1, t1); if (t < 0) cout << "Truck is faster. n"; else if(t == 0) cout << "Car and truck speed is the same. n"; else cout << "Car is faster. n"; class truck int weight; int speed; truck(int w, int s) weight = w; speed = s; friend int sp_greater(car c, truck t); ; cout << "Compare c2 and t2: n"; t = sp_greater(c2, t2); if (t < 0) cout << "Truck is faster. n"; else if(t == 0) cout << "Car and truck speed is the same. n"; else cout << "Car is faster. n"; 44/50 22

Friend 함수 하나의함수는둘이상의클래스의 friend가될수있다. 전방선언 (forward declaration 또는 forward reference ) 클래스선언은실제로되지않았지만클래스이름을컴파일러에게알려주는방법 45/50 하나의함수는한클래스의멤버이면서다른클래스의 friend 가될수도있다. #include<iostream> class truck; // 전방선언 class car int passengers; int speed; car(int p, int s) passengers = p; speed = s; int sp_greater(truck t); ; class truck int weight; int speed; truck(int w, int s) weight = w, speed = s; // 영역연산자 (::) 를새로사용 friend int car::sp_greater(truck t); ; /* car 가 truck 보다빠르면양수를반환한다. 속도가같으면 0 을반환한다. truck 이 car 보다빠르면음수를반환한다. */ int car::sp_greater(truck t) /* sp_greater() 는 car 의멤버이므로 truck 객체만전달되어야한다. */ return speed - t.speed; int t; car c1(6, 55), c2(2, 120); truck t1(10000, 55), t2(20000, 72); cout << "Compare c1 and t1: n"; t = c1.sp_greater(t1); // car 의멤버함수로서호출 if(t<0) cout << "Truck is faster. n"; else if (t == 0) cout << "Car and truck speed is the same. n"; else cout << "Car is faster. n"; cout << " n Compare c2 and t2: n"; t = c2.sp_greater(t2); // car 의멤버함수로서호출 if(t<0) cout << "Truck is faster. n"; else if(t==0) cout << "Car and truck speed is the same. n"; else cout << "Car is faster. n"; 46/50 23

클래스에대한 friend 선언 class A int data; friend class B; // class B를 friend로선언함! void ShowData() cout << data: << data << endl; ; class B void SetData(A &a, int val) a.data=val; //class A 의 private 영역접근! ; 클래스간 friend 선언의의미 A a; B b; b.setdata(a, 10); a.showdata(); 47/50 연습문제 5-8 다음과같이 pr1 과 pr2 라는두클래스가하나의프린터를공유하는상황에대해생각해보자. 또한, 프로그램의어느부분에서어떤클래스의객체가프린터를사용중인지알고자한다고하자. inuse() 라는함수를생성하여프린터가사용중이면 true 를, 그렇지않으면 false 를반환하도록하라. 이함수를 pr1 과 pr2 모두의 friend 가되도록하라. -------------------------------------------- class pr1 int printing; //... pr1() printing = 0; void set_print(int status) printing = status; //... ; class pr2 int printing; //... pr2() printing = 0; void set_print(int status) printing = status; //... ; -------------------------------------------------- 48/50 24

실습문제 3 장의실습문제에서 C 언어로작성한 은행계좌관리프로그램 -version 1.0 을 4 장과 5 장에서배운 C++ 문법특히클래스개념을적용한 " 은행계좌관리프로그램 - version 2.0 을작성해보자. 은행계좌관리프로그램의 v1.0 에서정의한구조체 Account 를클래스 Account 로변경해보자. 단순히키워드 struct 를 class 로변경하라는뜻이아니고, OOP 개념을충실히적용하여 Account 클래스를정의해보자. v2.0 에서구현하여야하는내용을정리하면다음과같다. [1] v1.0 의 Account 구조체는배열을이용하여고객의이름을저장하는형태로구현하였는데, v2.0 의 Account 클래스에서는이를생성자내에서동적할당하는형태로구현하자. 즉, Account 클래스는멤버변수로문자열포인터 (char *) 를지니고있다. [2] v1.0 에서는구조체포인터배열을선언하고이것을이용해서고객정보를저장하였다. ( 예, struct Account parry[100]; // 100 명의고객에대한구조체배열변수 Account 선언 ) v2.0 에서는객체저장을위한포인터배열을선언해서객체를저장하자. 계좌의수는기본적으로 10 개의계좌를생성하고, 이후 10 개가넘어면 5 개씩추가하여계좌를계속해서늘려갈수있는구조로프로그램을설계하자. [3] 생성자함수와소멸자함수를반드시정의하여객체초기화와동적으로할당된메모리를소멸자함수에서해제하자. [4] 생성자와소멸자에서동적할당및소멸이이루어지므로복사생성자함수정의가필요한부분이다. 복사생성자함수를정의하자. 49/50 질문 & 답변 Thank You! 수고하셨습니다. 50/50 25