• 검색 결과가 없습니다.

이 장에서 다룰 내용 객체의 치환 1 함수와 클래스의 상관관계 2

N/A
N/A
Protected

Academic year: 2021

Share "이 장에서 다룰 내용 객체의 치환 1 함수와 클래스의 상관관계 2"

Copied!
22
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)

클 래 스 의 클 래 스 의 클 래 스 의 클 래 스 의 응 용 응 용 응 용 응 용

클래스를자유자재로사용하자.

(2)

이 장에서 다룰 내용 객체의 치환 1 함수와 클래스의 상관관계 2

(3)

01_ 객체의 치환 

객체도변수와마찬가지로치환이가능하다. 기본예제[7-1] 객체도일반변수와마찬가지로대입이가능하다. 기본예제[7-2] 객체의치환시에는조심해야점이있다. 복사생성자의필요성에대하여알아보자.

(4)

[기본예제 7- 1] 클래스의 치환 0 1 # in c lu d e < io s tr e a m > 0 2 u s in g n a m e s p a c e s td ; 0 3 c la s s U n it { 0 4 in t x, y; 0 5 p u b lic : 0 6 vo id s e t( in t i, i n t j) { x = i; y = j; } 0 7 vo id s h o w () { c o u t < < x < < " , " < < y < < " \ n "; } 0 8 };

UnitUnitUnitUnit 클래스를클래스를클래스를클래스를정의한다정의한다정의한다정의한다....

0 9 1 0 in t m a in (i n t a rg c , c h a r* a rg v[ ]) 1 1 { 1 2 U n it A , B ; 1 3 A .s e t( 1 2 ,4 ); 1 4 B = A ; 1 5 A .s h o w () ; 1 6 B .s h o w () ; 1 7 re tu rn 0 ; 1 8 }

AAAA를를를를BBBB에에에에치환한다치환한다치환한다치환한다....

(5)

[기본예제 7- 2] 클래스의 치환 # 2

01#include<iostream> 02#include<cstring> 03using namespace std; 04class Unit { 05char* str; 06public: 07Unit() 08{ 09str= NULL; 10} 11 12Unit(char* agStr) 13{ 14intstrLength= strlen(agStr); 15str= new char[strLength+ 1]; 16strcpy(str, agStr);16strcpy(str, agStr); 17} 18 19void set(char* agStr) 20{ 21strcpy(str, agStr); 22} 23 24void show() 25{ 26cout<< str<< "\n"; 27} 28}; 29 30intmain(intargc, char* argv[]) 31{ 32Unit A("TEST1"); 33Unit B = A; 34 35A.set("TEST2"); 36 37A.show(); 38B.show(); 39return 0; 40 } Test1Test1Test1Test1의의의의값을값을값을값을갖는갖는갖는갖는AAAA를를를를생성한다생성한다생성한다생성한다.... BBBB에에에에AAAA를를를를복사한다복사한다복사한다복사한다.... AAAA의의의의내용을내용을내용을내용을Test1Test1Test1Test1BBBB로로로로바꾼다바꾼다바꾼다바꾼다....

(6)

01_ 객체의 치환  복사생성자 

기본예제[7-2]에서일어난이상한현상의이유를알려면, 복사생성자에대해서알아야한다.



B를생성하는데에는기본생성자가아닌복사생성자가사용된 것이다.



기본생성자들이호출되는상황을파악하기위해서기본예제[7- 2]를약간수정한기본예제[7-3]을실행해보자.



기본예제[7-4]에서복사생성자를추가하여실행해보자.

(7)

[기본예제 7- 3] 클래스의 치환 # 3

 07Unit() 08{ 09090909cout << "I'm a default constructorcout << "I'm a default constructorcout << "I'm a default constructorcout << "I'm a default constructor\\\\n";n";n";n"; 10str = NULL; 11} 12 13Unit(char* agStr) 14{ 15151515cout << "I'm a default constructor with parameterscout << "I'm a default constructor with parameterscout << "I'm a default constructor with parameterscout << "I'm a default constructor with parameters\\\\n";n";n";n"; 16int strLength = strlen(agStr); 17str = new char[strLength + 1]; 18strcpy(str, agStr);

기본기본기본기본생성자가생성자가생성자가생성자가실행된실행된실행된실행된것을것을것을것을화면에화면에화면에화면에표시한다표시한다표시한다표시한다.... 입력입력입력입력인자를인자를인자를인자를받은받은받은받은경우에경우에경우에경우에대한대한대한대한생성자가생성자가생성자가생성자가 실행된실행된실행된실행된것을것을것을것을화면에화면에화면에화면에표시한다표시한다표시한다표시한다.... 18strcpy(str, agStr); 19}  32int main(int argc, char* argv[]) 33{ 34Unit A("TEST1"); 35Unit B = A; 36 37373737cout << "cout << "cout << "cout << "----------------------------------------------------------------------------------------------------------------------------------------\\\\n";n";n";n"; 38A.set("TEST2"); 39 40A.show(); 41B.show(); 42 43return 0; 44}

Separator Separator Separator Separator 표시표시표시표시....

(8)

[기본예제7-4] 클래스의치환#4 –복사생성자추가  07Unit() 08{ 09cout << "I'm a default constructor\n"; 10str = NULL; 11} 12 13Unit(char* agStr) 14{ 15cout << "I'm a default constructor with parameters\n"; 16int strLength = strlen(agStr);16int strLength = strlen(agStr); 17str = new char[strLength + 1]; 18strcpy(str, agStr); 19} 20202020Unit(Unit& agUnit)Unit(Unit& agUnit)Unit(Unit& agUnit)Unit(Unit& agUnit) 21212121{{{{ 22222222cout <<cout <<cout <<cout <<"I'm a copy constructor"I'm a copy constructor"I'm a copy constructor"I'm a copy constructor\\\\n";n";n";n"; 23232323str = agUnit.str;str = agUnit.str;str = agUnit.str;str = agUnit.str; 24242424}}}} 

복사복사복사복사생성자가생성자가생성자가생성자가실행된실행된실행된실행된것을것을것을것을 화면에화면에화면에화면에표시한다표시한다표시한다표시한다....

(9)

01_ 객체의 치환  얕은 복사와 깊은 복사 

얕은복사란, 우리가앞에서본예제들과같이B 객체를 생성하면서, 이미A가만들어놓은메모리의주소만을 참조하도록복사하는것을의미한다.



깊은복사란, 얕은복사와는달리객체들간의간섭이일어나지 않는아래와같은형태를의미한다.

(10)

[기본예제7-5] 깊은복사–7-4에서복사생성자만을수정.

 0 7 U n it () 0 8 { 0 9 c o u t < < " I' m a d e fa u lt c o n s tr u c to r\ n "; 1 0 s tr = N U L L ; 1 1 } 1 2 1 3 U n it (U n it & a g U n it ) 1 4 { 1 5 c o u t < < "I 'm a c o p y c o n s tr u c to r\ n "; 1 6 1 6 1 6 1 6 s tr = n e w c h a r[ s tr le n (a g U n it .s tr ) + 1 ]; s tr = n e w c h a r[ s tr le n (a g U n it .s tr ) + 1 ]; s tr = n e w c h a r[ s tr le n (a g U n it .s tr ) + 1 ]; s tr = n e w c h a r[ s tr le n (a g U n it .s tr ) + 1 ]; 1 7 1 7 1 7 1 7 s tr c p y( s tr , a g U n it .s tr ); s tr c p y( s tr , a g U n it .s tr ); s tr c p y( s tr , a g U n it .s tr ); s tr c p y( s tr , a g U n it .s tr ); 1 8 }



깊은깊은깊은깊은복사를복사를복사를복사를하기하기하기하기위해서위해서위해서위해서메모리를메모리를메모리를메모리를새로새로새로새로할당한다할당한다할당한다할당한다.... 문자열을문자열을문자열을문자열을복사한다복사한다복사한다복사한다....

(11)

02_ 함수와 클래스의 상관관계  함수의 입력인자로 전달하는 클래스 객체 

클래스객체를함수에전달하려면?

....

즉즉즉즉, , , , ,,,,

즉즉즉즉, , , , ,,,, 때때때때그그그그....

(12)

[기본예제 7- 7] 입력인자로 전달하는 클래스 객체 0 1 # in c lu d e < io s tr e a m > u s in g n a m e s p a c e s td ; 0 2 c la s s U n it { 0 3 in t d e fa u lt A rm o r; 0 4 p u b lic : 0 5 U n it (i n t a rm o r) { d e fa u lt A rm o r = a rm o r; } 0 6 in t G e tD e fa u lt A rm o r( ) { re tu rn d e fa u lt A rm o r; } 0 7 }; 0 8

클래스가클래스가클래스가클래스가입력인자인입력인자인입력인자인입력인자인함수를함수를함수를함수를정의한다정의한다정의한다정의한다....

0 9 in t G e tE n h a n c e d A rm o r( U n it a U n it ) 1 0 { 1 1 re tu rn a U n it .G e tD e fa u lt A rm o r( ) * 2 ; 1 2 } 1 3 1 4 in t m a in (i n t a rg c , c h a r* a rg v[ ]) 1 5 { 1 6 U n it A (1 ), B (2 ); 1 7 c o u t < < " U n it A : " < < G e tE n h a n c e d A rm o r( A ) < < " \ n "; 1 8 c o u t < < " U n it B : " < < G e tE n h a n c e d A rm o r( B ) < < " \ n "; 1 9 re tu rn 0 ; 2 0 }

AAAA와와와와BBBB 클래스클래스클래스클래스객체를객체를객체를객체를입력인자로입력인자로입력인자로입력인자로 함수를함수를함수를함수를수행한다수행한다수행한다수행한다....

(13)

02_ 함수와 클래스의 상관관계  함수로부터 반환되는 클래스 객체 

함수에게객체를입력인자로전달할수있는것과마찬가지로, 함수도클래스객체를반환할수있다.



객체를반환하기위해서는미리선언한후, 정상적인return 문을사용하여반환하면된다.

0 2 _ 함수와 클래스의 상관관계

문을사용하여반환하면된다.

0 2 _ 함수와 클래스의 상관관계

(14)

[기본예제 7- 8] 반환되는 클래스 객체

01#include <iostream> 02using namespace std; 03class Unit { 04intdefaultArmor; 05public: 06void Show() { cout<< "defaultArmor: " << defaultArmor<< "\n"; } 07void Set(intarmor) { defaultArmor= armor; } 08}; 09 10Unit GetUnit() 11{ 12intarmor;12intarmor; 13Unit temp; 14cout<< "Enter a default armor : "; 15cin>> armor; 16temp.Set(armor); 17return temp; 18} 19 20intmain(intargc, char* argv[]) 21{ 22Unit a; 23a = GetUnit(); 24a.Show(); 25return 0; 26}

클래스가클래스가클래스가클래스가객체를객체를객체를객체를결과값으로결과값으로결과값으로결과값으로반환한다반환한다반환한다반환한다.... 함수의함수의함수의함수의결과로결과로결과로결과로클래스클래스클래스클래스객체를객체를객체를객체를 받아서받아서받아서받아서저장한다저장한다저장한다저장한다....

(15)

02_ 함수와 클래스의 상관관계  F rien d 함수 

클래스의멤버가아니면서도, 클래스의비공개원소에접근할수 있게해주는함수이다.



하나의함수가두개이상의서로다른클래스들의비공개 멤버에접근할수도있다.

0 2 _ 함수와 클래스의 상관관계

멤버에접근할수도있다.



Friend 함수는멤버함수가아닌일반함수로정의되며, 함수명 앞에friend라는키워드를붙여서선언한다.

0 2 _ 함수와 클래스의 상관관계

(16)

[기본예제7-9] friend 함수를이용한비공개멤버로의접근 01#include <iostream> using namespace std; 02class Unit { 03intx,y; 04public: 05Unit(inti, intj) { x=i; y=j; } 06friend boolisSame(Unit a); 07}; 08 09boolisSame(Unit a) 10{

FriendFriendFriendFriend 함수를함수를함수를함수를정의한다정의한다정의한다정의한다.... FriendFriendFriendFriend 함수의함수의함수의함수의몸체를몸체를몸체를몸체를구현한다구현한다구현한다구현한다.... 10{ 11if (a.x== a.y) return true; 12else return false; 13} 14 15intmain(intargc, char* argv[]) 16{ 17Unit a(1,2), b(3,3); 18 19cout<< "a(1,2) : " << isSame(a) << "\n"; 20cout<< "b(3,3) : " << isSame(b) << "\n"; 21return 0; 22}

FriendFriendFriendFriend 함수를함수를함수를함수를호출한다호출한다호출한다호출한다....

(17)

예제모음 _12 의 요구사항 및 실행결과

요구사항요구사항요구사항요구사항

① 다음과 같은 사각형 클래스가 있다 .

class Square{ public: int height,width; void addSquare(); };

사각형 클래스 객체를 입력으로 받아서 , 자신과 입력 받은 사각형의 넓이의 합을 화면에 출력하도록 함수 a d d S q u a re 를 수정하라 . ② a d d S q u a re 를 수정한 후, 적당한 생성자를 만들어서 5 x 3 , 4 x 4 인 두 객체에 대해 함수가 정상적으로 작동하는지 화면에 출력해본다 .

실행결과실행결과실행결과실행결과

(18)

예제모음 _12 소스

01#include <iostream> 02using namespace std; 03class Square { 04public: 05intheight,width; 06Square(intx, inty) 07{ 08height = x; 09width = y; 10} 11void addSquare(Square A)

생성자를생성자를생성자를생성자를 구현한다구현한다구현한다구현한다.... 11void addSquare(Square A) 12{ 13intarea_A= A.height* A.width; 14intarea = height * width; 15cout<< "두사각형넓이의합은: " << area_A+ area << "\n"; 16} 17}; 18 19 20intmain(intargc, char* argv[]) 21{ 22Square A(5,3), B(4,4); 23A.addSquare(B); 24return 0; 25}

클래스를클래스를클래스를클래스를입력인자로입력인자로입력인자로입력인자로 갖는갖는갖는갖는멤버함수를멤버함수를멤버함수를멤버함수를 정의하여정의하여정의하여정의하여넓이를넓이를넓이를넓이를 계산한다계산한다계산한다계산한다....

(19)

예제모음 _13 의 요구사항 및 실행결과

요구사항요구사항요구사항요구사항

① 다음과 같은 사각형 클래스가 있다 .

class Square{ int height,width; public: void addSquare(); };

사각형 클래스 객체를 입력으로 받아서 , 자신과 입력 받은 사각형의 넓이의 합을 화면에 출력하도록 함수 a d d S q u a re 를 수정하라 . ② 클래스의 멤버변수인 h e ig h t, w id th 는 p ri v a te 로 고정하고 , 프렌드 함수를 사용하도록 한다 . 사용하도록 한다 . ③ a d d S q u a re 를 수정한 후, 적당한 생성자를 만들어서 5 x 3 , 4 x 4 인 두 객체에 대해 함수가 정상적으로 작동하는지 화면에 출력해 보도록 한다 .

실행결과실행결과실행결과실행결과

(20)

예제모음 _13 소스

01#include <iostream> 02using namespace std; 03class Square { 04intheight,width; 05public: 06Square(intx, inty) 07{ 08height = x; 09width = y; 10} 11friend void addSquare(Square A, Square B)11friend void addSquare(Square A, Square B) 12{ 13intarea_A= A.height* A.width; 14intarea_B= B.height* B.width; 15cout<< "두사각형넓이의합은: " << area_A+ area_B<< "\n"; 16} 17}; 18 19 20intmain(intargc, char* argv[]) 21{ 22Square A(5,3), B(4,4); 23addSquare(A, B); 24return 0; 25}

FriendFriendFriendFriend함수를함수를함수를함수를정의하여정의하여정의하여정의하여 입력입력입력입력받은받은받은받은두두두두객체의객체의객체의객체의 넓이의넓이의넓이의넓이의합을합을합을합을구한다구한다구한다구한다....

(21)

요약

클래스클래스객체의객체의치환치환클래스객체도일반변수와동일하게치환이가능하다. 그러나 클래스안에서포인터를다룰경우에는조심스럽게치환해야한다. 얕은얕은복사와복사와 깊은깊은복사복사

메모리의주소만을참조하여주소만복사하는것을‘얕은복사(shallow copy)’라고하며, 원본값까지복사하는것을‘깊은복사(deep copy)’라고한다. 얕은복사로인해동작에문제가일어나는경우에는깊은복사를사용해야 한다. 함수와함수와클래스의클래스의 상관관계상관관계 FriendFriend 함수함수Friend 함수란클래스의멤버가아니면서해당클래스의비공개원소에 접근할수있는함수를뜻한다. 주로이미작성된클래스의멤버들을크게 수정하지않고접근해야할필요성이있을때사용된다.

함수의입력인자로써다른기본변수형들을함수에전달하는것과같은 방법으로클래스객체를함수에전달할수있으며, 함수의출력인자로써도동일한방법으로클래스객체를반환할수있다.

[얕은복사의예][깊은복사의예]

(22)

www.themegallery.com IT CookBook for Beginner, C++IT CookBook for Beginner, C++IT CookBook for Beginner, C++IT CookBook for Beginner, C++7777장장장장끝끝끝끝

참조

관련 문서

약국은 당초 수집 목적과 합리적으로 관련된 범위에서 정보주체에게 불이익이 발생하는지 여부, 암호화 등 안전성 확보에 필요한 조치를 하였는지 여부 등을

(Taekwondo, Weight Lifting Players) (90 min × 6 days/week) Warming

[r]

자료형태 &lt;physicalDescription&gt;&lt;form&gt; 필수 디지털 품질 &lt;physicalDescription&gt;&lt;reformattingQuality&gt; 필수

This expression is used when the content of the following clause is a condition or method to achieve the situation of the first clause.. 갈비가 타지 않게끔

[r]

-난자의 세포막 표면에 접착된 정자는 미부의 운동이 정지되고, 정자두부의 적도 부(equatorial region)와 후모부(post cap region)가 난자의 세포막과 융합하여

 평균 이상의 학생 수와 평균 이하의 학생수를 얻 어내어 출력한다..  학생들의