๊ณต๋ถ€/์ฝ”๋”ฉ

[c++] ์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ

sourceoftax 2025. 7. 27. 15:38

2x2 ํ–‰๋ ฌ์˜ ๋ง์…ˆ/๊ณฑ์…ˆ์„ ์ˆ˜ํ–‰๊ณผ ํ–‰๋ ฌ ์ถœ๋ ฅ์„ ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ํ”„๋กœ๊ทธ๋žจ์ด๋‹ค. ์ž…๋ ฅ ๋„ฃ๊ธฐ ๊ท€์ฐฎ์•„์„œ ๊ทธ๋ƒฅ ์ž„์˜์˜ ๊ฐ’ ์„ค์ •ํ•ด๋†จ๋‹ค.

#include <iostream>
#include <string>
using namespace std;

struct Point {
	int x, y;
};

class Matrix2x2 {
public:
	Point row1;
	Point row2;

	Matrix2x2(Point r1, Point r2) {
		row1 = r1;
		row2 = r2;
	}


	Matrix2x2 operator+(const Matrix2x2& other) const {
		return Matrix2x2(
			{ row1.x + other.row1.x, row1.y + other.row1.y },
			{ row2.x + other.row2.x, row2.y + other.row2.y }
		);
	}

	Matrix2x2 operator*(const Matrix2x2& other) const {
		return Matrix2x2(
			{
			row1.x * other.row1.x + row1.y * other.row2.x,
			row1.x * other.row1.y + row1.y * other.row2.y
			},
		{
			row2.x * other.row1.x + row2.y * other.row2.x,
			row2.x * other.row1.y + row2.y * other.row2.y
		}
		);
	}

	friend ostream& operator<<(ostream& os, const Matrix2x2& m) {
		os << "({" << m.row1.x << "," << m.row1.y << "}," <<"{" << m.row2.x << "," << m.row2.y << "})";
		return os;
	}

};
int main(void) {
	Matrix2x2 m1({ 1,2 }, { 3,4 });
	Matrix2x2 m2({ 5,6 }, { 7,8 });
	Matrix2x2 result = m1 + m2;
	Matrix2x2 result2 = m1 * m2;

	cout << result << endl;
	cout << result2;

	return 0;
}

์šฐ์„  ์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ์ด ๋ฌด์—‡์ธ์ง€๋ถ€ํ„ฐ ์•Œ์•„๋ณด์ž. '+' '*' '<<' ์ด ๊ธฐํ˜ธ๋“ค ๋ณด๋ฉด ์•„๋‹ˆ ๊ฑ ๋ง์…ˆ ๊ณฑ์…ˆ ์ถœ๋ ฅ์ด์ž๋‚˜ ์žฅ๋‚œ? ์ด๋Ÿฐ ์ƒ๊ฐ์ด ๋จผ์ € ๋“ค๊ฒŒ ๋œ๋‹ค. ํ•˜์ง€๋งŒ ํŠน์ดํ•œ ํ˜•ํƒœ์˜ ์—ฐ์‚ฐ์„ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž. 2+2๋ฅผ ํ•˜๋ฉด int+int๋‹ˆ๊นŒ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ 4๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ 2x2 ํ–‰๋ ฌ๊ณผ ๊ฐ™์ด { 1,2 }, { 3,4 } + { 5,6 }, { 7,8 } ๋„ฃ์œผ๋ฉด ์‚ฌ๋žŒ์€ ๋จธ๋ฆฌ ๊ตด๋ ค์„œ ๊ณ„์‚ฐ ๊ฐ€๋Šฅํ•œ๋ฐ ์ปดํ“จํ„ฐ๋Š” ์ด๊ฒŒ int์ธ์ง€ char์ธ์ง€ ํŒ๋‹จ์ด ์•ˆ๋˜๋Š”๋ฐ ์–ด์ผ€ํ•ด์š” ์‹œ์ „ํ•ด๋ฒ„๋ฆฐ๋‹ค. 
๊ทธ๋ ‡๊ธฐ์— ์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ์€ ์ € ๊ธฐ๋ณธ ์—ฐ์‚ฐ์ž๋ฅผ ๋‚ด ์ž…๋ง›๋Œ€๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด๋‹ค. ์ผ๋ฐ˜์ ์ธ ์ƒํ™ฉ์—์„œ๋Š” ๊ธฐ๋ณธ ์—ฐ์‚ฐ์ž์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜์ง€๋งŒ, 'ํŠน์ •ํ•œ ์กฐ๊ฑด'์ด ๋งŒ์กฑ๋  ๋•Œ, ๋‚ด๊ฐ€ ๋งŒ๋“  ์ปค์Šคํ…€ ์—ฐ์‚ฐ์ž๊ฐ€ ์‹คํ–‰๋œ๋‹ค. ์œ„ ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉ๋œ '+' ์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ์„ ๋ณด๋„๋ก ํ•˜์ž
 

Matrix2x2 operator+(const Matrix2x2& other) const {
	return Matrix2x2(
		{ row1.x + other.row1.x, row1.y + other.row1.y },
		{ row2.x + other.row2.x, row2.y + other.row2.y }
	);
}

operator '+'๋Š” ๋‚ด๊ฐ€ ๊ตฌ์กฐ์ฒด์™€ ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ๋ฏธ๋ฆฌ ์„ค์ •ํ•ด๋‘” ํ˜•ํƒœ์ธ const Matrix2x2์™€ ๋’ค์— ๋‹ค๋ฅธ ๊ฐ’(other)์ด ํ•จ๊ป˜ ์˜ฌ ๋•Œ ์‹คํ–‰๋œ๋‹ค. ์—ฌ๊ธฐ์„œ other์˜ ํ˜•ํƒœ๋„ ๋ณด๊ฒŒ๋˜๋ฉด other.row1.x, other.row2.y๋“ฑ 2x2 ํ–‰๋ ฌ์ด์–ด์•ผ ์‹คํ–‰๋œ๋‹ค. ๋‘˜ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ํ˜•ํƒœ๋ฅผ ๋งŒ์กฑํ•˜์ง€ ์•Š์œผ๋ฉด ์ด ์—ฐ์‚ฐ์€ ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.
 

	friend ostream& operator<<(ostream& os, const Matrix2x2& m) {
		os << "({" << m.row1.x << "," << m.row1.y << "}," <<"{" << m.row2.x << "," << m.row2.y << "})";
		return os;
	}

์—ฌ๊ธฐ์„œ๋Š” friend ๋ฅผ ์“ธ ํ•„์š” ์—†์ง€๋งŒ ๊ตณ์ด๊ตณ์ด ์จ๋ดค๋‹ค.
์ถœ๋ ฅ์„ ๋‹ด๋‹นํ•˜๋Š” '<<'์„ ์˜ค๋ฒ„๋กœ๋”ฉํ•˜๋Š” ์—ญํ• ์ธ ๊ฑด ์•Œ๊ฒ ๋‹ค. ๊ทผ๋ฐ friend๋Š” ์™œ ์“ฐ๋Š” ๊ฑธ๊นŒ? ์ด๊ฑด public/private์„ ๋– ์˜ฌ๋ฆฌ๋ฉด ๋œ๋‹ค. ํ˜„์žฌ operator '<<'ํ•จ์ˆ˜์˜ ์œ„์น˜๋Š” class ๋‚ด๋ถ€์ด์ง€๋งŒ, ๋ณธ์งˆ์ ์œผ๋กœ๋Š” ์™ธ๋ถ€ ํ•จ์ˆ˜์ด๋‹ค. ์ผ๋‹จ operator์ด ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„๊ฐ€ ์•„๋‹ˆ๋ฉฐ, this ํฌ์ธํ„ฐ๋„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋งŒ์•ฝ row1, row2์˜ ๊ฐ’์ด private(ํ˜„์žฌ๋Š” public์ด์ง€๋งŒ)์œผ๋กœ ์„ค์ •๋˜๋ฉด ์ ‘๊ทผ์„ ๋ชปํ•˜๋Š” ๋ถˆ์ƒ์‚ฌ๊ฐ€ ์ƒ๊ธธ ์ˆ˜๋„ ์žˆ๋‹ค. ์ด๊ฑธ ๋ฐฉ์ง€ํ•ด์ฃผ๋Š”๊ฒŒ friend์ด๋‹ค. ์™ธ๋ถ€ ํ•จ์ˆ˜์—๊ฒŒ private ๋ฉค๋ฒ„ ์ ‘๊ทผ ๊ถŒํ•œ์„ ์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. ๋‹ค๋งŒ ์บก์Аํ™”๋ฅผ ๋ถ€๋ถ„์ ์œผ๋กœ ๊นจ๋Š” ํ–‰์œ„์ด๊ธฐ์— ์ƒ๊ฐ ๋งŽ์ด ํ•ด๋ณด๊ณ  ์จ์•ผ ํ•œ๋‹ค...