์ค๋ฒ๋ก๋ฉ์ด ๋ฌด์์ธ๊ฐ? ๋ฎ์ด ์์ฐ๋ ๊ฒ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด ์ฐ์ฐ์ ์ค๋ฒ๋ก๋ฉ์ ๋ฌด์์ผ๊น? ๋น์ฐํ ์ฐ์ฐ์๋ฅผ ์๋ก ๋ฎ์ด ์์ฐ๋ ๊ฒ์ด๋ค!
์ฐ์ฐ์ ์ค๋ฒ๋ก๋ฉ์ ์ด๋ป๊ฒ ํ ๊น? ๊ทธ๋ฆฌ๊ณ ์ ํ ๊น? ํ ๋ ์ฃผ์ ํ ์ ์ ๋ฌด์์ด ์์๊น?
class vector2D
{
private:
int x;
int y;
public:
vector2D();
vector2D(int X, int Y);
int getX() const;
int getY() const;
void output() const;
};
๋ค์๊ณผ ๊ฐ์ ํด๋์ค๊ฐ ์๋ค๊ณ ๊ฐ์ ํด๋ณด์. ๋ฒกํฐ์์ ๋ํ๊ธฐ ์ฐ์ฐ์ ๊ต์ฅํ ์ค์ํ๋ค. ํ์ง๋ง ์ด ์ํ์์๋ ๋ํ๊ธฐ๋ฅผ ์งํํ ์ ์๋ค.
๋๋ฌธ์ ๋ํ๊ธฐ์ ๋ํ ํจ์๋ฅผ ๋ง๋ค ์๋ ์๋ค. ํ์ง๋ง c++์์ ๋ํ๊ธฐ ํจ์๋ณด๋ค ๋ ์ข์ ๊ฒ์ ์ ๊ณตํด์ค๋ค. ๋ฐ๋ก ์ฐ์ฐ์ ์ค๋ฒ๋ก๋์ด๋ค. ๋ณดํต +์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ์ ์๋ ์ค์๊ฐ ๋ค์ด๊ฐ์ผ ํ๋ค.
ํ์ง๋ง ์ด๊ฒ์ ๋ด ๋ง์๋๋ก ์ ํ ์ ์๋ค. ๋ค์๊ณผ ๊ฐ์ ์์ผ๋ก ๋ง์ด๋ค.
int main(void)
{
vector2D v1(2, 2), v2(3, 3), v3;
v3 = v1 + v2;
}
const vector2D operator +(const vector2D& v1, const vector2D& v2)
{
int x = v1.getX() + v2.getX();
int y = v1.getY() + v2.getY();
return vector2D(x, y);
}
๋ค์๊ณผ ๊ฐ์ ์์ผ๋ก ๋ง๋ค์ด ์ฃผ๋ฉด ์ฐ์ฐ์๋ฅผ ์ค๋ฒ๋ก๋ ํ ์ ์๋ค. vector2Dํ operator + ๋ผ๊ณ ์ดํดํ๋ฉด ์กฐ๊ธ ํธํ ๊ฒ์ด๋ค.
์ง๊ธ ๋ณด์ฌ์ค ๊ฒ์ ํด๋์ค ์ธ๋ถ์์ ์ ์ธ ํ ๊ฒ์ด๋ฉฐ ๋ฉค๋ฒ ํจ์๋ ์๋์๋ค. ํ์ง๋ง ์ด์ ๋ฉค๋ฒ ํจ์๋ก์จ ํด๋์ค ๋ด๋ถ์์ ์ ์ธํ๋ฉด ๋ชจ์์ด ์กฐ๊ธ ๋ฌ๋ผ์ง๋ค. ๋ค์๊ณผ ๊ฐ์ ์์ผ๋ก ๋ง์ด๋ค.
class vector2D
{
private:
int x;
int y;
public:
vector2D();
vector2D(int X, int Y);
int getX() const;
int getY() const;
void output() const;
vector2D operator+(vector2D v);
};
vector2D vector2D::operator+(vector2D v)
{
int new_x = x + v.getX();
int new_y = y + v.getY();
return vector2D(new_x, new_y);
}
๊ทผ๋ฐ ์ฌ๊ธฐ์ ์กฐ๊ธ ๋ถํธํ ์ ์ด ์๋ค. ๋ฐ๋ก accessor/mutator์ ์กด์ฌ์ด๋ค.
(getX, setX์ ๊ฐ์ ํจ์๋ฅผ ๋งํจ)
๋๋ฌธ์ ์ฐ๋ฆฌ๋ friend๋ผ๋ ๊ฒ์ ์ฌ์ฉํ๋ค.
๐ก ์ด๊ฒ์ ์ฌ์ฉํ๋ฉด friend๋ผ๋ฆฌ ๋ฉค๋ฒ๋ณ์๋ฅผ ๊ณต์ ํ ์ ์๋ค.
์ข ๋ ์ฝ๊ฒ ์ธ ์ ์๋ค. ์ฌ์ค friend๋ฅผ ์ฐ๊ฒ ๋๋ฉด ํ์์ ๋ฉค๋ฒ๋ณ์๊ฐ ์๋ ๋์ ๋ ๋น์ทํ๋ค ํ์ง๋ง ์ฐจ์ด์ ์ ๋ฉค๋ฒ๋ณ์์ ์ง์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค๋ ์ฌ์ค์ด๋ค.
class vector2D
{
private:
int x;
int y;
public:
vector2D();
vector2D(int X, int Y);
int getX() const;
int getY() const;
void output() const;
friend vector2D operator+(vector2D v1, vector2D v2);
};
vector2D operator+(vector2D v1, vector2D v2)
{
int x = v1.x + v2.x;
int y = v1.y + v2.y;
return vector2D(x, y);
}
๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ๋ฉด ์ข ๋ ์ง๊ด์ ์ธ ์ฝ๋ฉ์ ํ ์ ์์ผ๋ ๊ผญ ๊ธฐ์ตํ์!
๋ํ๊ธฐ ์ฐ์ฐ์์ ๋ฐ๋ก ๊ตฌ๋ถํ ์ด์ ๋ << ์ฐ์ฐ์๋ ์กฐ๊ธ ๋ ํนํ ์น๊ตฌ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ์ ํน์ดํ๋๋ฉด ์ด๊ฒ์ ostream์ ๊ฑฐ์น๊ธฐ ๋๋ฌธ์ด๋ค. ์ฐธ๊ณ ๋ก, >> ์ฐ์ฐ์๋ istream์ ๊ฑฐ์น๋ค. ์ด๊ฒ๋ค๋ ํด๋์ค ์ด๋ฆ์ธ๋ฐ ์กฐ๊ธ ๋ ํนํ ์น๊ตฌ๋ค์ด๋ค.
๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ๋๋ฐ ์ฌ์ค ๋๋ ์ ์ ๋ ๊ฒ ์ฐ๋์ง๋ ์ ๋ชจ๋ฅด๊ฒ ๋ค... ๋~์ค์ ๊ณต๋ถํด์ผ์ง ใ ใ
class vector2D
{
private:
int x;
int y;
public:
vector2D();
vector2D(int X, int Y);
friend vector2D operator+(vector2D v1, vector2D v2);
friend ostream& operator<<(ostream& outStream, vector2D v);
};
ostream& operator<<(ostream& outstream, vector2D v)
{
outstream << "(" << v.x << ","<< v.y <<")" << endl;
return outstream;
}
๐ก friend๋ฅผ ์ ์ธ ํ๊ธฐ ๋๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ด ์ง์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค.
int main(void)
{
vector2D v1(2, 2), v2(3, 3), v3;
cout << v1 << v2;
v3 = v1+ v2;
cout << v3;
}
์ด์ output ํจ์๋ฅผ ํธ์ถ ํ ํ์ ์์ด << ์ฐ์ฐ์๋ฅผ ํตํด์ ๋ฐ๋ก๋ฐ๋ก ์ถ๋ ฅํด์ฃผ๋ฉด ๋๋ค.
์ฝ๋๊ฐ ํจ์ฌ ๊ฐ๊ฒฐํด์ก๋ค!
/// ์ค๋ต
friend istream& operator>>(istream& inputStream, vector2D& v);
};
istream& operator>>(istream& inputStream, vector2D& v )
{
cout << "INPUT VECTOR: ";
int x, y;
inputStream >> x;
inputStream >> y;
v.x = x;
v.y = y;
return inputStream;
}
๐ก ๊ฐ์ ๋ณ๊ฒฝํด์ฃผ์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ฐธ์กฐ์ & ๋ ๊ผญ ๋ถ์ฌ์ค์ผ ํ๋ค!
๊ทธ๋ ์ง ์์ผ๋ฉด ๋ด๊ฐ ์์น ์๋ ๊ฐ์ด ๋์จ๋ค!
int main(void)
{
vector2D v1(2, 2), v2(3, 3), v3;
cin >> v1;
cin >> v2;
cout << v1 << v2;
v3 = v1 + v2;
cout << v3;
}
๋ค์๊ณผ ๊ฐ์ด ๊ฐ์ ๋ฃ์ด์ค ์๋ ์๋ค!