πŸ‘©‍πŸ’» ν”„λ‘œκ·Έλž˜λ°/🎠 C++

[C++] μ—°μ‚°μž μ˜€λ²„λ‘œλ”©

peewoong 2024. 4. 30. 16:31

🟩 μ—°μ‚°μž μ˜€λ²„λ‘œλ”©

ν•¨μˆ˜ μ˜€λ²„λ‘œλ”©, μƒμ„±μž μ˜€λ²„λ‘œλ”©μ€ ν•¨μˆ˜λͺ…, μƒμ„±μžλͺ…이 κ°™μœΌλ‚˜ λ§€κ°œλ³€μˆ˜μ˜ μžλ£Œν˜•μ΄λ‚˜ μˆ˜κ°€ λ‹€λ₯Έ ν•¨μˆ˜μ΄λ‹€. μ—°μ‚°μž μ˜€λ²„λ‘œλ”©μ˜ 경우 λ‹€λ₯Έ κΈ°λŠ₯을 μ œκ³΅ν•˜λ©΄μ„œ μ—°μ‚°μžλ₯Ό μΆ”κ°€ν•  수 μžˆμ„κΉŒ?

#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 "κΉ€μ² μˆ˜"λŠ” μ„œλ‘œ λ‹€λ₯Έ 곳을 κ°€λ¦¬ν‚€κ²Œ λœλ‹€.


참고 자료

https://blog.hexabrain.net/177