๐ฉ ์ฐ์ฐ์ ์ค๋ฒ๋ก๋ฉ
ํจ์ ์ค๋ฒ๋ก๋ฉ, ์์ฑ์ ์ค๋ฒ๋ก๋ฉ์ ํจ์๋ช , ์์ฑ์๋ช ์ด ๊ฐ์ผ๋ ๋งค๊ฐ๋ณ์์ ์๋ฃํ์ด๋ ์๊ฐ ๋ค๋ฅธ ํจ์์ด๋ค. ์ฐ์ฐ์ ์ค๋ฒ๋ก๋ฉ์ ๊ฒฝ์ฐ ๋ค๋ฅธ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ฉด์ ์ฐ์ฐ์๋ฅผ ์ถ๊ฐํ ์ ์์๊น?
#include <iostream>
using namespace std;
class NUMBOX
{
private:
int num1, num2;
public:
NUMBOX(int num1, int num2) : num1(num1), num2(num2) { }
void ShowNumber()
{
cout << "num1: " << num1 << ", num2: " << num2 << endl;
}
};
int main()
{
NUMBOX nb1(10, 20);
NUMBOX nb2(5, 2);
NUMBOX result = nb1 + nb2; // ์ฌ๊ธฐ๋ฅผ ํ์ธ
nb1.ShowNumber();
nb2.ShowNumber();
}
๐ท๏ธ ์๋ฌ
1 IntelliSense: ์ด๋ฌํ ํผ์ฐ์ฐ์์ ์ผ์นํ๋ "+" ์ฐ์ฐ์๊ฐ ์์ต๋๋ค.
ํผ์ฐ์ฐ์ ํ์์ด NUMBOX + NUMBOX์ ๋๋ค. c:\Users\h4ckfory0u\Documents\Visual Studio 2012\Projects\ConsoleApplication4\ConsoleApplication4\์์ค.cpp 21 22 ConsoleApplication4
nb1๊ณผ nb2๋ฅผ ๋ํ ๊ฐ์ result๋ก ๋์ ํ๊ณ ์๋๋ฐ, ์๋ฌ์ "+" ์ฐ์ฐ์๊ฐ ์๋ค๊ณ ๋์จ๋ค.
์ฐ์ฐ์ ์ค๋ฒ๋ก๋ฉ์ ํ์ฉํ์ฌ ๊ธฐ์กด์ ์๋ + ์ฐ์ฐ์๊ฐ ์๋, NUMBOX ๊ฐ์ฒด ๋ผ๋ฆฌ์ ๋ง์ ์ด ๊ฐ๋ฅํ ์ฐ์ฐ์๋ฅผ ์ถ๊ฐํด๋ณด์.
#include <iostream>
using namespace std;
class NUMBOX
{
private:
int num1, num2;
public:
NUMBOX(int num1, int num2) : num1(num1), num2(num2) { }
void ShowNumber()
{
cout << "num1: " << num1 << ", num2: " << num2 << endl;
}
NUMBOX operator+(NUMBOX &ref)
{
return NUMBOX(num1+ref.num1, num2+ref.num2);
}
};
int main()
{
NUMBOX nb1(10, 20);
NUMBOX nb2(5, 2);
NUMBOX result = nb1 + nb2;
nb1.ShowNumber();
nb2.ShowNumber();
result.ShowNumber();
}
num1: 10, num2: 20
num1: 5, num2: 2
num1: 15, num2: 22
๐ operator+ ํจ์
์ ๋ฌ๋ฐ์ ๊ฐ์ฒด์ ์์ ์ ๋ฉค๋ฒ ๋ณ์๋ฅผ ์๋ก ๋ํด NUMBOX ์์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ , ์ด ์์ ๊ฐ์ฒด๊ฐ ๋ฐํ๋๋ค.
์ด๋ ์๋์ ๊ฐ๋ค. nb1 ๊ฐ์ฒด์ operator+ ํจ์๋ก nb2 ๊ฐ์ฒด๋ฅผ ์ธ์๋ก ๋๊ฒจ์ค๋ค. ๊ฒฐ๊ณผ๋ 100% ๋์ผํ๋ค.
NUMBOX result = nb1 + nb2 = nb1.operator+(nb2);
operator+๊ฐ ์๋์ฌ๋ operator<์ฐ์ฐ์>(operator+, operator-, operator* ๋ฑ)์ ๊ฐ์ ํ์์ผ๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค. ๋ชจ๋ ์ฐ์ฐ์๋ค์ด ์ค๋ฒ๋ก๋ฉ ๋์์ด ๋๋ ๊ฒ์ ์๋๋ฉฐ, ๊ธฐ์กด์ ์กด์ฌํ๋ ์ฐ์ฐ์์ ๊ธฐ๋ฅ์์ ์ฝ๊ฐ ๋ ์ถ๊ฐํ๋ ๊ฒ ๋ฟ, ์์ ํ ์๋ก์ด ์ฐ์ฐ์๋ฅผ ๋ง๋๋ ๊ฒ์ ์๋๋ค.
๋ ํผ์ฐ์ฐ์๊ฐ ์๋ฃํ์ด ๋ฌ๋ผ๋ ์์ ๊ฐ์ ์ฐ์ฐ์ด ๊ฐ๋ฅํ๋ค.
#include <iostream>
using namespace std;
class NUMBOX
{
private:
int num1, num2;
public:
NUMBOX(int num1, int num2) : num1(num1), num2(num2) { }
void ShowNumber()
{
cout << "num1: " << num1 << ", num2: " << num2 << endl;
}
NUMBOX operator+(int num)
{
return NUMBOX(num1+num, num2+num);
}
};
int main()
{
NUMBOX nb1(10, 20);
NUMBOX result = nb1 + 10;
nb1.ShowNumber();
result.ShowNumber();
}
num1: 10, num2: 20
num1: 20, num2: 30
๊ณ์ํ๋ ค๋ฉด ์๋ฌด ํค๋ ๋๋ฅด์ญ์์ค . . .
์ฐ์ฐ์ ๋ชธ์ฒด๋ฅผ ๋ณด๋ฉด, ์ธ์๊ฐ ์๋ ์์ฑ์์๊ฒ num1+num, num2+num ๊ฐ์ ๋๊ฒจ์ฃผ์ด ์ด๊ธฐํ๊ฐ ์งํ๋ ๋ค, ์ด ์์ ๊ฐ์ฒด๋ ์๋ฉธํ๋ค. ์ด์ด์, main ํจ์์ result๋ ์ ์ํ๊ณผ NUMBOX ๊ฐ์ฒด๊ฐ์ ๋ง์ ์ด ์ค๋ฅ์์ด ์ ์์ ์ผ๋ก ์ด๋ฃจ์ด์ง์ ์ ์ ์๋ค.
์๋์ ๊ฐ์ ํ์์ ์๋ฌ๋ฅผ ๋ฐ์์ํจ๋ค.
NUMBOX result = 10 + nb1;
๐ท๏ธ ์๋ฌ
1 IntelliSense: ์ด๋ฌํ ํผ์ฐ์ฐ์์ ์ผ์นํ๋ "+" ์ฐ์ฐ์๊ฐ ์์ต๋๋ค.
ํผ์ฐ์ฐ์ ํ์์ด int + NUMBOX์ ๋๋ค. c:\Users\h4ckfory0u\Documents\Visual Studio 2012\Projects\ConsoleApplication4\ConsoleApplication4\์์ค.cpp 24 21 ConsoleApplication4
ํด๋์ค ๋ด์ ๋ฉค๋ฒ ํจ์๋ฅผ ์ ์ํ๊ณ , ์ด ๋ฉค๋ฒ ํจ์๋ฅผ ํตํด์ ์ฐ์ฐ์ ์ค๋ฒ๋ก๋ฉ์ ์ํํ์๋ค. 10+nb1์ 10.operator+(nb1)๊ณผ ๊ฐ์ ํํ๋ก ์ธ์์ด ๋๋ค. 10์ด๋ ์ ์ํ ๋ฐ์ดํฐ์ operator+๋ ๋ฉค๋ฒ ํจ์๋ ์์ ๋ฟ๋๋ฌ, NUMBOX ๊ฐ์ฒด๋ฅผ ๋๊ธฐ๋ ํํ๊ฐ ๋์๋ค. ์ด ๊ฒฝ์ฐ ์ ์ญ ํจ์ ์ค๋ฒ๋ก๋ฉ์ ํตํด ํด๊ฒฐ ๊ฐ๋ฅํ๋ค.
๐ฉ ์ ์ญ ํจ์ ์ค๋ฒ๋ก๋ฉ
๋ฉค๋ฒ ํจ์๋ฅผ ํตํ ์ค๋ฒ๋ก๋ฉ์ "๊ฐ์ฒด.operator+(ํผ์ฐ์ฐ์), ๊ฐ์ฒด + ํผ์ฐ์ฐ์"์์ผ๋ก ์ด๋ฃจ์ด์ ธ, ์๋ฃํ์ด ๋ค๋ฅธ ๋ ํผ์ฐ์ฐ์๋ฅผ ๋์์ผ๋ก ํ๋ ์ฐ์ฐ์, ๋ฐ๋์ ๊ฐ์ฒด๊ฐ ์ผ์ชฝ์ ์์นํด์ผ ์ฐ์ฐ์ด ๊ฐ๋ฅํ ๋ฐ๋ฉด์, ์ ์ญ ํจ์๋ฅผ ํตํ ์ค๋ฒ๋ก๋ฉ์ "operator+(ํผ์ฐ์ฐ์, ํผ์ฐ์ฐ์), ํผ์ฐ์ฐ์+ํผ์ฐ์ฐ์"์ ์์ผ๋ก ๊ฐ์ฒด๊ฐ ๋ค์ ์์นํด๋ ์ ์์ ์ธ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ค.
ํผ์ฐ์ฐ์ + ํผ์ฐ์ฐ์ = operator+(ํผ์ฐ์ฐ์, ํผ์ฐ์ฐ์)
#include <iostream>
using namespace std;
class NUMBOX
{
private:
int num1, num2;
public:
NUMBOX(int num1, int num2) : num1(num1), num2(num2) { }
void ShowNumber()
{
cout << "num1: " << num1 << ", num2: " << num2 << endl;
}
NUMBOX operator+(int num)
{
return NUMBOX(num1+num, num2+num);
}
friend NUMBOX operator+(int num, NUMBOX ref);
};
NUMBOX operator+(int num, NUMBOX ref)
{
ref.num1 += num;
ref.num2 += num;
return ref;
}
int main()
{
NUMBOX nb1(10, 20);
NUMBOX result = 10 + nb1 + 40;
nb1.ShowNumber();
result.ShowNumber();
}
num1: 10, num2: 20
num1: 60, num2: 70
๊ณ์ํ๋ ค๋ฉด ์๋ฌด ํค๋ ๋๋ฅด์ญ์์ค . . .
friend๊ฐ ๋ถ์ ์ด์ ๋, ์ด ํจ์๊ฐ ํด๋์ค์ ๋ฉค๋ฒ ํจ์๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ๋ฉค๋ฒ ๋ฒ์์ ์ ๊ทผํ ์ ์์ผ๋ฏ๋ก ๋ถ์ฌ์ค ๊ฒ์ด๋ค. ์ ์ญํจ์๋ก operator+ ํจ์๊ฐ ์ถ๊ฐ๋ก ์ ์๋์ด ์๋ ๊ฒ์ ํตํ์ฌ operator+(10,nb1)์ผ๋ก ์ธ์๋๋ค. ์ด์ด์ 10๊ณผ nb1์ ๋ํ๊ณ ๊ทธ ๊ฒฐ๊ณผ์์ 40์ ๋ํ์ฌ result์ ๋์ ์์ผ์ค๋ค.
๐ฉ ๋จํญ ์ฐ์ฐ์ ์ค๋ฒ๋ก๋ฉ
์ฆ๊ฐ, ์ฆ๊ฐ ์ฐ์ฐ์ ํ์ธ
#include <iostream>
using namespace std;
class NUMBOX
{
private:
int num1, num2;
public:
NUMBOX() { }
NUMBOX(int num1, int num2) : num1(num1), num2(num2) { }
void ShowNumber()
{
cout << "num1: " << num1 << ", num2: " << num2 << endl;
}
NUMBOX operator++()
{
num1+=1;
num2+=1;
return *this;
}
NUMBOX operator++(int)
{
NUMBOX temp(*this);
num1+=1;
num2+=1;
return temp;
}
};
int main()
{
NUMBOX nb1(10, 20);
NUMBOX nb2;
nb2 = nb1++;
nb2.ShowNumber();
nb1.ShowNumber();
nb2 = ++nb1;
nb2.ShowNumber();
nb1.ShowNumber();
}
num1: 10, num2: 20
num1: 11, num2: 21
num1: 12, num2: 22
num1: 12, num2: 22
๊ณ์ํ๋ ค๋ฉด ์๋ฌด ํค๋ ๋๋ฅด์ญ์์ค . . .
*this๋ฅผ ๋ฐํํ๋ ์ด์ ๋ this๋ ๊ฐ์ฒด์ ์ฃผ์๋ฅผ, *this๋ this ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ์ฒด, ์ค์ง์ ์ธ ๋ฐ์ดํฐ๋ฅผ ์๋ฏธํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฌํ ํ์์ ์ ์ ์ฆ๊ฐ ์ฐ์ฐ์ด๋ค.
์ ์/ํ์ ์ฐ์ฐ์ ๋ํ ๊ตฌ๋ถ
++nb = nb.operator++(); // ์ ์ ์ฆ๊ฐ ์ฐ์ฐ
nb++ = nb.operator++(int); // ํ์ ์ฆ๊ฐ ์ฐ์ฐ
int๋ ๋จ์ง ์ ์, ํ์ ์ฆ๊ฐ ์ฐ์ฐ์ ๊ตฌ๋ถํด์ฃผ๋ ๊ธฐ์ค์ผ ๋ฟ, int ํ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ธ์๋ก ์ ๋ฌํ๋ค๋ ๋ป์ด ์๋๋ค.
๐ฉ ๋์ ์ฐ์ฐ์ ์ค๋ฒ๋ก๋ฉ
#include <iostream>
using namespace std;
class A
{
private:
int num1, num2;
public:
A() { } // ๋ํดํธ ์์ฑ์
A(int num1, int num2) : num1(num1), num2(num2) { }
void ShowData() { cout << num1 << ", " << num2 << endl; }
};
class B
{
private:
int num1, num2;
public:
B() { }
B(int num1, int num2) : num1(num1), num2(num2) { }
void ShowData() { cout << num1 << ", " << num2 << endl; }
};
int main()
{
A a1(10, 50);
A a2;
B b1(10, 20);
B b2;
a2 = a1;
b2 = b1;
a2.ShowData();
b2.ShowData();
return 0;
}
10, 50
10, 20
๊ณ์ํ๋ ค๋ฉด ์๋ฌด ํค๋ ๋๋ฅด์ญ์์ค . . .
main ํจ์์์ a1 ๊ฐ์ฒด๊ฐ ๋ง๋ค์ด์ง๊ณผ ๋์์ ์์ฑ์์๊ฒ 10๊ณผ 50์ ๊ฐ๊ฐ ์ ๋ฌํ๊ณ , ๋ฉค๋ฒ ๋ณ์ num1, num2๋ฅผ ์ด๊ธฐํํ๋ค. a2 ๊ฐ์ฒด๋ ๋ง๋ค์ด์ง๊ณ , ๋ํดํธ ์์ฑ์๊ฐ ํธ์ถ๋๋ค(์ด๊ธฐํ๋์ง ์์). ๋ง์ฐฌ๊ฐ์ง๋ก b1์ ์์ฑ๊ณผ ๋์์ ์ด๊ธฐํ๋๊ณ , b2์ ๊ฒฝ์ฐ ์ด๊ธฐํ๋์ง ์๋๋ค.
์ดํ ๋์ ์ฐ์ฐ์๊ฐ ์ฐ์๋๋ฐ, ๋์ ์ฐ์ฐ์๋ฅผ ์ ์ํ์ง ์์์์๋ ์ด๋ฐ ๋ฌธ์ฅ์ ์ ์์ ์ผ๋ก ๋ฉค๋ฒ ๋ ๋ฉค๋ฒ ๋ณต์ฌ๋ก ์ด๋ฃจ์ด์ง๋ค. ์ฌ์ค์, ๋ํดํธ ๋ณต์ฌ ์์ฑ์์ ๊ฐ์ด, ๋์ ์ฐ์ฐ์๊ฐ ์ ์๋์ง ์์ผ๋ฉด ๋ํดํธ ๋์ ์ฐ์ฐ์๊ฐ ์ฝ์ ๋๋ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฉค๋ฒ ๋ ๋ฉค๋ฒ๋ก ๋ณต์ฌ๋ฅผ ์ํํ ๋, ๊น์ ๋ณต์ฌ๊ฐ ์๋ ์์ ๋ณต์ฌ๋ฅผ ์งํํ๋ค.
#include <iostream>
using namespace std;
class Student
{
private:
char * name;
int age;
public:
Student(char * name, int age) : age(age)
{
this->name = new char[10];
strcpy(this->name, name);
}
void ShowInfo() {
cout << "์ด๋ฆ: " << name << endl;
cout << "๋์ด: " << age << endl;
}
~Student()
{
delete []name;
cout << "~Student ์๋ฉธ์ ํธ์ถ!" << endl;
}
};
int main()
{
Student st1("๊น์ฒ ์", 14);
Student st2("ํ๊ธธ๋", 15);
st2 = st1;
st1.ShowInfo();
st2.ShowInfo();
return 0;
}
์ด๋ฆ: ๊น์ฒ ์
๋์ด: 14
์ด๋ฆ: ๊น์ฒ ์
๋์ด: 14
~Student ์๋ฉธ์ ํธ์ถ!
๊ณ์ํ๋ ค๋ฉด ์๋ฌด ํค๋ ๋๋ฅด์ญ์์ค . . .
๋ํดํธ ๋์ ์ฐ์ฐ์์ ์ํด ๋ฉค๋ฒ ๋ ๋ฉค๋ฒ ๋ณต์ฌ๊ฐ ์ด๋ฃจ์ด์ง๋๋ฐ, ์ฌ๊ธฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. ๋ณต์ฌ๊ฐ ์ด๋ฃจ์ด์ง๋ฉด์ str2๋ "ํ๊ธธ๋"์ด ์๋ "๊น์ฒ ์"๋ ๋ฌธ์์ด์ด ๋ด๊ธด ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํค๊ณ , "ํ๊ธธ๋"์ด๋ ๋ฌธ์์ด์ ์ ๊ทผ๋, ์๋ฉธ๋ ๋ถ๊ฐ๋ฅํ ์ํฉ์ด ๋ฐ์ํ๋ค. ๋ํ ๊ฐ์ฒด์ ์๋ฉธ์๊ฐ ํธ์ถ๋ ๋, st1, st2 ๊ฐ์ฒด ๋ชจ๋ "๊น์ฒ ์"๋ ๋ฌธ์์ด์ด ๋ด๊ธด ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํค๊ณ delete๋ฅผ ํตํด ์๋ฉธํ ๋ ์ค๋ณต ์๋ฉธํ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
๐ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๊น์ ๋ณต์ฌ๋ฅผ ์ ์ํ๋ฉด ๋๋ค.
#include <iostream>
using namespace std;
class Student
{
private:
char * name;
int age;
public:
Student(char * name, int age) : age(age)
{
this->name = new char[10];
strcpy(this->name, name);
}
void ShowInfo() {
cout << "์ด๋ฆ: " << name << endl;
cout << "๋์ด: " << age << endl;
}
Student& operator=(Student& ref)
{
delete []name;
name = new char[10];
strcpy(name, ref.name);
age = ref.age;
return *this;
}
~Student()
{
delete []name;
cout << "~Student ์๋ฉธ์ ํธ์ถ!" << endl;
}
};
int main()
{
Student st1("๊น์ฒ ์", 14);
Student st2("ํ๊ธธ๋", 15);
st2 = st1;
st1.ShowInfo();
st2.ShowInfo();
return 0;
}
์ด๋ฆ: ๊น์ฒ ์
๋์ด: 14
์ด๋ฆ: ๊น์ฒ ์
๋์ด: 14
~Student ์๋ฉธ์ ํธ์ถ!
๊ณ์ํ๋ ค๋ฉด ์๋ฌด ํค๋ ๋๋ฅด์ญ์์ค . . .
๋์ ์ฐ์ฐ์๋ฅผ ์ ์(์ฐ์ฐ์ ์ค๋ฒ๋ก๋ฉ)ํ๊ณ ์๋ค. ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ง๊ธฐ ์ํด name์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์์ ํด์ ํ๊ณ , ์๋ก ๊ณต๊ฐ์ ํ ๋นํ๋ค. ๋๋จธ์ง๋ ์ฝ๋ ํ์ธํ๋ฉด ์ดํด ๊ฐ๋ฅ.
์ด๋ ๊ฒ ๋๋ฉด, "ํ๊ธธ๋"์ด๋ ๋ฌธ์์ด์ด ํด์ ๋์ง ์๊ณ , ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋จ์์๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๊ณ (delete ์ฐ์ฐ), ์ ์๋ ๋์ ์ฐ์ฐ์์ ์ํด ๋ณต์ฌ๊ฐ ์ด๋ฃจ์ด์ง๊ณ , st1์ "๊น์ฒ ์"์, st2 "๊น์ฒ ์"๋ ์๋ก ๋ค๋ฅธ ๊ณณ์ ๊ฐ๋ฆฌํค๊ฒ ๋๋ค.
์ฐธ๊ณ ์๋ฃ
'๐ฉโ๐ป ํ๋ก๊ทธ๋๋ฐ > ๐ C++' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[C++] ํ ํ๋ฆฟ(Template) (0) | 2024.05.08 |
---|---|
[C++] String ํด๋์ค ๋์์ธ (0) | 2024.05.06 |
[C++] ๊ฐ์์ ์๋ฆฌ์ ๋ค์ค์์ (0) | 2024.04.29 |
[C++] ์์๊ณผ ๋คํ์ฑ | ๊ฐ์ํจ์(virtual function) | ์ฐธ์กฐ์ (1) | 2024.04.26 |
[C++] ์์ (0) | 2024.04.23 |