League Of Legends - Link Select 03. C++ ์ฃผ์š” ๊ธฐ๋Šฅ & ์ƒ์„ฑ์ž/์†Œ๋ฉธ์ž/๋ณต์‚ฌ์ƒ์„ฑ์ž
๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿค“ Study/C++ & C#

03. C++ ์ฃผ์š” ๊ธฐ๋Šฅ & ์ƒ์„ฑ์ž/์†Œ๋ฉธ์ž/๋ณต์‚ฌ์ƒ์„ฑ์ž

by GAMEMING 2024. 3. 20.
728x90

 

 

- C++ ์ฃผ์š” ๊ธฐ๋Šฅ ( ์ถ”์ƒํ™”, ์ •๋ณด ์€๋‹‰, ์บก์Аํ™”)

#include <iostream>
using namespace std;

// C++ ์ฃผ์š” ๊ธฐ๋Šฅ

// 1. ์ถ”์ƒํ™”(abstracton)
// : ์‚ฌ๋ฌผ์„ ์‚ฌ์‹ค์ ์œผ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ฐœ๋…(๊ตฌ์ƒํ™”)๊ฐ€ ์•„๋‹Œ
//   ๋ถˆํ•„์š”ํ•œ ๋ถ€๋ถ„์€ ์ œ๊ฑฐํ•˜๊ณ  ๊ณตํ†ต๋œ ํŠน์ง•๋งŒ์„ ์ถ”์ถœํ•˜๋Š” ๊ฒƒ

// ex) ์Šค๋งˆํŠธํฐ -> User : ๋‚ด๋ถ€ ์„ค๊ณ„ ๋ชจ๋ฅด์ง€๋งŒ, ์ž˜ ์‚ฌ์šฉํ•จ (์™ธ๋ถ€ ์ธํ„ฐํŽ˜์ด์Šค - ๋‚ด๋ถ€ ๊ตฌํ˜„)

// 2. ๋ฐ์ดํ„ฐ ์€๋‹‰(Data hiding)
// : ๊ฐ์ฒด์˜ ์†์„ฑ์„ ์ˆจ๊ธฐ๊ณ  ๊ณต๊ฐœ๋œ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ์„ ํ†ตํ•ด์„œ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ

// 3. ์บก์Аํ™”(Capsulation)
// : ๊ฐ์ฒด์˜ ์†์„ฑ๊ณผ ๊ธฐ๋Šฅ์„ ํ•˜๋‚˜๋กœ ๋ฌถ๊ณ , ์„ธ๋ถ€ ๊ตฌํ˜„์€ ํด๋ž˜์Šค ์•ˆ์œผ๋กœ ์ˆจ๊ธฐ๋Š” ๊ฒƒ
//  ์ž˜ ๋˜์–ด ์žˆ๋Š” ํด๋ž˜์Šค๋Š” ์žฌํ™œ์šฉ๋„๊ฐ€ ๋งค์šฐ ๋†’๋‹ค

// ์•„๋ž˜๋Š” ์บก์Аํ™”๊ฐ€ ์ž˜๋ชป๋œ ์˜ˆ์ œ์ด๋‹ค.

class File {
public:
	void load()
	{
		cout << "mp3 ํŒŒ์ผ์„ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ฆฐ๋‹ค." << endl;
	}
};

class PowerDevice {
public:
	void PowerUp()
	{
		cout << "mp3 play๋ฅผ ์œ„ํ•œ ํŒŒ์›Œ๋ฅผ ์˜ฌ๋ฆฐ๋‹ค." << endl;
	}
};

class Memory {
public:
	void expand()
	{
		cout << "mp3 play๋ฅผ ์œ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋Š˜๋ฆฝ๋‹ˆ๋‹ค." << endl;
	}
};

class Mp3 {
public:
	void play()
	{
		cout << "mp3๋ฅผ playํ•ฉ๋‹ˆ๋‹ค" << endl;
	}
};

int main()
{
	PowerDevice pd;
	Memory m;
	File f;
	Mp3 mp;

	pd.PowerUp();
	m.expand();
	f.load();
	mp.play();
}

//  User๋Š” mp3๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์žฌ์ƒ ๊ธฐ๋Šฅ๋งŒ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.
//  mp3์˜ ์„ธ๋ถ€๊ตฌํ˜„์€ ์ˆจ๊ธฐ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์บก์Аํ™” ์•„๋ž˜์˜ ์˜ˆ์ œ ์ฐธ๊ณ ํ•˜์ž
#include <iostream>
using namespace std;

// mp3์˜ play๊ธฐ๋Šฅ๋งŒ์„ ์‚ฌ์šฉํ•จ์œผ๋กœ
// ์ด mp3 ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์œ ์ €๋Š” ์„ธ๋ถ€ ๊ตฌํ˜„์— ๋Œ€ํ•ด ๋ชฐ๋ผ๋„ ๋จ

class File {
public:
	void load()
	{
		cout << "mp3 ํŒŒ์ผ์„ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ฆฐ๋‹ค." << endl;
	}
};

class PowerDevice {
public:
	void PowerUp()
	{
		cout << "mp3 play๋ฅผ ์œ„ํ•œ ํŒŒ์›Œ๋ฅผ ์˜ฌ๋ฆฐ๋‹ค." << endl;
	}
};

class Memory {
public:
	void expand()
	{
		cout << "mp3 play๋ฅผ ์œ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋Š˜๋ฆฝ๋‹ˆ๋‹ค." << endl;
	}
};

class Mp3 {
private:
	File f;
	PowerDevice pd;
	Memory m;

public:
	void play()
	{
		pd.PowerUp();
		m.expand();
		f.load();
		cout << "mp3 play" << endl;
	}
};

int main()
{
	Mp3 mp;
	mp.play();
}

 

 

 

 

- ์ƒ์„ฑ์ž

#include <iostream>
using namespace std;

#define NAME_LEN 20
#define SEX_LEN 10
#define JOB_LEN 20
#define CHARACTER_LEN 20

class Person {
private:
	char name[NAME_LEN];
	char sex[SEX_LEN];
	char job[JOB_LEN];
	char character[CHARACTER_LEN];
	int age;
	bool marriageStatus;
public:
	// ๋””ํดํŠธ ์ƒ์„ฑ์ž
	Person()
	{
		cout << "๋””ํดํŠธ ์ƒ์„ฑ์ž : Person::Person()" << endl;
		// ๋ณ€์ˆ˜ ์ดˆ๊ธฐํ™”
	}

	// ์ €๋ฒˆ ์‹œ๊ฐ„์— ํ–ˆ๋˜ constructor์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ƒ์„ฑ์ž
	// ๋ฉค๋ฒ„ ์ดˆ๊ธฐํ™”๋ฅผ ์ด์šฉํ•œ ์ƒ์„ฑ์ž
	Person(const char* name, const char* sex, const char* job,const char* character,
		int age, bool marriageStatus);      // ์ƒ์„ฑ์ž ์„ ์–ธ
	void introduce();
	void eat(const char* food);
	void sleep();
	void drive(const char* dest);
	void write();
	void read();
};

int main()
{
	// Person player1, player2;

	//player1.constructor("์˜ˆ์Šฌ", "์—ฌ์„ฑ", "์ฝ”๋”ฉ์ฒœ์žฌ", "์˜จ์ˆœ", 21, true);
	// player2.constructor("์ข…๋ช…", "๋‚จ์„ฑ", "์š”์–‘์›", "์„ฑ์‹ค", 23, false);

	Person player1("์˜ˆ์Šฌ", "์—ฌ์„ฑ", "์ฝ”๋”ฉ์ฒœ์žฌ", "์˜จ์ˆœ", 21, true);
	Person player2("์ข…๋ช…", "๋‚จ์„ฑ", "์š”์–‘์›", "์„ฑ์‹ค", 23, false);

	player1.introduce();
	player2.introduce();

	player1.eat("๋งˆ๋ผํƒ•");
}

 Person::Person(const char* name, const char* sex, const char* job, const char* character, int age, bool marriageStatus)
{
	strcpy_s(this->name, name);
	strcpy_s(this->sex, sex);
	strcpy_s(this->job, job);
	strcpy_s(this->character, character);
	this->age = age;
	this->marriageStatus = marriageStatus;

	cout << "์ƒ์„ฑ์ž : Person::Person(~)" << endl;
}

void Person::introduce()
{
	cout << "์ด๋ฆ„ : " << name << endl;
	cout << "์„ฑ๋ณ„ : " << sex << endl;
	cout << "์ง์—… : " << job << endl;
	cout << "์„ฑ๊ฒฉ : " << character << endl;
	cout << "๋‚˜์ด : " << age << endl;
	cout << "๊ฒฐํ˜ผ ์—ฌ๋ถ€ : " << (marriageStatus ? "YES" : "NO") << endl;
}

void Person::eat(const char* food)
{
	cout << name << "์€(๋Š”) " << food << "๋ฅผ ๋จน๋Š”๋‹ค" << endl;
}

void Person::sleep()
{
	cout << name << "์€(๋Š”) ์ž”๋‹ค" << endl;
}

void Person::drive(const char* dest)
{
	cout << name << "์€(๋Š”) " << dest << "์œผ๋กœ ์šด์ „ํ•œ๋‹ค" << endl;
}

void Person::write()
{
	cout << name << "์€(๋Š”) ์ฑ…์„ ์“ด๋‹ค" << endl;
}

void Person::read()
{
	cout << name << "์€(๋Š”) ์ฑ…์„ ์ฝ๋Š”๋‹ค" << endl;
}


// 01) ์ƒ์„ฑ์ž ์„ ์–ธ
// - ํ•ด๋‹น ํด๋ž˜์Šค์˜ ์ด๋ฆ„๊ณผ ๊ฐ™์•„์•ผ ํ•˜๋ฉฐ, ๋ฐ˜ํ™˜ํ˜•์ด ์—†์–ด์•ผ ํ•œ๋‹ค

// 02) ์ƒ์„ฑ์ž ํ˜ธ์ถœํ•˜๋Š” ๊ณณ์€ ์–ด๋””์ธ๊ฐ€?
// - ๊ฐ์ฒด ์ƒ์„ฑ์„ ์œ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„ ํ• ๋‹น๊ณผ ๋™์‹œ์— ์ƒ์„ฑ์ž๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.
// - ํ˜„์žฌ์˜ ์ฝ”๋“œ์—์„œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ๊ณผ ๋™์‹œ์— ์ดˆ๊ธฐํ™” ํ•˜๊ณ  ์žˆ๋‹ค.

// 03) ๊ฐ™์€ ์ด๋ฆ„์œผ๋กœ ์—ฌ๋Ÿฌ ๊ฐœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋ฉฐ (ํ•จ์ˆ˜ ์˜ค๋ฒ„๋กœ๋”ฉ)

// 04) ์ƒ๋žต ๊ฐ€๋Šฅํ•˜๋‹ค (๋””ํดํŠธ ์ƒ์„ฑ์ž ์ž๋™ ์ƒ์„ฑ)
// -> ๋””ํดํŠธ ์ƒ์„ฑ์ž(๊ธฐ๋ณธ ์ƒ์„ฑ์ž)
// ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ–ˆ๋˜ ์ฝ”๋“œ์—์„œ ์ƒ์„ฑ์ž๋ฅผ ์ง€์šฐ๋ฉด? -> ๋Œ์•„๊ฐ€๊ธด ํ•˜๋‚˜ ์“ฐ๋ ˆ๊ธฐ ๊ฐ’.

 

 

 

- ์†Œ๋ฉธ์ž

#include <iostream>
using namespace std;

// ์†Œ๋ฉธ์ž(deconstructor)
// ๊ฐ์ฒด๊ฐ€ ์†Œ๋ฉธํ•  ๋•Œ ์ž๋™ ํ˜ธ์ถœ
// ๋™์  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•˜๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉ
// ์ƒ๋žต ๊ฐ€๋Šฅ

// ๋™์  ๋ฉ”๋ชจ๋ฆฌ
// c์–ธ์–ด - malloc(), free(0
// c++ - new, delete

// strcpy_s
// - ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์€ ๋ฉ”๋ชจ๋ฆฌ์—
// ๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์€ ๊ธธ์ด๋งŒํผ
// ์„ธ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๋‚ด์šฉ์„ ๋ณต์‚ฌ


class Person {
private:
	char* name;
public:
	Person(const char* name) //์ƒ์„ฑ์ž
	{
		this->name = new char[strlen(name) + 1];    // ๋™์ ํ• ๋‹น
		strcpy_s(this->name, strlen(name) + 1, name);
		cout << "Person::Person(name) ์ƒ์„ฑ์ž ์™„๋ฃŒ" << endl;
	}

	Person()
	{
		cout << "Person::Person() ์ƒ์„ฑ์ž ์™„๋ฃŒ" << endl;
	}

	~Person() // ์†Œ๋ฉธ์ž
	{
		delete[] name;
		cout << "Person::~Person ์†Œ๋ฉธ์ž ์™„๋ฃŒ" << endl;
	}

	void introduce();
};

int main()
{
	Person person("๋ฏธ์˜");
	person.introduce();

}

void Person::introduce()
{
	cout << "์ด๋ฆ„: " << name << endl;
}

 

 

 

- ๋ณต์‚ฌ ์ƒ์„ฑ์ž

#include <iostream>
using namespace std;

// ๋ณต์‚ฌ ์ƒ์„ฑ์ž (๋ณต์‚ฌํ•  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ์ƒ์„ฑ์ž)
// - ๋จผ์ € ์ƒ์„œ์™ผ ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•ด์„œ ์ƒˆ๋กœ์šด ๊ฐ์ฒด ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ฒฝ์šฐ
// - ๋จผ์ € ์ƒ์„ฑํ•œ ๊ฐ์ฒด๋ฅผ ์ธ์ž๋กœ ์ „๋‹ฌํ•˜๋Š” ๊ฒฝ์šฐ
// - ํ•จ์ˆ˜ ๋‚ด์—์„œ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ

// ์•„๋ž˜์˜ ์ฝ”๋“œ์—์„œ ์†Œ๋ฉธ์ž 2๋ฒˆ ํ˜ธ์ถœ -> ์ด์œ 

class Person {
private:
	int age;
	int num;
public:
	Person(int age) : age(age) //์ƒ์„ฑ์ž
	{
		cout << "Person::Person(age) ์ƒ์„ฑ์ž ์™„๋ฃŒ" << endl;
	}

	Person()
	{
		cout << "Person::Person() ์ƒ์„ฑ์ž ์™„๋ฃŒ" << endl;
	}

	~Person() // ์†Œ๋ฉธ์ž
	{
		cout << "Person::~Person ์†Œ๋ฉธ์ž ์™„๋ฃŒ" << endl;
	}

	void introduce();
};

int main()
{
	Person person1(23);
	Person person2(person1);  // ๋ณต์‚ฌ์ƒ์„ฑ์ž ํ˜ธ์ถœ
	// person2 = person1;

	person1.introduce();
	person2.introduce();
}

void Person::introduce()
{
	cout << "๋‚˜์ด : " << age << endl;
}

 

์œ„์˜ ์ฝ”๋“œ
์•„๋ž˜์˜ ์ฝ”๋“œ, ์–•์€ ๋ณต์‚ฌ์˜ ๋ฌธ์ œ

 

 

#include <iostream>
using namespace std;

// ๋””ํดํŠธ ๋ณต์‚ฌ ์ƒ์„ฑ์ž -> ๋ฌธ์ œ ์กด์žฌ
// ์–•์€ ๋ณต์‚ฌ vs ๊นŠ์€ ๋ณต์‚ฌ
// ๋””ํดํŠธ ๋ณต์‚ฌ ์ƒ์„ฑ์ž๋Š” ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋ณต์‚ฌํžˆ๊ธฐ์—,
// ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Ÿ๊ฐ’์„ ๋ณต์‚ฌํ•˜๊ฒŒ ๋จ  -> ๋ฌธ์ œ ๋ฐœ์ƒ

// ์•„๋ž˜์˜ ์ฝ”๋“œ ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜ ๋ฐœ์ƒ
// - ๋ณต์‚ฌ ์ƒ์„ฑ์ž ํ˜ธ์ถœ์— ์˜ํ•ด ๋ฉค๋ฒ„ ๋ณ€์ˆ˜ ๊ฐ’ ๋ณต์‚ฌ์ธ ์–•์€ ๋ณต์‚ฌ๊ฐ€ ์ง„ํ–‰
// - person1 ๊ฐ์ฒด์˜ name ํฌ์ธํ„ฐ์˜ ๊ฐ’์ธ '์ฃผ์†Œ1'์ด person์˜ name ํฌ์ธํ„ฐ ๊ฐ’์œผ๋กœ ๋ณต์‚ฌ
// - ์ฆ‰ ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๊ฐ€๋ฅดํ‚ค๊ฒŒ ๋จ
// - ์†Œ๋ฉธ์ž๊ฐ€ ํ˜ธ์ถœ๋จ์— ๋”ฐ๋ผ (์†Œ๋ฉธ์ž๋Š” ์—ญ์ˆœ์œผ๋กœ ํ˜ธ์ถœ๋จ) person2 ๊ฐ์ฒด ์†Œ๋ฉธ
// - ์ด์–ด person1์˜ ์†Œ๋ฉธ์ž ํ˜ธ์ถœ๋˜๋ ค๋Š” ์ฐฐ๋‚˜ delete๋˜์–ด์•ผ ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด ์—†์–ด ์˜ค๋ฅ˜

// => ๊นŠ์€ ๋ณต์‚ฌ์˜ ํ•„์š”
// -> ๋ณต์‚ฌ ์ƒ์„ฑ์ž์˜ ์žฌ์ •์˜ ํ•„์š”
// -> ํฌ์ธํ„ฐ์˜ ๊ฐ’๋งŒ์„ ๋ณต์‚ฌํ•˜๋Š”๊ฒŒ ์•„๋‹Œ,
//  ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ ๋‚ด์šฉ๊นŒ์ง€ ๋ณต์‚ฌํ•ด์•ผ ํ•จ
// => ์ฃผ์„ ํ’€๊ณ  ์‹คํ–‰

class Person {
private:
	char* name;
public:
	Person(const char* name)   //์ƒ์„ฑ์ž
	{
		this->name = new char[strlen(name) + 1];
		strcpy_s(this->name, strlen(name) + 1, name);
		cout << "Person::Person(name) ์ƒ์„ฑ์ž ์™„๋ฃŒ" << endl;
	}

	Person()
	{
		cout << "Person::Person() ์ƒ์„ฑ์ž ์™„๋ฃŒ" << endl;
	}

	~Person() // ์†Œ๋ฉธ์ž
	{
		delete[] name;
		cout << "Person::~Person ์†Œ๋ฉธ์ž ์™„๋ฃŒ" << endl;
	}

	/*
	Person(const Person& p)
	{
		this->name = new char[strlen(p.name) + 1];    // nameํฌ์ธํ„ฐ ๊ฐ’์„ ์œ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ƒˆ๋กœ ํ• ๋‹น
		strcpy_s(this->name, strlen(p.name) + 1, p.name);  // ๋ฉ”๋ชจ๋ฆฌ์— ๋ณต์‚ฌ
		cout << "Person::Person(cosnt Person&) ๋ณต์‚ฌ์ƒ์„ฑ์ž ์™„๋ฃŒ" << endl;
	}
	*/

	void introduce();
};

int main()
{
	Person person1("์ฃผ๋…ธ");
	Person person2(person1);  // ๋ณต์‚ฌ์ƒ์„ฑ์ž ํ˜ธ์ถœ
	// person2 = person1;

	person1.introduce();
	person2.introduce();
}

void Person::introduce()
{
	cout << "์ด๋ฆ„ : " << name << endl;
}