ํฌ์ŠคํŠธ

C++

C++

๐Ÿ’ซ Modern C++ (VS Old C++)


  • ์ž๋™ ํƒ€์ž… ์ถ”๋ก  (auto ํ‚ค์›Œ๋“œ ์‚ฌ์šฉ)
  • ๋ฒ”์œ„ ๊ธฐ๋ฐ˜ ๋ฃจํ”„
  • ๋žŒ๋‹ค์‹
  • ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ
  • ๋ฒกํ„ฐ, ๋ชฉ๋ก ๋ฐ ๋งต๊ณผ ๊ฐ™์€ ํ‘œ์ค€ ํ…œํ”Œ๋ฆฟ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (STL) ์ปจํ…Œ์ด๋„ˆ
  • STL ์•Œ๊ณ ๋ฆฌ๋“ฌ
  • std::string ๋ฐ std::wstring ํ˜•์‹
  • ์˜ค๋ฅ˜ ์กฐ๊ฑด์„ ๋ณด๊ณ ํ•˜๊ณ  ์ฒ˜๋ฆฌํ•˜๋Š” ์˜ˆ์™ธ
  • STL std::atomic<> ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž ๊ธˆ ์—†๋Š” ์Šค๋ ˆ๋“œ ๊ฐ„ ํ†ต์‹ 

๐Ÿ’ซ Memo


๐Ÿซง Func, Hack

iter find
string find

find(v.begin(), b.end(), )
s.find(c)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
if (int condition = get_status())

to_string(10);

string::npos == -1  
find ์‹คํŒจ ์‹œ ๋ฆฌํ„ด  

pow sqrt -> cmath  
min max -> algorithm  

[rotate](https://notepad96.tistory.com/59)  

toupper, tolower  
isupper, islower, isdigit, isalpha  

// split ๋Œ€์‹ 
#include <sstream>
stringstream ss(s);  
string word;
while (ss >> word)
{
	cout << word << endl;
}

ceil ceiling ์˜ฌ๋ฆผ  
round ๋ฐ˜์˜ฌ๋ฆผ  
floor floor ๋‚ด๋ฆผ  

vector<T> v2(v1)  

memset(ptr, value, size)  

์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ๋˜์–ด ์žˆ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์— ๋Œ€ํ•˜์—ฌ,  
lower_bound : k <= ์š”์†Œ๊ฐ€ ๋ฐฐ์—ด ๋ช‡ ๋ฒˆ์งธ์— ์ฒ˜์Œ ๋“ฑ์žฅํ•˜๋Š” ์ง€  
upper_bound : k < ์š”์†Œ๊ฐ€ ๋ฐฐ์—ด ๋ช‡ ๋ฒˆ์งธ์— ์ฒ˜์Œ ๋“ฑ์žฅํ•˜๋Š” ์ง€  
iterator๋กœ ๋ฐ˜ํ™˜๋˜๋ฏ€๋กœ ์ž๋ฃŒ๊ตฌ์กฐ ์ฃผ์†Œ๋ฅผ ๋นผ์ฃผ๋ฉด ์ธ๋ฑ์Šค๊ฐ€ ๋‚˜์˜ด  

while(!cin.eof())
	cin >> temp;

while(cin >> temp);

๐Ÿซง auto

1
2
3
4
5
auto add(int x, int y)
{
	return x + y;
}
auto sum = add(5, 6);

๐Ÿซง Function Prototype

1
2
3
4
// ํ•จ์ˆ˜์˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜ (๋งค๊ฐœ๋ณ€์ˆ˜๊ฐœ์ˆ˜, ํƒ€์ž…, ์ˆœ์„œ)  
// ํ•จ์ˆ˜ ์›ํ˜• Function Prototype
int spuare(int n);
int spuare(int);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// & ๋ณ„๋ช…

// ๋ฌธ์ž์—ด \> \< ์‚ฌ์ „์ˆœ ๋น„๊ต  
// ํฌ๋ฉด ์•ž์— ์žˆ๋Š”  

cin.ignore(); // ์—”ํ„ฐํ‚ค ์—†์• ๊ธฐ
getline(cin, s);
get(cin, s);

class Circle
{
	public:
	double calcArea();

	int radius;
	// ...
}

double Circle::calcArea()
{
	// ...
}

๋ฉค๋ฒ„ ํ•จ์ˆ˜ ์ด๋ฆ„ ๊ด€๋ก€์ ์œผ๋กœ ์†Œ๋ฌธ์ž, ๋™์‚ฌ - ๋ช…์‚ฌ/ํ˜•์šฉ์‚ฌ

๋ฉค๋ฒ„ ํ•จ์ˆ˜๋ฅผ ํด๋ž˜์Šค ์™ธ๋ถ€์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ
๋ฉค๋ฒ„ ํ•จ์ˆ˜๋ฅผ ํด๋ž˜์Šค ์™ธ๋ถ€์—์„œ ์ •์˜ํ•˜๋ ค๋ฉด ํ•จ์ˆ˜๋“ค์˜ ์›ํ˜•(ํ”„๋กœํ† ํƒ€์ž…)๋งŒ ์ •์˜ํ•œ๋‹ค.

:: ์—ฐ์‚ฐ์ž๋Š” ์ด๋ฆ„๊ณต๊ฐ„ (namespace)๋ฅผ ์ง€์ •ํ•˜๋Š” ์—ฐ์‚ฐ์ž

1
2
3
int value; // ์„ ์–ธ๊ณผ ์ •์˜
double sqrt (double); // ์„ ์–ธ
double sqrt (double) { /* ... */ } // ์„ ์–ธ๊ณผ ์ •์˜

๋ฉค๋ฒ„ ํ•จ์ˆ˜๋“ค์„ ์™ธ๋ถ€์— ์ •์˜ํ•˜๋Š”๊ฒƒ์€ ๊ทธ ์ž์ฒด๋กœ๋„ ์ƒ๋‹นํ•œ ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค.
์šฐ๋ฆฌ๊ฐ€ ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์ด์œ ๋Š” ์—ฌ๋Ÿฌ ์†Œ์Šค ํŒŒ์ผ์—์„œ ์ด ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ์ด๋‹ค.
๋‹ค๋ฅธ ์†Œ์Šค ํŒŒ์ผ์—์„œ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํด๋ž˜์Šค ์„ ์–ธ์„ ํฌํ•จํ•˜์—ฌ์•ผ ํ•œ๋‹ค.

๋งŒ์•ฝ ํ•˜๋‚˜์˜ ํŒŒ์ผ์— ํด๋ž˜์Šค์— ๋Œ€ํ•œ ๋ชจ๋“  ๊ฒƒ์ด ๋“ค์–ด ์žˆ๋‹ค๋ฉด, ์ƒ๋‹นํ•œ ์–‘์ด ๋  ์ˆ˜ ์žˆ๋‹ค.
๋”ฐ๋ผ์„œ ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์ด ์„ ํ˜ธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํด๋ž˜์Šค๋ฅผ ํ—ค๋” ํŒŒ์ผ๊ณผ ์†Œ์Šค ํŒŒ์ผ๋กœ ๋‚˜๋ˆ„์–ด์„œ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

+ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์€ ํด๋ž˜์Šค์˜ ์ž์„ธํ•œ ๊ตฌํ˜„์—๋Š” ๊ด€์‹ฌ์ด ์—†๋‹ค
ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ ์ •๋ณด๋งŒ ์žˆ์œผ๋ฉด ๋œ๋‹ค.
๊ฐœ๋ฐœ์ž ์ž์‹ ๋„ ํ—ค๋”๋ฅผ ์—ฌ๋Ÿฌ ์†Œ์Šค ํŒŒ์ผ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class SomeClass
{
	int hour;
	int m;
	SomeClass(int h, int n = 0) : hour(h), minute(m); // Initializer List ์ดˆ๊ธฐํ™” ๋ฆฌ์ŠคํŠธ
	{

	}
	SomeClass(int h, int n = 0) : hour{h}, minute{m}; // Initializer List ์ดˆ๊ธฐํ™” ๋ฆฌ์ŠคํŠธ
	{
		
	}
};

//์ƒ์„ฑ์ž
SomeClass a; // X
SomeClass a(10, 25);// Old, ํ•จ์ˆ˜ ์ƒ์„ฑ๊ณผ ํ˜ผ๋™ ๊ฐ€๋Šฅ์„ฑ
SomeClass a { 10, 25 };
SomeClass a = { 10, 25 };

int i { 5 };

๊ฐ์ฒด๋ณต์‚ฌ๋œ๋‹ค
C#์€ ref์œผ๋กœ ๋“ค์–ด๊ฐ€๋Š”๋ฐ
C++์€ & ์ฐธ์กฐ์ž ์—ฐ์‚ฐ์ž ํ•จ์ˆ˜ ์ธ์ˆ˜์—๋‹ค ๋ถ™์—ฌ์•ผ ํ•œ๋‹ค
C์ฒ˜๋Ÿผ ์ฃผ์†Œ๋ฅผ ๋„˜๊ธฐ์ง€ ์•Š์•„๋„ ๋œ๋‹ค

๊ฐ์ฒด ๋ฐฐ์—ด, ๊ฐ์ฒด์— ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๊ฐ€ ์ •์˜ ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค

int* p ํฌ์ธํ„ฐ ์„ ์–ธ์šฉ *
p = &num; ์ฃผ์†Œ ์—ฐ์‚ฐ์ž (์ฐธ์กฐ์ž ์—ฐ์‚ฐ์ž ์•„๋‹˜)
a = *p; ๊ฐ„์ ‘ ์ฐธ์กฐ ์—ฐ์‚ฐ์ž Dereferecing, Indirection

NULL == 0 (์ •์ˆ˜๋กœ ์ธ์‹)
nullptr

๋™์  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น Dynamic Memory Allocation
ํžˆํ”„์— ํ• ๋‹น๋ฐ›๋Š” ๋ฉ”๋ชจ๋ฆฌ

์š”์ฒญ ์‹œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•˜๋ฉด bad_alloc ์˜ค๋ฅ˜ exception

Smart Pointer
๋™์  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ํ›„์— ํ•ด์ œ๋ฅผ ์žŠ์–ด๋„ ์ž๋™์œผ๋กœ ํ•ด์ œ
์ž๋™์œผ๋กœ nullptr ์ดˆ๊ธฐํ™”

1
2
unique_ptr<int> p(new int); // new int : ํฌ์ธํ„ฐ ์ดˆ๊ธฐํ™”
unique_ptr<int[]> p(new int[]);

unique_ptr
์Šค๋งˆํŠธ ํฌ์ธํ„ฐ์˜ ์ผ์ข…
๊ธฐ์กด ํฌ์ธํ„ฐ๋ฅผ ๊ฐ์‹ผ ๊ฐ์ฒด
๊ฐ์ฒด๊ฐ€ ์‚ญ์ œ๋˜๋ฉด, ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„๋„ ํ•ด์ œ
์‹คํ–‰ ์‹œ๊ฐ„์˜ ๋ถ€๋‹ด์ด ์ „ํ˜€ ์—†์–ด์„œ ํƒ€ ์–ธ์–ด GC์— ๋น„ํ•˜๋ฉด ์„ฑ๋Šฅ์˜ ํ–ฅ์ƒ์„ ๊พ€ํ•  ์ˆ˜ ์žˆ๋‹ค

@ TODO
* unique_ptr
ํฌ์ธํ„ฐ์— ๋Œ€ํ•ด ์˜ค์ง ํ•˜๋‚˜์˜ ์†Œ์œ ์ž๋งŒ ํ—ˆ์šฉํ•œ๋‹ค. shared_ptr์ด ํ•„์š”ํ•˜๋‹ค๋Š” ์ ์„ ํ™•์‹คํžˆ ์•Œ์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉํ•œ๋‹ค. ์ƒˆ ์†Œ์œ ์ž๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ณต์‚ฌํ•˜๊ฑฐ๋‚˜ ๊ณต์œ ํ•  ์ˆ˜ ์—†๋‹ค. ๋…ธํ›„๋œ auto_ptr์„ ๋Œ€์ฒดํ•œ๋‹ค.

* shared_ptr
์ฐธ์กฐ ํšŸ์ˆ˜๊ฐ€ ๊ณ„์‚ฐ๋˜๋Š” ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ. ์›์‹œ ํฌ์ธํ„ฐ ํ•˜๋‚˜๋ฅผ ์—ฌ๋Ÿฌ ์†Œ์œ ์ž์—๊ฒŒ ํ• ๋‹นํ•˜๋ ค๊ณ  ํ•  ๊ฒฝ์šฐ ์‚ฌ์šฉํ•œ๋‹ค. ์›์‹œ ํฌ์ธํ„ฐ๋Š” ๋ชจ๋“  shared_ptr ์†Œ์œ ์ž๊ฐ€ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๊ฑฐ๋‚˜ ์†Œ์œ ๊ถŒ์„ ํฌ๊ธฐํ•  ๋•Œ๊นŒ์ง€ ์‚ญ์ œ๋˜์ง€ ์•Š๋Š”๋‹ค.

1
2
3
4
5
6
const int *p1; // ํฌ์ธํ„ฐ๋ฅผ ํ†ตํ•ด ์ฐธ์กฐ๋˜๋Š” ๊ฐ’์ด ๋ฐ”๋€” ์ˆ˜ ์—†์Œ
int* const p2; // ์ƒ์ˆ˜ ํฌ์ธํ„ฐ, ์ฐธ์กฐํ•˜๋Š” ๊ฐ’์ด ๋ฐ”๋€” ์ˆ˜๋Š” ์žˆ์ง€๋งŒ, ์ฐธ์กฐํ•˜๋Š” ์ฃผ์†Œ๊ฐ€ ๋ฐ”๋€” ์ˆ˜ ์—†์Œ
const int* const p3; // ์ฐธ์กฐ ๊ฐ’๋„, ์ฐธ์กฐํ•˜๋Š” ์ฃผ์†Œ๊ณ  ๋ฐ”๋€” ์ˆ˜ ์—†์Œ

// const ~ * ๊ฐ์ฒด ๋ถˆ๋ณ€
// * ~ const ํฌ์ธํ„ฐ ์ž์ฒด ๋ถˆ๋ณ€
1
2
3
4
5
6
7
8
9
10
int getRadius() const
{
	return radius;
}
// ํ•จ์ˆ˜์•ˆ์—์„œ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ๊ธˆ์ง€๋จ

const SomeClass *pConstObj = new SomeClass();
pConstObj.getRaius();
// const ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ๋Š”, const ํ•จ์ˆ˜๋งŒ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค. (์ผ๋ฐ˜ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ถˆ๊ฐ€๋Šฅ)
}
1
2
3
4
5
6
7
8
9
10
11
12
#include <utility>
pair<int, int> p;

{
	pair<int, int> p = make_pair(10, 13);
	pair<int, int> p = {4, 6}; // C++11
}

p.first
p.second

if (p1 < p2>) // ์•ž์ชฝ ๋’ค์ชฝ ๋น„๊ต
1
2
3
4
5
6
7
void Some(Pizza *p) { /* ... */ }
Some(&newP);

void Some(Pizza &p) { /* ... */ }
Some(newP);

// ์ด๊ฑฐ๋‚˜ ์ €๊ฑฐ๋‚˜

๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๊ฐ์ฒด๋ฅผ ๋„˜๊ธฐ๋ฉด, ํ•จ์ˆ˜ ํŒŒํŠธ์—์„œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ํ•ด๋‹น ๊ฐ์ฒด์˜ ๋‚ด์šฉ์„ ๋ณต์‚ฌํ•ด์„œ ์ƒ์„ฑ๋œ๋‹ค
๋”ฐ๋ผ์„œ ์ผ๋ฐ˜์ ์ธ ์ƒ์„ฑ์ž๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ณต์‚ฌ ์ƒ์„ฑ์ž Copy Constructor ๋ผ๋Š” ํŠน๋ณ„ํ•œ ์ƒ์„ฑ์ž๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค
๊ธฐ๋ณธ์ ์ธ ๋ฒ„์ „์€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉ

ํ•จ์ˆ˜์—์„œ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•  ๋•Œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€
return ์œผ๋กœ ๋„˜๊ธด ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ๋ฐ˜ํ™˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

  • ๊ฐ™์€ ์ข…๋ฅ˜์˜ ๊ฐ์ฒด๋กœ ์ดˆ๊ธฐํ™” ํ•˜๋Š” ๊ฒฝ์šฐ
    • MyClass obj(obj2);
  • ๊ฐ์ฒด๋ฅผ ํ•จ์ˆ˜์— ์ „๋‹ฌํ•˜๋Š” ๊ฒฝ์šฐ
  • ํ•จ์ˆ˜๊ฐ€ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ
1
2
3
4
5
6
// ๋ณต์‚ฌ ์ƒ์„ฑ์ž
MyClass ( const MyClass& other)
{ // other๋กœ ํ˜„์žฌ ๊ฐ์ฒด๋ฅผ ์ดˆ๊ธฐํ™” }

MyClass (MyClass other)
// ์ด๊ฑด ๋ฌดํ•œ ๋ฃจํ”„๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ด€๊ณ„๋กœ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋œ๋‹ค
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class MyArray
{
	public:
	int size;
	int* data;

	MyArray(int size)
	{
		this->size = size;
		data = new int[size];
	}

	~MyArrat()
	{
		if (data != NULL) delete[] this->data;
	}
};

int main()
{
	MyArray buffer(10);
	buffer.data[0] = 1;
	
	{
		MyArray clone = buffer;
	} 
	buffer.data[0] = 2; // ์ด๋•Œ ์˜ค๋ฅ˜ ๋ฐœ์ƒ
	// ๊ธฐ๋ณธ ๋ณต์‚ฌ ์ƒ์„ฑ์ž๋กœ buffer์˜ ๊ฐ’์ด clone์— ๋ณต์‚ฌ๊ฐ€ ๋˜๋Š”๋ฐ (์–•์€ ๋ณต์‚ฌ Shallow Copy)
	// ์ด๋•Œ data์˜ ๊ฒฝ์šฐ ๋˜‘๊ฐ™์€ ์ฃผ์†Œ๊ฐ€ ๋ณต์‚ฌ๋จ (์ƒˆ๋กœ ๊ณต๊ฐ„์ด ํ• ๋‹น๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋™์ผํ•œ ๊ณต๊ฐ„์„ buffer์™€ clone์ด ๊ณต์œ ํ•˜๋ฉฐ ๋™์‹œ์— ๊ฐ€๋ฆฌํ‚ค๋Š”)
	// clone์ด { } ์„ ๋„˜์–ด ํŒŒ๊ดด์ž๊ฐ€ ํ˜ธ์ถœ๋ ๋•Œ data๋ฅผ ํ• ๋‹น ํ•ด์ œ(๋ฐ˜๋‚ฉ)ํ•˜๋Š”๋ฐ
	// buffer์™€ clone์ด ๊ฐ€๋ฆฌํ‚ค๋Š” data ์ฃผ์†Œ๊ฐ€ ๋˜‘๊ฐ™์Œ์œผ๋กœ
	// buffer์—์„œ data์— ์ ‘๊ทผํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ด๋ฏธ ํ•ด์ œ๋œ ์ฃผ์†Œ๋ผ ์˜ค๋ฅ˜๊ฐ€ ์ƒ๊น€

	return 0;
}
1
2
3
4
5
6
7
8
// ์ด๋Ÿฐ ๊ฒฝ์šฐ ์ง์ ‘ ๊ตฌํ˜„ํ•ด์ฃผ๋ฉด ๋จ
MyArray::MyArrat(const MyArray& other)
{
	this->size = other.size;
	this->data = new int[other.size];
	for (int i = 0; i < size; i ++)
		this->data[i] = other.data[i];
}

์ตœ์‹  ๋ฒ„์ „ C++์—์„œ๋Š” shared_ptr์„ ์ด์šฉํ•ด์„œ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ
์ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๊ฐ์ฒด๋“ค์ด ๋™์ผํ•œ ๋™์  ๋ฐ์ดํ„ฐ๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค
๋งŒ์•ฝ ์นด์šดํŠธ ๊ฐ’์ด 0์ด ๋˜๋ฉด ๋™์  ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ญ์ œ๋œ๋‹ค

1
2
3
4
5
6
7
8
9
10
11
// ๋ณต์‚ฌ ์ƒ์„ฑ์ž vs ๋Œ€์ž… ์—ฐ์‚ฐ์ž
// ์ด๋ฏธ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฅธ ๊ฐ์ฒด์— ๋ณต์‚ฌํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ํ˜ธ์ถœ๋˜์ง€ ์•Š์Œ, ์ด๋•Œ๋Š” ๋Œ€์ž… ์—ฐ์‚ฐ์ž๊ฐ€ ์ ์šฉ๋œ๋‹ค

MyArray buffer1(20);
MyArray buffer2(30);
buffer2 = buffer1; // ์ด๊ฒƒ์€ ๋Œ€์ž… ์—ฐ์‚ฐ

MyArray s1; // ์ผ๋ฐ˜ ์ƒ์„ฑ์ž
MyArray s2 = s1; // ๋ณต์‚ฌ ์ƒ์„ฑ์ž
MyArray s2(s1); // ๋ณต์‚ฌ ์ƒ์„ฑ์ž
MyArray s2{s1}; // ๋ณต์‚ฌ ์ƒ์„ฑ์ž

๋Œ€์ž… ์—ฐ์‚ฐ์ž ์—ญ์‹œ ๋ชจ๋“  ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ๋ณต์‚ฌ๋œ๋‹ค
๊ฐ™์€ ํƒ€์ž…์˜ ๊ฐ์ฒด ๋ผ๋ฆฌ๋Š” ๋Œ€์ž… ์—ฐ์‚ฐ์ด ๊ฐ€๋Šฅํ•˜๋‹ค
C++์—์„œ๋Š” ๋Œ€์ž… ์—ฐ์‚ฐ์ž๋ฅผ ๊ฐœ๋ฐœ์ž๊ฐ€ ์žฌ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค

== ์—ฐ์‚ฐ์ž๋Š” ์—ฐ์‚ฐ์ž ์ค‘๋ณต (Operator Overloading)์ด๋ผ๋Š” ๋ฉ”์นด๋‹ˆ์ฆ˜์„ ํ†ตํ•ด ์žฌ์ •์˜ํ•ด์ค˜์•ผ ํ•œ๋‹ค

๊ฐ์ฒด ์ง€ํ–ฅ์—์„œ ์ฝ”๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

  1. is-a ๊ด€๊ณ„ : ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ is-a์˜ ๊ฐœ๋…์€ ์ƒ์†์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ๋‹ค. โ€œA๋Š” B์œ ํ˜•์˜ ๋ฌผ๊ฑดโ€ ์ด๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค. Apple์€ ๊ณผ์ผ์˜ ์ผ์ข…, Car๋Š” ์ž๋™์ฐจ์˜ ์ผ์ •
  2. has-a ๊ด€๊ณ„ : has-a๋Š” ํ•˜๋‚˜์˜ ๊ฐ์ฒด๊ฐ€ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ด€๊ณ„์ด๋‹ค. Car์—๋Š” Engine์ด ์žˆ๊ณ , House์—๋Š” Bathroom์ด ์žˆ๋‹ค.

์ •์  ๋ณ€์ˆ˜ Static Variable

1
2
3
4
5
6
7
8
9
10
11
12
13
class Circle
{
	static int count;
	const static int MAX_CIRCLES = 300;
	static int getCount()
	{
		return count;
	}
}

// ์ดˆ๊ธฐํ™”๋Š” ํด๋ž˜์Šค ์™ธ๋ถ€์—์„œ
int Circle::count = 0;
Circle::getCount();

๐Ÿ’ซ ์—ฐ์‚ฐ์ž ์ค‘๋ณต


์—ฐ์‚ฐ์ž ์ค‘๋ณต (Operator Overloading)
์ผ์ข…์˜ ๋‹คํ˜•์„ฑ ๊ธฐ๋ฒ•
string์—์„œ ์—ฐ์‚ฐ์ž ์ค‘๋ณต์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค +,-, &, /, =, ==, !=, ++, -- ๋“ฑ

์ค‘๋ณตํ•  ์ˆ˜ ์—†๋Š” ์—ฐ์‚ฐ์ž
:: ๋ฒ”์œ„์ง€์ • ์—ฐ์‚ฐ์ž, . ๋ฉค๋ฒ„ ์„ ํƒ ์—ฐ์‚ฐ์ž, .* ๋ฉค๋ฒ„ ํฌ์ธํ„ฐ ์—ฐ์‚ฐ์ž, ?: ์กฐ๊ฑด์—ฐ์‚ฐ์ž

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
๋ฐ˜ํ™˜ํ˜• operator์—ฐ์‚ฐ์ž(๋ฉค๋ฒ„ ๋ณ€์ˆ˜ ๋ชฉ๋ก)
{
	// ...
}

MyVector MyVector::operator+(const MyVector& v2)
{
	MyVector v;
	v.x = this->x + v2.x;
	v.y = this->y + v2.y;
	return v;
}

bool operator== (Time &t2)
{
	return blabla;
}

bool operator!= (Time &t2)
{
	return !(*this == t2);
}

// ++counter
Counter& operator++()
{
	// blabla
	return *this;
}

// counter++
const Counter operator++(int i)
{
	Counter temp = { *this }; // ํ˜„์žฌ ์ƒํƒœ ์ €์žฅ
	// blabla
	return temp;
} 
// const ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ์— ๋ฐ˜ํ™˜๋œ ์ž„์‹œ ๊ฐ์ฒด๋Š” ๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€๋Šฅ
// (v++)++; ์˜ค๋ฅ˜
// ++(++v); OK

๋Œ€์ž… ์—ฐ์‚ฐ์ž๋„ ์—ฐ์‚ฐ์ž ์ค‘๋ณต์„ ํ†ตํ•˜์—ฌ ์ด๋ฃจ์–ด์ง„๋‹ค
๋Œ€์ž… ์—ฐ์‚ฐ์ž์˜ ๊ฒฝ์šฐ, ๊ฐœ๋ฐœ์ž๊ฐ€ ์ค‘๋ณตํ•˜์ง€ ์•Š์•˜๋”๋ผ๋„ ๊ธฐ๋ณธ ๋Œ€์ž… ์—ฐ์‚ฐ์ž๊ฐ€ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๊ณ  ์ด๊ฒƒ์„ ํ†ตํ•˜์—ฌ ๊ฐ์ฒด ๊ฐ„์˜ ๋Œ€์ž… ์—ฌ์‚ฐ์ด ์ด๋ฃจ์–ด์ง„๋‹ค.
๊ธฐ๋ณธ ๋Œ€์ž… ์—ฐ์‚ฐ์ž๋Š” ๋‹จ์ˆœํžˆ ํ•œ ๊ฐ์ฒด์˜ ๋ชจ๋“  ๋ฉค๋ฒ„๋“ค์„ ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ ๋ณต์‚ฌํ•œ๋‹ค

์ฃผ์˜
๋Œ€์ž… ์—ฐ์‚ฐ์ž์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ƒ์ˆ˜ ์ฐธ์กฐ์ž์ด์ง€๋งŒ ์ฝ”๋“œ์— ๋”ฐ๋ผ์„œ ๊ทธ๋ƒฅ ๊ฐ์ฒด์ด๊ฑฐ๋‚˜ ์ƒ์ˆ˜๊ฐ€ ์•„๋‹Œ ์ฐธ์กฐ์ž์ผ ์ˆ˜ ์žˆ๋‹ค
์ด ๊ฒฝ์šฐ์—๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•˜์—ฌ ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ์ ์ ˆํ•˜๊ฒŒ ๋ณ€ํ•œ๋œ๋‹ค
์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์œผ๋ ค๋ฉด ๋Œ€์ž… ์—ฐ์‚ฐ์ž๋Š” ๋ฐ˜๋“œ์‹œ ๋ฉค๋ฒ„ ํ•จ์ˆ˜์ด์–ด์•ผ ํ•œ๋‹ค

1
2
3
4
5
6
7
Box& operator=(const Box& b2)
{
	this->length = b2.length;
	this->width = b2.width;
	this->height = b2.height;
	return *this;
}

๋ฐ˜ํ™˜๊ฐ’์— ์ฃผ์˜.
๋Œ€์ž… ์—ฐ์‚ฐ์ž๋Š” ์ฐธ์กฐ์ž๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ์•ผ ํ•œ๋‹ค. ๋Œ€์ž… ์—ฐ์‚ฐ์ž๋Š” ์—ฐ์†ํ•˜์—ฌ ์ ์šฉ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค
b3 = b2 = b1;

์ธ๋ฑ์Šค ์—ฐ์‚ฐ์ž []์€ ๋ฒˆํ˜ธ๋ฅผ ๊ฐ€์ง€๊ณ  ํ•ด๋‹น๋˜๋Š” ์š”์†Œ๋ฅผ ์ฐพ๋Š” ์—ฐ์‚ฐ์ž
์ธ๋ฑ์Šค ์ค‘๋ณต ์ •์˜ํ•˜์—ฌ ๋ฐฐ์—ด์˜ ๊ฒฝ๊ณ„์—์„œ ๋ฒ—์–ด๋‚˜๋Š” ๊ฒƒ์„ ๋ง‰๋Š”๋‹ค๋˜์ง€?

1
2
3
4
someType &operator[](int i)
{
	return blabla;
}

ํฌ์ธํ„ฐ ์—ฐ์‚ฐ์ž์˜ ์ค‘๋ณต
ํฌ์ธํ„ฐ์™€ ๊ด€๋ จ๋œ ๋‘ ๊ฐ€์ง€์˜ ์—ฐ์‚ฐ์ž์ธ *๊ณผ ->๋„ ์ค‘๋ณต์ด ๊ฐ€๋Šฅํ•˜๋‹ค
ํŠนํžˆ ์ด ๋‘ ์—ฐ์‚ฐ์ž๋ฅผ ์ค‘๋ณตํ•˜๋ฉด ํฌ์ธํ„ฐ์™€ ๋น„์Šทํ•œ ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค
๋‘ ์—ฐ์‚ฐ์ž ๋ชจ๋‘ ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค

1
2
int* operator->() const { return p; }
int& operator*() const { return *p; }

์ด๋Ÿฐ ํฌ์ธํ„ฐ๊ฐ€ ๊ทธ๋ƒฅ ํฌ์ธํ„ฐ๋ณด๋‹ค ๋‚˜์€ ์ 
์†Œ๋ฉธ์ž์—์„œ ๋งŒ์•ฝ ํฌ์ธํ„ฐ๊ฐ€ ์†Œ๋ฉธ๋˜๋ฉด ๋™์  ํ• ๋‹น ๋ฐ›์€ ๊ณต๊ฐ„๋„ ๋ฐ˜๋‚ฉํ•˜๊ฒŒ ๋˜์–ด ์žˆ๋‹ค
์‚ฌ์šฉ์ž๊ฐ€ ๋™์  ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๋ฐ˜๋‚ฉํ•  ํ•„์š”๊ฐ€ ์—†์–ด์ง€๋Š” ๊ฒƒ์ด๋‹ค

์ด๋ ‡๊ฒŒ ํฌ์ธํ„ฐ ์—ฐ์‚ฐ ์ค‘๋ณต ์ •์˜๋ฅผ ์ด์šฉํ•ด ๋งŒ๋“ค์–ด์ง„ ํ–ฅ์ƒ๋œ ํฌ์ธํ„ฐ๋ฅผ ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ ๋ผ๊ณ  ํ•œ๋‹ค
์ตœ์‹  C++์—์„œ๋Š” ์ด๋Ÿฌํ•œ ์—ฐ์‚ฐ์ž ์ค‘๋ณต ์ •์˜์™€ ํ…œํ”Œ๋ฆฟ์„ ์ด์šฉํ•˜์—ฌ ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ๋“ค์„ ์ •์‹์œผ๋กœ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค
์Šค๋งˆํŠธ ํฌ์ธํ„ฐ๋Š” ํฌ์ธํ„ฐ์™€ ๊ฐ™์ด ๋™์ž‘ํ•˜๋ฉด์„œ ๊ฐ์ฒด๊ฐ€ ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ๋ฅผ ํ†ตํ•˜์—ฌ ์ ‘๊ทผ๋  ๋•Œ๋งˆ๋‹ค ํ•„์š”ํ•œ ์–ด๋–ค ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฐ์ฒด์ด๋‹ค

unique_ptr๋Š” ์—ฐ์‚ฐ์ž ์ค‘๋ณต๊ณผ ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•ด์„œ ๋งŒ๋“  ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ
C++11 ๋„์ž…
๊ธฐ์กด ํฌ์ธํ„ฐ ๊ฐ์‹ธ์„œ ๊ฐ์ฒด๋กœ ๋งŒ๋“ ๋‹ค
๊ฐ์ฒด์— ์†Œ๋ฉธ์ž๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ์„œ ๊ฐ์ฒด๊ฐ€ ์†Œ๋ฉธ๋  ๋•Œ, ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„๋„ ํ•ด์ œํ•œ๋‹ค
์Šค๋งˆํŠธ ํฌ์ธํ„ฐ๋Š” ์‹คํ–‰ ์‹œ๊ฐ„์˜ ๋ถ€๋‹ด์ด ์ „ํ˜€ ์—†์–ด์„œ ์ž๋ฐ”๋‚˜ C#์˜ ์“ฐ๋ ˆ๊ธฐ ์ˆ˜์ง‘๊ธฐ์— ๋น„ํ•˜๋ฉด ์„ฑ๋Šฅ์˜ ํ–ฅ์ƒ์„ ๊พ€ํ•  ์ˆ˜ ์žˆ๋‹ค

1
2
3
4
5
6
7
int main()
[
	unique_ptr<int> p(new int);
	*p = 99;
	// ์—ฌ๊ธฐ์„œ ์ง€์—ญ๋ณ€์ˆ˜์ธ p๊ฐ€ ์‚ญ์ œ๋˜๋ฉด์„œ ์†Œ๋ฉธ์ž๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ  ์†Œ๋ฉธ์ž์—์„œ
	// ๋™์  ๋ฉ”๋ชจ๋ฆฌ๋„ ํ•จ๊ป˜ ์‚ญ์ œํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค
]

unique_ptr์—๋Š” ํ…œํ”Œ๋ฆฟ ๊ธฐ์ˆ ์ด ์ถ”๊ฐ€๋˜์–ด ์žˆ๋‹ค
ํ…œํ”Œ๋ฆฟ์€ ์ž๋ฃŒํ˜•๋„ ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ๋งŒ๋“ค์–ด์„œ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ธฐ๋ฒ•
์Šค๋งˆํŠธ ํฌ์ธํ„ฐ๋Š” ๊ทผ๋ณธ์ ์œผ๋กœ ๊ฐ์ฒด๋กœ ํฌ์ธํ„ฐ๋ฅผ ๊ฐ์‹ธ๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ฒด๊ฐ€ ์†Œ๋ฉธ๋˜๋ฉด ์†Œ๋ฉธ์ž๊ฐ€ ํ˜ธ์ถœ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์†Œ๋ฉธ์ž์—์„œ ํ• ๋‹น๋ฐ›์€ ๋™์  ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋‹ค
์ž๋ฐ”์™€ ๊ฐ™์€ ์–ธ์–ด์™€ ์ฐจ์ด์ ์ด๋ผ๋ฉด C++์—์„œ๋Š” ๋ณ„๋„์˜ GC๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ
๋™์  ๋ฉ”๋ชจ๋ฆฌ๋Š” ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ๋ชจ๋‘ ์•ˆ์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์‹คํ–‰๋  ๋•Œ๋Š” ์“ฐ๋ ˆ๊ธฐ ์ˆ˜์ง‘๊ธฐ๊ฐ€ ์—†์–ด๋„ ๋˜๊ณ  ์‹คํ–‰ ์†๋„๊ฐ€ ๋นจ๋ผ์ง„๋‹ค

๐Ÿ’ซ ํ”„๋ Œ๋“œ


ํ”„๋ Œ๋“œ
์™ธ๋ถ€์˜ ํด๋ž˜์Šค๋‚˜ ํ•จ์ˆ˜๊ฐ€ ์ž์‹ ์˜ ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ—ˆ๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค
ํ”„๋ Œ๋“œ๋Š” ์ „์—ญํ•จ์ˆ˜์ผ์ˆ˜๋„ ์ž‡๊ณ  ์–ด๋–ค ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„ ํ•จ์ˆ˜ ์ผ์ˆ˜๋„ ์žˆ๊ณ  ์•„๋‹ˆ๋ฉด ์ „์ฒด ํด๋ž˜์Šค์ผ ์ˆ˜๋„ ์žˆ๋‹ค
ํŠน์ •ํ•œ ํด๋ž˜์Šค๋ฅผ ํ”„๋ Œ๋“œ๋กœ ์ง€์ •ํ•˜๋ฉด ๊ทธ ํด๋ž˜์Šค์˜ ๋ชจ๋“  ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋Š” ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค
ํ•˜๋‚˜์˜ ์˜ˆ๋กœ ํŠน์ •ํ•œ ํ•จ์ˆ˜๋ฅผ ํ”„๋ Œ๋“œ๋กœ ์ง€์ •ํ•˜์—ฌ ๋ณด์ž
ํ”„๋ Œ๋“œ๋ฅผ ์„ ์–ธํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํด๋ž˜์Šค ์•ˆ์— ํ”„๋ Œ๋“œ๋กœ ์ง€์ •ํ•˜๊ณ  ์‹ถ์€ ํ•จ์ˆ˜์˜ ์›ํ˜•์„ ์ ๊ณ  ์›ํ˜• ์•ž์— friend ๋ผ๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์ธ๋‹ค

1
2
3
4
class MyClass
{
	friend void sub();
};

ํ”„๋ Œ๋“œ ํ•จ์ˆ˜ ์„ ์–ธ์€ ํด๋ž˜์Šค ์•ˆ์˜ ์–ด๋–ค ์œ„์น˜์—์„œ๋„ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ์‹œ์ž‘ ๋ถ€๋ถ„์— ๋‘๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค
ํ”„๋ Œ๋“œ ํ•จ์ˆ˜ ์„ ์–ธ์€ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ public์ด๋‚˜ private์˜ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค
ํ”„๋ Œ๋“œ ํ•จ์ˆ˜์˜ ์›ํ˜•์€ ๋น„๋ก ํด๋ž˜์Šค ์•ˆ์— ํฌํ•จ๋˜์–ด ์žˆ์œผ๋‹ˆ ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋Š” ์•„๋‹ˆ๋ฉด ํ”„๋ Œ๋“œ ํ•จ์ˆ˜์˜ ๋ณธ์ฒด๋Š” ์™ธ๋ถ€์—์„œ ๋”ฐ๋กœ ์ •์˜๋œ๋‹ค
ํ”„๋ Œ๋“œ ํ•จ์ˆ˜๋Š” ํด๋ž˜์Šค ๋‚ด๋ถ€์˜ ๋ชจ๋“  ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์–ด๋–ค ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋„ ํ˜ธ์ถœํ•  ์ˆ˜์žˆ๋‹ค

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class MyClass
{
	int someVar;
	public:
	friend class SomeClass; // SomeClass๋Š” MyClass์˜ ์นœ๊ตฌ๊ฐ€ ๋œ๋‹ค
	friend void SomeFunc(MyClass myClass); // ํ”„๋ Œ๋“œ ์„ ์–ธ
};
void SomeFunc(MyClass myClass) // ํ”„๋ Œ๋“œ ์ •์˜
{
	cout << myClass.someVar;
}

class SomeClass
{
	public:
	void print(MyClass myClass)
	{
		cout << myClass.someVar;
	}
}

ํ”„๋ Œ๋“œ ํ•จ์ˆ˜๋Š” ๋‘ ๊ฐœ์˜ ๊ฐ์ฒด๋ฅผ ๋น„๊ตํ•˜๊ฑฐ๋‚˜ ์—ฐ์‚ฐํ•˜๋Š” ๊ฒฝ์šฐ์— ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค
ํ”„๋ Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์•ฝ๊ฐ„์€ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์šด ๋ฉค๋ฒ„ ํ•จ์ˆ˜ ํ˜•ํƒœ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค

๋ฉค๋ฒ„ํ•จ์ˆ˜์™€ ํ”„๋ Œ๋“œ ํ•จ์ˆ˜๋Š” ๋น„์Šทํ•œ ์—ญํ• ์„ ํ•œ๋‹ค
ํ•จ์ˆ˜๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์ด ์˜ค์ง ํ•˜๋‚˜์˜ ๊ฐ์ฒด์—๋งŒ ๊ด€๋ จ๋œ๋‹ค๋ฉด ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋กœ ์ •์˜
ํ•จ์ˆ˜๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์ด ๋‘ ๊ฐœ ์ด์ƒ์˜ ๊ฐ์ฒด์— ๊ด€๋ จ๋œ๋‹ค๋ฉด ํ”„๋ Œ๋“œ ํ•จ์ˆ˜๋กœ ์ •์˜

๋ฌผ๋ก  ํ•จ์ˆ˜๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์ด ๋‘ ๊ฐœ ์ด์ƒ์˜ ๊ฐ์ฒด์— ๊ด€๋ จ๋˜๋”๋ผ๋„ ์ ‘๊ทผ์ž์™€ ์„ค์ •์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋˜‘๊ฐ™์ด ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค
ํ•˜์ง€๋งŒ ํšจ์œจ์„ฑ์„ ์ƒ๊ฐํ•˜๋ฉด ํ”„๋ Œ๋“œ ํ•จ์ˆ˜๋กœ๋„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค

ํ”„๋ Œ๋“œ ํ•จ์ˆ˜๋‚˜ ํ”„๋ Œ๋“œ ํด๋ž˜์Šค๋Š” ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ค‘์š”ํ•œ ์›์น™, ์ •๋ณด ์€๋‹‰์„ ์†์ƒํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ผญ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ฉด ์‚ฌ์šฉ์„ ์ž์ œํ•˜์—ฌ์•ผ ํ•œ๋‹ค

<<, >> ์—ฐ์‚ฐ์ž ์ค‘๋ณต ์ •์˜
cout << ๊ฐ์ฒด;
cin >> ๊ฐ์ฒด;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
friend ostream& operator<<(ostream& os, const MyVector& v)
{
	// ...
	os << "(" << v.x << "," << v.y << ")" << endl;
	return os;
}

friend istream& operator>>(ostream& in, MyVector& v)
{
	// ...
	in >> v.x >> v.y;
	if (!in)
		v = MyVector(0,0); // ์ž…๋ ฅ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ
	return in;
}

cout์€ ostream ํด๋ž˜์Šค์˜ ๊ฐ์ฒด
๋”ฐ๋ผ์„œ ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋กœ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ostream ํด๋ž˜์Šค ์•ˆ์— operatorยซ() ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ์•ผ ํ•œ๋‹ค
ํ•˜์ง€๋งŒ ostream ํด๋ž˜์Šค๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์†ํ•˜๋ฏ€๋กœ ์šฐ๋ฆฌ๊ฐ€ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค
๋”ฐ๋ผ์„œ ํ”„๋ Œ๋“œ ํ•จ์ˆ˜ ํ˜•ํƒœ๋กœ ๊ฐ์ฒด ํด๋ž˜์Šค ์•ˆ์— ์—ฐ์‚ฐ์ž๋ฅผ ์ค‘๋ณต ์ •์˜ํ•˜๋Š” ์ˆ˜๋ฐ–์— ์—†๋‹ค

๋˜ ํ•˜๋‚˜ ์ฃผ์˜ํ•  ์ ์€ ์—ฐ์‚ฐ์˜ ๊ฒฐ๊ณผ๋กœ ๋ฐ˜๋“œ์‹  ostream ์ฐธ์กฐ์ž๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ 
ostream ์ฐธ์กฐ์ž๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ยซย ์—ฐ์‚ฐ์ž๊ฐ€ ์—ฐ์†์ ์œผ๋กœ ์‚ฌ์šฉ๋˜์—ˆ์„ ๊ฒฝ์šฐ์— ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Œ
cout << ๊ฐ์ฒด << ๊ฐ์ฒด;

>>, cin
์ฃผ์˜ํ•ด์•ผ ํ•  ์ ์€ ๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ const๋กœ ์„ ์–ธํ•˜๋ฉด ์•ˆ๋œ๋‹ค๋Š” ๊ฒƒ
์ž…๋ ฅ ์—ฐ์‚ฐ์ž๋Š” ์ž…๋ ฅ์„ ๋ฐ›์•„์„œ ๊ฐ์ฒด์— ์ €์žฅ๋˜์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ

์ž…๋ ฅ ์—ฐ์‚ฐ์ž๋Š” ์ž…๋ ฅ ์‹œ์— ๋ฐœ์ƒ๋˜๋Š” ์˜ค๋ฅ˜์— ๋Œ€ํ•˜์—ฌ ๋Œ€๋น„๋ฅผ ํ•ด์•ผ ํ•œ๋‹ค
์ž˜๋ชป๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅ๋ฐ›์•˜์„ ๊ฒฝ์šฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๊ณ , ์ด๋•Œ๋Š” ๋ณ€์ˆ˜๋ฅผ ์ดˆ๊ธฐํ™” ์ƒํƒœ๋กœ ๋งŒ๋“ค์–ด ์ฃผ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค
์ž…๋ ฅ ๋‹จ๊ณ„์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด in๋Š” 0์ด ์•„๋‹Œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋œ๋‹ค
๋”ฐ๋ผ์„œ in์ด 0์ด ์•„๋‹Œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋ณ€์ˆ˜์— ์ดˆ๊ธฐํ™”ํ•œ ์ž„์‹œ ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ์ค€๋‹ค

๐Ÿ’ซ ์—ฐ์‚ฐ์ž ์ค‘๋ณต ์‹œ์— ์œ ์˜ํ•  ์ 


  • ์ƒˆ๋กœ์šด ์—ฐ์‚ฐ์ž๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค, i.e. ์ง€์ˆ˜์Šน์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•œ ^ ์—ฐ์‚ฐ์ž๋ฅผ ์ƒˆ๋กญ๊ฒŒ ์ •์˜ํ•  ์ˆ˜ ์—†๋‹ค
  • ๊ฑฐ์˜ ๋ชจ๋“  ์—ฐ์‚ฐ์ž๊ฐ€ ์ค‘๋ณต์ด ๊ฐ€๋Šฅ. ํ•˜์ง€๋งŒ :: .* , ?:๋Š” ๋ถˆ๊ฐ€๋Šฅ
  • ์ค‘๋ณต๋œ ์—ฐ์‚ฐ์ž๋Š” ํด๋ž˜์Šค ํƒ€์ž…์˜ ํ”ผ์—ฐ์‚ฐ์ž๋ฅผ ๋ฐ˜๋“œ์‹œ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค. ์ฆ‰ ๋‚ด์žฅ๋œ intํ˜•์ด๋‚˜ doubleํ˜•์— ๋Œ€ํ•œ ์—ฐ์‚ฐ์ž์˜ ์˜๋ฏธ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜๋Š” ์—†๋‹ค.
  • ์—ฐ์‚ฐ์ž๋“ค์˜ ์šฐ์„ ์ˆœ์œ„๋‚˜ ๊ฒฐํ•ฉ ๋ฒ•์น™์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค
  • ๋งŒ์•ฝ +์—ฐ์‚ฐ์ž๋ฅผ ์ค‘๋ณตํ•˜์˜€๋‹ค๋ฉด ์ผ๊ด€์„ฑ์„ ์œ„ํ•ด์„œ - += -= ์—ฐ์‚ฐ์ž๋„ ์ค‘๋ณตํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค

๐Ÿ’ซ ์ƒ์†


1
2
3
4
5
6
7
8
9
class ChildClass : ์ ‘๊ทผ์ง€์ •์ž ParentClass { }

// ์ ‘๊ทผ์ง€์ •์ž๊ฐ€
// public์ด๋ฉด ๊ทธ๋Œ€๋กœ
// protected๋ฉด ์ƒ์† ๋ฐ›๋Š” public ๋ฉค๋ฒ„๋“ค์ด protected๋กœ
// private์ด๋ฉด ์ƒ์† ๋ฐ›๋Š” ๋ชจ๋“  ๋ฉค๋ฒ„๋“ค์ด private์œผ๋กœ

class ChildClass : ์ ‘๊ทผ์ง€์ •์ž ParentClass, ์ ‘๊ทผ์ง€์ •์ž ParentClass { }
// ๋˜‘๊ฐ™์€ ์ด๋ฆ„์˜ ๋ฉค๋ฒ„๊ฐ€ ์žˆ์œผ๋ฉด ์ž์‹๊ฐ์ฒด.ParentClass:๋ฉค๋ฒ„

์ƒ์†์„ ๋‚˜ํƒ€๋‚ผ ๋•Œ ํ™•์žฅ Extend ๋˜๋Š” ํŒŒ์ƒ Derive ์ด๋ผ๋Š” ์šฉ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋„ ์ƒ์† ์‹œ ๋ฉค๋ฒ„๊ฐ€ ์ฆ๊ฐ€ํ•˜๊ธฐ ๋•Œ๋ฌธ

๋ถ€๋ชจ ํด๋ž˜์Šค == ์ˆ˜ํผ ํด๋ž˜์Šค == ๋ฒ ์ด์Šค ํด๋ž˜์Šค
์ž์‹ ํด๋ž˜์Šค == ์„œ๋ธŒ ํด๋ž˜์Šค == ํŒŒ์ƒ๋œ ํด๋ž˜์Šค (Derived)

๊ณตํ†ต ๋ถ€๋ถ„์„ ํ•œ ๋ฒˆ์—
์ค‘๋ณต๋˜๋Š” ๋ถ€๋ถ„์„ ์ตœ์†Œํ™”
-> ํ•˜๋‚˜๋กœ ์ •๋ฆฌ๋˜์–ด์„œ ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฝ๊ณ  ์œ ์ง€ ๋ณด์ˆ˜์™€ ๋ณ€๊ฒฝ๋„ ์‰ฌ์›Œ์ง„๋‹ค

์ƒ์†์—์„œ ์ž์‹๊ณผ ๋ถ€๋ชจ๋Š” โ€œ~์€ ~์ด๋‹คโ€ ์™€ ๊ฐ™์€ is-a ๊ด€๊ณ„๊ฐ€ ์žˆ๋‹ค
๋”ฐ๋ผ์„œ ์ƒ์†์˜ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค๊ณ„ํ•˜์˜€๋Š”์ง€๋ฅผ ์•Œ๋ ค๋ฉด is-a ๊ด€๊ณ„๊ฐ€ ์„ฑ๋ฆฝํ•˜๋Š”์ง€๋ฅผ ์ƒ๊ฐํ•ด๋ณด๋ฉด ๋œ๋‹ค

๋งŒ์•ฝ โ€œ~์€ ~์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹คโ€ ์™€ ๊ฐ™์€ has-a (ํฌํ•จ) ๊ด€๊ณ„๊ฐ€ ์„ฑ๋ฆฝ๋˜๋ฉด ์ด ๊ด€๊ณ„๋Š” ์ƒ์†์œผ๋กœ ๋ชจ๋ธ๋งํ•˜๋ฉด ์•ˆ๋œ๋‹ค
์ด ๊ฒฝ์šฐ ํ•˜๋‚˜์˜ ํด๋ž˜์Šค์— ๋‹ค๋ฅธ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋ฅผ ํฌํ•จ์‹œํ‚ค๋ฉด ๋œ๋‹ค

์ž์‹์˜ ๊ฐ์ฒด๋Š” ๋ถ€๋ชจ์˜ ๊ฐ์ฒด๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค
์ž์‹ ํด๋ž˜์Šค ๊ฐ์ฒด ์•ˆ์˜ ๋ถ€๋ชจ ํด๋ž˜์Šค ๋ถ€๋ถ„์„ ์ดˆ๊ธฐํ™” ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋„ ํ˜ธ์ถœ๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด ๋…ผ๋ฆฌ์ ์ด๋‹ค
์‹ค์ œ๋กœ ์ž์‹์˜ ์ƒ์„ฑ์ž์—์„œ ์ œ์ผ ๋จผ์ € ํ•˜๋Š” ์ผ์ด ๋ถ€๋ชจ์˜ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ผ์ด๋‹ค
ํŠน๋ณ„ํžˆ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ถ€๋ชจ์˜ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค

์†Œ๋ฉธ์ž์˜ ๊ฒฝ์šฐ ์—ญ์ˆœ์œผ๋กœ ํ˜ธ์ถœ๋œ๋‹ค
์ฆ‰ ์ž์‹์˜ ์†Œ๋ฉธ์ž๊ฐ€ ๋จผ์ € ํ˜ธ์ถœ๋˜๊ณ  ์ด์–ด์„œ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์†Œ๋ฉธ์ž๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค

๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ๋‹ค๋ฅธ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜๋ ค๋ฉด
์ž์‹์˜ ์ƒ์„ฑ์ž ํ—ค๋”์˜ ๋’ค์— ์ฝœ๋ก ์„ ์ถ”๊ฐ€ํ•œ ํ›„์— ์›ํ•˜๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค์˜์ƒ์„ฑ์ž๋ฅผ ์ ์–ด์ฃผ๋ฉด ๋œ๋‹ค

1
2
3
4
5
6
7
8
9
10
11
12
13
14
์ž์‹์ƒ์„ฑ์ž() : ๋ถ€๋ชจ์ƒ์„ฑ์ž()
{

}

์ž์‹์ƒ์„ฑ์ž(int x = 0, int y = 0) : ๋ถ€๋ชจ์ƒ์„ฑ์ž(x, y)
{

}

์ž์‹์ƒ์„ฑ์ž(int x = 0, int y = 0) : ๋ถ€๋ชจ์ƒ์„ฑ์ž(x, y), width(x), height(y)
{

}

C#๊ณผ ๋‹ฌ๋ฆฌ ๊ทธ๋ƒฅ ํ•จ์ˆ˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋งŒ ๋˜‘๊ฐ™์œผ๋ฉด ์žฌ์ •์˜ ๋œ๋‹ค

C#์˜ base.
C++์—์„œ ๋ถ€๋ชจํด๋ž˜์Šค::

๐Ÿ’ซ ๋‹คํ˜•์„ฑ


์ค‘๋ณต ์ •์˜๋‚˜ ์—ฐ์‚ฐ์ž ์ค‘๋ณต ์ •์˜๋„ ํฌ๊ฒŒ ๋ถ„๋ฅ˜ํ•˜๋ฉด ๋‹คํ˜•์„ฑ์— ํฌํ•จ

  • ๋‹คํ˜•์„ฑ
    • ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ๋‹คํ˜•์„ฑ
      • ํ•จ์ˆ˜ ์ค‘๋ณต ์ •์˜
      • ์—ฐ์‚ฐ์ž ์ค‘๋ณต ์ •์˜
    • ์‹คํ–‰ ์‹œ๊ฐ„ ๋‹คํ˜•์„ฑ
      • ๊ฐ€์ƒ ํ•จ์ˆ˜

์‹คํ–‰ ์‹œ๊ฐ„ ๋‹คํ˜•์„ฑ์€ ๊ฐ์ฒด๋“ค์˜ ํƒ€์ž…์ด ๋‹ค๋ฅด๋ฉด ๋˜‘๊ฐ™์€ ๋ฉ”์‹œ์ง€๊ฐ€ ์ „๋‹ฌ๋˜๋”๋ผ๋„ ์„œ๋กœ ๋‹ค๋ฅธ ๋™์ž‘์„ ํ•˜๋Š” ๊ฒƒ
ํ•œ ๊ณณ์— ๋ชจ์ธ ๋™๋ฌผ๋“ค์ด ๊ฐ์ž์˜ ์†Œ๋ฆฌ๋ฅผ ๋‚ด๊ฒŒ ํ•˜๊ณ  ์‹ถ์œผ๋ฉด ์–ด๋–ค ๋™๋ฌผ์ธ์ง€ ์‹ ๊ฒฝ์“ฐ์ง€ ๋ง๊ณ  ๋ฌด์กฐ๊ฑด speak ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋ฉด ๋œ๋‹ค
๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๋Š” ๋™๋ฌผ์€ ์ž์‹ ์ด ๋‚ผ ์ˆ˜ ์žˆ๋Š” ์†Œ๋ฆฌ๋ฅผ ๋‚ผ ๊ฒƒ์ด๋‹ค
๋˜‘๊ฐ™์€ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด์ง€๋งŒ ๊ฐ์ฒด์˜ ํƒ€์ž…์ด ๋‹ค๋ฅด๋ฉด ์„œ๋กœ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์–ป๋Š” ๊ฒƒ์ด ๋‹คํ˜•์„ฑ์ด๋‹ค
์ค‘์š”ํ•œ ๊ฒƒ์€ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋Š” ์ธก์—์„œ๋Š” ๊ฐ์ฒด๊ฐ€ ์–ด๋–ค ํƒ€์ž…์ธ์ง€ ์•Œ ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ
์‹คํ–‰์‹œ๊ฐ„์— ๊ฐ์ฒด์˜ ํƒ€์ž…์— ๋”ฐ๋ผ์„œ ์ž๋™์ ์œผ๋กœ ์ ํ•ฉํ•œ ๋™์ž‘์ด ๊ฒฐ์ •๋œ๋‹ค
๋‹คํ˜•์„ฑ์€ ๊ฐ์ฒด ์ง€ํ–ฅ ๊ธฐ๋ฒ•์˜ ํŠน์ง• ์ค‘์˜ ํ•˜๋‚˜๋กœ์„œ ๋™์ผํ•œ ์ฝ”๋“œ๋กœ ๋‹ค์–‘ํ•œ ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ธฐ์ˆ 

์ƒํ–ฅ ํ˜•๋ณ€ํ™˜ Up-Casting
Animal *pa = new Dog();
์ž์‹ ๊ฐ์ฒด๋Š” ๋ถ€๋ชจ ๊ฐ์ฒด๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž์‹ ๊ฐ์ฒด๋Š” ๋ถ€๋ชจ ๊ฐ์ฒด์ด๊ธฐ๋„ ํ•˜๋‹ค
๋‹คํ˜•์„ฑ์˜ ํ•ต์‹ฌ -> ๋ถ€๋ชจ ํฌ์ธํ„ฐ๋กœ ์ž์‹ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ๋‹ค

๊ธฐ๋ณธ์ ์œผ๋กœ ๋ถ€๋ชจ๋กœ๋ถ€ํ„ฐ ์ƒ์†๋ฐ›์€ ๋ถ€๋ถ„๋งŒ ํฌ์ธํ„ฐ๋ฅผ ํ†ตํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
๋ถ€๋ชจ์˜ ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ƒ ํ•จ์ˆ˜ Virtual Function์œผ๋กœ ์ •์˜ํ•˜๋ฉด ์ƒํ–ฅ ํ˜•๋ณ€ํ™˜์„ ํ†ตํ•œ ํฌ์ธํ„ฐ๋ผ๋„ ๊ฐ์ฒด์˜ ์ข…๋ฅ˜์— ๋”ฐ๋ผ ์„œ๋กœ ๋‹ค๋ฅธ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค

1
virtual void speak() { /* ... */ } // ๋ถ€๋ชจ์—์„œ๋งŒ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค,์ž์‹์€ ๊ทธ๋ƒฅ void speak()์จ๋„ ๋˜๋Š”๋ฐ ์ด์™•์ด๋ฉด ๋˜‘๊ฐ™์ดvirtual ํ‘œ์‹œํ•ด์ฃผ๋ฉด ์ข‹๊ฒ ์ง€

HOW?
ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ํ•จ์ˆ˜์˜ ๋ชธ์ฒด์™€ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์„ ๋ฐ”์ธ๋”ฉ Binding ์ด๋ผ๊ณ  ํ•œ๋‹ค.
๋ฐ”์ธ๋”ฉ์—๋Š” ์ •์  ๋ฐ”์ธ๋”ฉ๊ณผ ๋™์  ๋ฐ”์ธ๋”ฉ์ด ์กด์žฌํ•œ๋‹ค
์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ๋ชจ๋“  ๋ฐ”์ธ๋”ฉ์ด ์™„๋ฃŒ๋˜๋Š” ๊ฒƒ์„ ์ •์  ๋ฐ”์ธ๋”ฉ์ด๋ผ๊ณ  ํ•œ๋‹ค (๋น ๋ฅด๋‹ค, ์ผ๋ฐ˜ ํ•จ์ˆ˜๋ฅผ ๋Œ€์ƒ)
๋ฐ˜๋Œ€๋กœ ๋ฐ”์ธ๋”ฉ์ด ์‹คํ–‰์‹œ๊นŒ์ง€ ์—ฐ๊ธฐ๋˜๊ณ  ์‹คํ–‰์‹œ๊ฐ„์— ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์„ ๋™์  ๋ฐ”์ธ๋”ฉ, ๋˜๋Š” ์ง€์—ฐ Late ๋ฐ”์ธ๋”ฉ์ด๋ผ๊ณ  ํ•œ๋‹ค (ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•˜์—ฌ์„œ ์‹ค์ œ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜๋ฅผ ๊ฒฐ์ •ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋Š๋ฆฌ๋‹ค, ๊ฐ€์ƒ ํ•จ์ˆ˜๋ฅผ ๋Œ€์ƒ)

๋™์  ๋ฐ”์ธ๋”ฉ์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ์ฒด ์ง€ํ–ฅ์˜ ์ค‘์š”ํ•œํŠน์ง• ์ค‘์˜ ํ•˜๋‚˜์ธ ๋‹คํ˜•์„ฑ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค
๊ฐ์ฒด์— ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋ฉด ๊ฐ์ฒด๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ํ•ด์„ํ•˜์—ฌ์„œ ๊ฐ€์žฅ ์ ์ ˆํ•œ ๋™์ž‘์„ ํ•˜๊ฒŒ ํ•œ๋‹ค

C++์—์„œ ๊ฐ€์ƒ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ฉด ๋ชจ๋“  ํ•จ์ˆ˜๊ฐ€ ์ •์  ๋ฐ”์ธ๋”ฉ์œผ๋กœ ํ˜ธ์ถœ๋œ๋‹ค
๊ฐ€์ƒ ํ•จ์ˆ˜ ๊ธฐ๋Šฅ์€ ํฌ์ธํ„ฐ์™€ ์ฐธ์กฐ์ž๋ฅผ ํ†ตํ•ด์„œ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ฐ์ฒด๋ฅผ ํ•จ์ˆ˜์˜ ๊ฐ’์œผ๋กœ ์ „๋‹ฌํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋™์ž‘ํ•˜์ง€ ์•Š๋Š๋‹ค

ํ•˜ํ–ฅ ํ˜•๋ณ€ํ™˜? Down-Casting

1
2
3
4
BassClass *pb = new DerivedClass();
DerivedClass *pd = (DerivedClass *) pb;
// or
DerivedClass *pd = dynamic_cast<DerivedClass*>(pb);

ํฌ์ธํ„ฐ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ฐธ์กฐ์ž๋„ ๋‹คํ˜•์„ฑ์ด ๋™์ผํ•˜๊ฒŒ ์ ์šฉ๋œ๋‹ค

1
2
Dog d;
Animal &a1 = d;

๋‹คํ˜•์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ณผ์ •์—์„œ ์†Œ๋ฉธ์ž๋ฅผ virtual๋กœ ํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด ์ž์‹ ์†Œ๋ฉธ์ž๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š”๋‹ค
์™œ๋ƒํ•˜๋ฉด ์‹ค์ œ๋กœ๋Š” ์ž์‹ ๊ฐ์ฒด์ง€๋งŒ ๋ถ€๋ชจ ํฌ์ธํ„ฐ๋กœ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋ถ€๋ชจ ๊ฐ์ฒด๋กœ ์ƒ๊ฐํ•ด์„œ ๋ถ€๋ชจ ์†Œ๋ฉธ์žํ•œ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด๋‹ค
๋ถ€๋ชจ์˜ ์†Œ๋ฉธ์ž๋ฅผ virtual(๊ฐ€์ƒํ•จ์ˆ˜๋กœ) ์„ ์–ธํ•˜๋ฉด ๋œ๋‹ค

์ˆœ์ˆ˜ ๊ฐ€์ƒ ํ•จ์ˆ˜ pure virtual function๋Š” ํ•จ์ˆ˜ ํ—ค๋”๋งŒ ์กด์žฌํ•˜๊ณ  ํ•จ์ˆ˜์˜ ๋ชธ์ฒด๋Š” ์—†๋Š” ํ•จ์ˆ˜
virtual ๋ฐ˜ํ™˜ํ˜• ํ•จ์ˆ˜์ด๋ฆ„(๋งค๊ฐœ๋ณ€์ˆ˜๋ฆฌ์ŠคํŠธ) = 0;
์ˆœ์ˆ˜ ๊ฐ€์ƒ ํ•จ์ˆ˜๋ฅผ ํ•˜๋‚˜๋ผ๋„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํด๋ž˜์Šค๋ฅผ ์ถ”์ƒ ํด๋ž˜์Šค๋ผ๊ณ  ํ•œ๋‹ค
์ถ”์ƒ ํด๋ž˜์Šค๋กœ๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์—†๋‹ค

๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ, ํฌ์ธํ„ฐ ๋ณ€์ˆ˜๋กœ ์จ์„œ ์ž์‹ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ , ์ถ”์ƒ ํด๋ž˜์Šค์— ์ •์˜๋œ ํ•จ์ˆ˜๋“ค์„ ํ˜ธ์ถœํ•  ์ˆ˜์žˆ๋‹ค

๐Ÿ’ซ ์ž…์ถœ๋ ฅ Stream


์ž…์ถœ๋ ฅ ์žฅ์น˜์— ๋”ฐ๋ผ ์„œ๋กœ ๋‹ค๋ฅด๊ฒŒ ์ฝ”๋“œ๋ฅผ ์งœ์•ผ ํ•œ๋‹ค๋ฉด ์•„์ฃผ ๋ถˆํŽธํ•œ ์ผ์ด ๋  ๊ฒƒ์ด๋‹ค
์ด๋ฅผ ์œ„ํ•ด Stream์ด๋ž€ ๊ฐœ๋…์„ ์‚ฌ์šฉํ•˜๊ณ  ์ž‡๋‹ค
์ž…์ถœ๋ ฅ์€ ๋ชจ๋‘ Stream์œผ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค
Stream์ด๋ž€ ์ž…์ถœ๋ ฅ์„ ๋ฐ”์ดํŠธ๋“ค์˜ ํ๋ฆ„์œผ๋กœ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ด๋‹ค
์ŠคํŠธ๋ฆผ์˜ ์ตœ๋Œ€ ์žฅ์ ์€ ์žฅ์น˜ ๋…๋ฆฝ์„ฑ์ด๋‹ค
์ž…์ถœ๋ ฅ ์žฅ์น˜์— ์ƒ๊ด€์—†์ด ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ

cin ์ด ํ‚ค๋ณด๋“œ์™€ ์—ฐ๊ฒฐ๋œ ์ž…๋ ฅ ์ŠคํŠธ๋ฆผ์ด๋‹ค
cout์€ ์ฝ˜์†”๊ณผ ์—ฐ๊ฒฐ๋œ ์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ

๋””์Šคํฌ <- I/O System -> ๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ
ํŒŒ์ผ(๋ฐ”์ดํŠธ์˜ ์‹œํ€ธ์Šค) <- iostreams -> ๊ฐ์ฒด

  • ofstream ์ถœ๋ ฅํŒŒ์ผ ์ŠคํŠธ๋ฆผ ํด๋ž˜์Šค. ์ถœ๋ ฅ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ํŒŒ์ผ์— ๋ฐ์ดํ„ฐ๋ฅผ ์“ธ ๋•Œ ์ƒใ…‡
  • ifstream ์ž…๋ ฅ ํŒŒ์ผ ์ŠคํŠธ๋ฆผ ํด๋ž˜์Šค. ํŒŒ์ผ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ๋•Œ ์‚ฌ์šฉ
  • fstream ์ผ๋ฐ˜์ ์ธ ํŒŒ์ผ ์ŠคํŠธ๋ฆผ

C++์—์„œ ํŒŒ์ผ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ๋•Œ๋Š” <iostream> <fstream> ํ—ค๋” ํŒŒ์ผ์„ ํฌํ•จ์‹œ์ผœ์•ผ ํ•œ๋‹ค

ํŒŒ์ผ ์ž…์ถœ๋ ฅ๋„ ์ŠคํŠธ๋ฆผ์„ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง„๋‹ค
ํŒŒ์ผ์— ๋ฐ์ดํ„ฐ๋ฅผ ์“ธ ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ์ŠคํŠธ๋ฆผ์€ ํด๋ž˜์Šค ofstream์˜ ๊ฐ์ฒด์ด๋‹ค
๋จผ์ € ๊ฐ์ฒด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•œ ํ›„์— ์ด ๋ณ€์ˆ˜๋ฅผ ํŒŒ์ผ๊ณผ ์—ฐ๊ฒฐํ•˜๋ฉด ๋œ๋‹ค
ํŒŒ์ผ์— ์—ฐ๊ฒฐํ•˜๋ ค๋ฉด open() ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int main()
{
	// ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด์„œ ์ž๋™์œผ๋กœ ํŒŒ์ผ์ด ์—ด๋ฆฐ๋‹ค open()
	ofstream os("numbers.txt"); // ํŒŒ์ผ์ด๋ฆ„๋งŒ ์ง€์ •ํ•˜๋ฉด ํ˜„์žฌ ํ”„๋กœ์ ํŠธ ์œ„์น˜์—์„œ
	if (!os) // os.fail()
	{
		cerr << "ํŒŒ์ผ ์˜คํ”ˆ ์‹คํŒจ" << endl;
		exit(1);
	}
	for (int i = 0; i < 100; i++)
	{
		os << i << " ";
	}
	return 0;

	// ๊ฐ์ฒด os๊ฐ€ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋ฉด ofstream ์†Œ๋ฉธ์ž๊ฐ€ ํŒŒ์ผ์„ ๋‹ซ๋Š”๋‹ค. close()
}

ํŒŒ์ผ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ์ŠคํŠธ๋ฆผ์€ ํด๋ž˜์Šค ifstream์˜ ๊ฐ์ฒด์ด๋‹ค
๋จผ์ € ๊ฐ์ฒด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•œ ํ›„์— ์ด ๋ณ€์ˆ˜๋ฅผ ํŒŒ์ผ๊ณผ ์—ฐ๊ฒฐํ•˜๋ฉด ๋œ๋‹ค
ํŒŒ์ผ์— ์—ฐ๊ฒฐํ•˜๋ ค๋ฉด open() ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int main()
{
	// ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด์„œ ์ž๋™์œผ๋กœ ํŒŒ์ผ์ด ์—ด๋ฆฐ๋‹ค open()
	ifstream os("numbers.txt"); // ํŒŒ์ผ์ด๋ฆ„๋งŒ ์ง€์ •ํ•˜๋ฉด ํ˜„์žฌ ํ”„๋กœ์ ํŠธ ์œ„์น˜์—์„œ
	if (!is) // is.fail()
	{
		cerr << "ํŒŒ์ผ ์˜คํ”ˆ ์‹คํŒจ" << endl;
		exit(1);
	}
	int number;
	while (is)
	{
		is >> number;
		cout << number << " ";
	}
	cout << endl;
	return 0;

	// ๊ฐ์ฒด is๊ฐ€ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋ฉด ifstream ์†Œ๋ฉธ์ž๊ฐ€ ํŒŒ์ผ์„ ๋‹ซ๋Š”๋‹ค. close()
}

ํŒŒ์ผ ๋ชจ๋“œ
isstream ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ 2๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ๋„˜๊ธธ ์ˆ˜์žˆ๋‹ค

  • ios::in ์ž…๋ ฅ์„ ์œ„ํ•˜์—ฌ ํŒŒ์ผ์€ ์—ฐ๋‹ค
  • ios::out ์ถœ๋ ฅ์„ ์œ„ํ•˜์—ฌ ํŒŒ์ผ์„ ์—ฐ๋‹ค
  • ios::binary ์ด์ง„ ํŒŒ์ผ ์ž…์ถœ๋ ฅ์„ ์œ„ํ•˜์—ฌ ํŒŒ์ผ์„ ์—ฐ๋‹ค
  • ios::ate ํŒŒ์ผ์˜ ๋์„ ์ดˆ๊ธฐ ์œ„์น˜๋กœ ํ•œ๋‹ค
  • ios::app ํŒŒ์ผ์˜ ๋์— ์ถ”๊ฐ€๋œ๋‹ค
  • ios::trunc ์ƒˆ๋กœ์šด ๋‚ด์šฉ์œผ๋กœ ๊ต์ฒด๋œ๋‹ค

์ด๋“ค์€ | ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด ํ•ฉ์ณ์งˆ ์ˆ˜ ์žˆ๋‹ค

1
2
3
4
5
6
7
8
9
10
11
12
13
14
ifstraem is("someText.txt");
if (!is) // ! ์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ
{
	cerr << "ํŒŒ์ผ ์˜คํ”ˆ์— ์‹คํŒจํ•˜์˜€์Šต๋‹ˆ๋‹ค" << endl;
	exit(1);
}

char c;
is.get(c);
while (!is.eof())
{
	cout << c;
	is.get(c);
}
1
2
3
4
5
6
7
8
ofstream os("someText.txt");
char c;
while (cin.get(c))
{
	os.put(c);
}

// Ctrl + Z = End of File
  • ์ถœ๋ ฅ ๋ฐฉ์‹ ์ง€์ •, ํ”Œ๋ž˜๊ทธ ์„ค์ •, | ์—ฐ์‚ฐ ๊ฐ€๋Šฅ
    • cout.precision(3) : ์†Œ์ˆ˜์  ์ž๋ฆฌ ์ œํ•œ
    • cout.width(10) : ์ถœ๋ ฅ ํ•„๋“œ์˜ ๋„ˆ๋น„ ์ง€์ •
    • cout.setf(ios::fixed) : ๊ณ ์ • ์†Œ์ˆ˜์  ํ‘œ๊ธฐ๋ฒ•
    • cout.setf(ios::scientific) : ๊ณผํ•™์  ํ‘œ๊ธฐ๋ฒ• (์ง€์ˆ˜ ์ด์šฉ)
    • cout.setf(ios::showpoint) : ์†Œ์ˆ˜์  ํ•ญ์ƒ ํ‘œ์‹œ
    • cout.setf(ios::showpos) : ์–‘์ˆ˜ ๋ถ€ํ˜ธ๋ฅผ ๋ฐ˜๋“œ์‹œ ์ถœ๋ ฅ
    • cout.setf(ios::left) : ์™ผ์ชฝ ์ •๋ ฌ
    • cout.setf(ios::right) : ์˜ค๋ฅธ์ชฝ ์ •๋ ฌ
    • cout.setf(ios::dec) : 10์ง„๋ฒ•
    • cout.setf(ios::oct) : 8์ง„๋ฒ•
    • cout.setf(ios::hex) : 16์ง„๋ฒ•
    • cout.setf(ios::uppercase) : ์ง€์ˆ˜๋‚˜ 16์ง„๋ฒ•์œผ๋กœ ํ‘œ์‹œํ•  ๋•Œ ๋Œ€๋ฌธ์ž
    • cout.setf(ios::show) : 8์ง„์ˆ˜๋ฉด ์•ž์— 0, 16์ง„์ˆ˜๋ฉด ์•ž์— 0x
  • os.unsetf(ios::uppercase) : ํ”Œ๋ž˜๊ทธ ํ•ด์ œ

  • ํ…์ŠคํŠธ ํŒŒ์ผ
    • ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ž๋“ค๋กœ ๊ตฌ์„ฑ
    • ์—ฐ์†์ ์ธ ๋ผ์ธ์œผ๋กœ ๊ตฌ์„ฑ
    • ์ •์ˆ˜ 123456 ์„, ๋ฌธ์ž 1, 2, 3, โ€ฆ ์œผ๋กœ ์ €์žฅ
  • ์ด์ง„ ํŒŒ์ผ
    • ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์—†๋Š” ์ด์ง„ ๋ฐ์ดํ„ฐ๋กœ ๊ตฌ์„ฑ
    • ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜๋˜์ง€ ์•Š๊ณ  ์ž…์ถœ๋ ฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ผ์ธ์˜ ๋์„ ํ‘œ์‹œํ•  ํ•„์š”๊ฐ€ ์—†์Œ
    • NULL, CR, LF ๊ฐ™์€ ๋ฌธ์ž์—ด๋“ค์€ ํŠน๋ณ„ํ•œ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€์ง€ ์•Š๊ณ  ๋ฐ์ดํ„ฐ๋กœ ์ทจ๊ธ‰
    • ํŠน์ • ํ”„๋กœ๊ทธ๋žจ์— ์˜ํ•ด์„œ๋งŒ ํŒ๋…์ด ๊ฐ€๋Šฅ (์‹คํ–‰ ํŒŒ์ผ, ์‚ฌ์šด๋“œ ํŒŒ์ผ, ์ด๋ฏธ์ง€ ํŒŒ์ผ ๋“ฑ)
    • ์ •์ˆ˜ 123456 ์„, ๋ฐ”์ดํŠธ 00000000, 00000001, 11100010, 01000000 ์œผ๋กœ ์ €์žฅ
      • ์ •์ˆ˜๋‚˜ ์‹ค์ˆ˜๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์ด ์‹œ์Šคํ…œ๋งˆ๋‹ค ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด์‹์„ฑ์ด ๋–จ์–ด์ง
1
2
3
4
5
6
7
8
// ์ด์ง„ ํŒŒ์ผ ์ž…์ถœ๋ ฅ
ofstream os("text.dat", ofstream::binary);
int x = 5;
os.write((char*)&x, sizeof(int));

ifstream is("text.dat", ofstream::binary);
int x = 5;
is.read((char*)&x, sizeof(int));
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// ์ด์ง„ ํŒŒ์ผ ๋ณต์‚ฌ

// 1. istream ๊ฐ์ฒด๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ฒ„ํผ ๊ฐ์ฒด์˜ ํฌ์ธํ„ฐ๋ฅผ ๋ฐ˜ํ™˜
// ์ด๋ฅผ << ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•˜์—ฌ ostream์œผ๋กœ ์—ฐ๊ฒฐํ•˜๋ฉด ๋ฌธ์žฅ ํ•˜๋‚˜๋กœ ํŒŒ์ผ์˜ ์ „์ฒด ๋‚ด์šฉ์„ ๋ณต์‚ฌํ•  ์ˆ˜ ์žˆ์Œ
dest << source.rdbuf();

// 2. get, put (read, write)
if (source.is_open() && dest.is_open())
{
	while (!source.eof())
	{
		dest.put(source.get());
	}
}
  • ์ˆœ์ฐจ ์ ‘๊ทผ
    • ์ „์— ์ฝ์—ˆ๋˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ์ฝ์œผ๋ ค๋ฉด ํ˜„์žฌ์˜ ํŒŒ์ผ์„ ๋‹ซ๊ณ  ํŒŒ์ผ์„ ๋‹ค์‹œ ์—ด์–ด์•ผ ํ•œ๋‹ค
    • ์•ž๋ถ€๋ถ„์„ ์ฝ์ง€ ์•Š๊ณ  ์ค‘๊ฐ„์ด๋‚˜ ๋งˆ์ง€๋ง‰์œผ๋กœ ๊ฑด๋„ˆ๋›ธ ์ˆ˜๋„ ์—†๋‹ค
  • ์ž„์˜ ์ ‘๊ทผ ํŒŒ์ผ
    • ํŒŒ์ผ์˜ ์–ด๋Š ์œ„์น˜์—์„œ๋“ ์ง€ ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค
  • ์›๋ฆฌ
    • ๋ชจ๋“  ํŒŒ์ผ์—๋Š” ํŒŒ์ผ ์œ„์น˜ ํ‘œ์‹œ์ž๋ผ๋Š” ๊ฒƒ์ด ์กด์žฌ
    • ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ ๋™์ž‘์ด ํ˜„์žฌ ์–ด๋–ค ์œ„์น˜์—์„œ ์ด๋ฃจ์–ด์ง€๋Š” ์ง€๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค
    • i.e. ์ƒˆ ํŒŒ์ผ์˜ ์œ„์น˜ ํ‘œ์‹œ์ž๋Š” 0, ์ด๊ฒƒ์ด ํŒŒ์ผ์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค
    • ๊ธฐ์กด ํŒŒ์ผ์˜ ๊ฒฝ์šฐ, ์ถ”๊ฐ€ ๋ชจ๋“œ์—์„œ ์—ด๋ ธ์„ ๊ฒฝ์šฐ ํŒŒ์ผ์˜ ๋, ๋‹ค๋ฅธ ๋ชจ๋“œ์ธ ๊ฒฝ์šฐ์—๋Š” ์‹œ์ž‘๋ถ€๋ถ„์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค
    • ํŒŒ์ผ์—์„œ ์ฝ๊ธฐ๋‚˜ ์“ฐ๊ธฐ๊ฐ€ ์ˆ˜ํ–‰๋˜๋ฉด ํŒŒ์ผ ์œ„์น˜ ํ‘œ์‹œ์ž๊ฐ€ ๊ฐฑ์‹ ๋œ๋‹ค
    • ์˜ˆ๋ฅผ ๋“ค์–ด ์ฝ๊ธฐ ๋ชจ๋“œ๋กœ ํŒŒ์ผ์„ ์—ด๊ณ , 100 ๋ฐ”์ดํŠธ๋ฅผ ์ฝ์—ˆ๋‹ค๋ฉด ํŒŒ์ผ ์œ„์น˜ ํ‘œ์‹œ์ž์˜ ๊ฐ’์ด 100์ด ๋œ๋‹ค
    • ์ž…์ถœ๋ ฅ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ทธ ํ•จ์ˆ˜์˜ ๋‚ด๋ถ€์—์„œ ํŒŒ์ผ ์œ„์น˜ ํ‘œ์‹œ์ž์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋œ๋‹ค
    • ๋ณดํ†ต ์ˆœ์ฐจ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ฒŒ ๋˜๋ฉด ํŒŒ์ผ ์œ„์น˜ ํ‘œ์‹œ์ž๋Š” ํŒŒ์ผ์˜ ์‹œ์ž‘ ์œ„์น˜์—์„œ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜์—ฌ ํŒŒ์ผ์˜ ๋์œผ๋กœ ์ด๋™ํ•œ๋‹ค
    • ์ž„์˜ ์ ‘๊ทผ์„ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ํŒŒ์ผ ์œ„์น˜ ํ‘œ์‹œ์ž๋ฅผ ์ด๋™์‹œ์ผœ์„œ ์ž„์˜ ํŒŒ์ผ ์•ก์„ธ์Šค๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค
  • seekg(long offset, seekdir way);
    • way
      • ios::beg : ์ฒ˜์Œ๋ถ€ํ„ฐ์˜ offset
      • ios::cur : ํ˜„์žฌ ์œ„์น˜๋ถ€ํ„ฐ์˜ offset
      • ios::end : ํŒŒ์ผ ๋์—์„œ๋ถ€ํ„ฐ์˜ offset
  • tellg() ํ˜„์žฌ ํŒŒ์ผ ์œ„์น˜ ํ‘œ์‹œ์ž ๊ฐ’

์˜์ƒ์„ ์ค‘๊ฐ„ ๊ฑด๋„ˆ๋›ฐ๊ณ  ๋ณธ๋‹ค๋˜์ง€
ํŒŒ์ผ์˜ ํฌ๊ธฐ๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค๋˜์ง€

Raw ํŒŒ์ผ์€ ์ด๋ฏธ์ง€ ํ—ค๋” ์—†์ด ๋ฐ”๋กœ ํ”ฝ์…€ ๊ฐ’๋ถ€ํ„ฐ ์‹œ์ž‘

1
2
3
#include <windows.h>
HDC hdc = GetWindowDC(GetForegroundWindow());
SetPixel(hdc, c, r, RGB(red, green, blue));

๐Ÿ’ซ ์˜ˆ์™ธ


1
2
3
4
5
catch(...)
{
	// ... ์œผ๋กœ ๋ชจ๋“  ์˜ˆ์™ธ๋ฅผ ์žก์„ ์ˆ˜ ์žˆ๋‹ค
	// ์ฒ˜๋ฆฌ ๋  ์ˆ˜ ์žˆ๋Š” ์˜ˆ์™ธ๋ฅผ ๋จผ์ € ์žก์œผ๋‹ˆ๊นŒ, ๊ตฌ์ฒด์ ์ธ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ๋จผ์ €, ... ๋Š” ๋‚˜์ค‘์—
}

์˜ˆ์™ธ๊ฐ€ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์œผ๋ฉด, ์ด์ „ ํ•จ์ˆ˜์— ์˜ˆ์™ธ๊ฐ€ ์ „๋‹ฌ๋˜๊ณ , ์–ด๋–ค ํ•จ์ˆ˜์—์„œ๋„ ์˜ˆ์™ธ๊ฐ€ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์œผ๋ฉด ์‹œ์Šคํ…œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•จ์ˆ˜ abort()๊ฐ€ ํ˜ธ์ถœ๋˜์–ด์„œ ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒ

๐Ÿ’ซ ํ•จ์ˆ˜ ํ…œํ”Œ๋ฆฟ, ๋งคํฌ๋กœ


ํ•จ์ˆ˜ ํ…œํ”Œ๋ฆฟ, ๋งคํฌ๋กœ
๋‘˜ ๋‹ค ํƒ€์ž…๊ณผ ๋ฌธ๊ด€ํ•˜๊ฒŒ ์ž‘๋™๋˜๋ฏ€๋กœ ์ผ๋ฐ˜ํ™” ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํ•œ ํ˜•ํƒœ
๋งคํฌ๋กœ๋Š” ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ์—ฌ๋Ÿฌ ๋ฒˆ ๊ณ„์‚ฐ๋  ์ˆ˜ ์žˆ๊ณ , ํƒ€์ž…์˜ ๋ณ€ํ™˜์ด ๋ถ€์ ์ ˆํ•œ๋ฐ๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ํƒ€์ž…์„ ํ˜ผํ•ฉํ•˜์—ฌ ์“ธ ์ˆ˜ ์žˆ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#define GET_MAX(x,y) ((x)>(y) ? (x): y)

template<typename T>
T get_Max(T x, T y)
{
	if (x > y) return x;
	else return y;
}

template<> // ํ•จ์ˆ˜ ํ…œํ”Œ๋ฆฟ์˜ ํŠน์ˆ˜ํ™” (template specialization)
T get_Max(float x, float y)
{
	if (x > y) return x;
	else return y;
}

// ์ค‘๋ณต ์ •์˜
// ํ•จ์ˆ˜ ํ…œํ”Œ๋ฆฟ ํ˜•ํƒœ๋ณด๋‹ค ํ•จ์ˆ˜ ์ค‘๋ณต ์ •์˜์˜ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋†’์Œ

// ์—ฌ๋Ÿฌ ํƒ€์ž…๋„ ๊ฐ€๋Šฅ
template<typename T1, typename T2>

ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
template<typename T>
class Box
{
	// ...
}

// ๋ฉค๋ฒ„ ํ•จ์ˆ˜ ์™ธ๋ถ€ ์ •์˜
template<typename T>
Box<T>::Box()
{
	// ...
}

// ๊ธฐ๋ณธ ๊ฐ’
template<typename T = int>

// ๊ธฐ๋ณธ ๊ฐ’์ด ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฉด ์ƒ๋žต ๊ฐ€๋Šฅ
Box<> box;

// typedef ๊ฐ€๋Šฅ
typedef Box<int> iBox;
iBox box;

๐Ÿ’ซ STL, Standard Template Library | ํ‘œ์ค€ ํ…œํ”Œ๋ฆฟ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ


ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์ด ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ž๋ฃŒ ๊ตฌ์กฐ์™€ ์•Œ๊ณ ๋ฆฌ๋“ฌ์„ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค
STL์€ ํ…œํ”Œ๋ฆฟ ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ค ์ž๋ฃŒํ˜•์— ๋Œ€ํ•ด์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค

  • ์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„ ๊ฒ€์ฆ๋œ ์ปจํ…Œ์ด๋„ˆ์™€ ์•Œ๊ณ ๋ฆฌ๋“ฌ -> ์‹œ๊ฐ„ ์ ˆ์•ฝ, ์•ˆ์ •์„ฑ ํ™•๋ณด
  • STL์€ ๊ฐ์ฒด ์ง€ํ–ฅ ๊ธฐ๋ฒ•๊ณผ ์ผ๋ฐ˜ํ™” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ•์„ ์ ์šฉํ•˜์—ฌ์„œ ๋งŒ๋“ค์–ด์กŒ์œผ๋ฏ€๋กœ ์ปจํ…Œ์ด๋„ˆ ๋˜๋Š” ์•Œ๊ณ ๋ฆฌ๋“ฌ์„ ์–ด๋–ค ์ž๋ฃŒํ˜•์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. -> ํƒ€์ž…๋งˆ๋‹ค ๋‹ค์‹œ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†๋‹ค.

๐Ÿซง Container | ์ปจํ…Œ์ด๋„ˆ

๋ฐ์ดํ„ฐ๋“ค์„ ์ €์žฅํ•˜๋Š” ํด๋ž˜์Šค.
๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ ๋„์›€์ด ๋œ๋‹ค.
ํ…œํ”Œ๋ฆฟ์œผ๋กœ ๊ตฌํ˜„๋˜๋ฏ€๋กœ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค.

Container ๋ถ„๋ฅ˜

  • ์ˆœ์ฐจ (Sequence) ์ปจํ…Œ์ด๋„ˆ
    • ์ž๋ฃŒ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
    • ์ˆœ์ฐจ์ ์ธ ์ปจํ…Œ์ด๋„ˆ๋Š” ์ž๋ฃŒ์˜ ์ถ”๊ฐ€๋Š” ๋น ๋ฅด์ง€๋งŒ ํƒ์ƒ‰ํ•  ๋•Œ๋Š” ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ฆฐ๋‹ค
  • ์—ฐ๊ด€(์—ฐ๊ด€ Sequence) ์ปจํ…Œ์ด๋„ˆ
    • ์‚ฌ์ „๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์„œ ์ž๋ฃŒ๋ฅผ ์ €์žฅํ•œ๋‹ค.
    • ์›์†Œ๋“ค์„ ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์œ„ํ•œ ํ‚ค key๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์ž๋ฃŒ๋“ค์€ ์ •๋ ฌ๋˜์–ด ์žˆ๋‹ค.
    • ์ž๋ฃŒ์˜ ์ถ”๊ฐ€์—๋Š” ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ์ง€๋งŒ ์ž๋ฃŒ์˜ ํƒ์ƒ‰์€ ๋งค์šฐ ๋น ๋ฅด๋‹ค.

Container ๊ณตํ†ต ๋ฉ”์„œ๋“œ

  • Container() : ๊ธฐ๋ณธ ์ƒ์„ฑ์ž
    • Container(size) : ํฌ๊ธฐ๊ฐ€ size์ธ ์ปจํ…์ด๋„ˆ ์ƒ์„ฑ
    • Container(size, value) : ํฌ๊ธฐ๊ฐ€ size์ด๊ณ  ์ดˆ๊ธฐ๊ฐ’์ด value์ธ ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ
    • Container(iterator, iterator) : ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ๋ถ€ํ„ฐ ์ดˆ๊ธฐ๊ฐ’์˜ ๋ฒ”์œ„๋ฅผ ๋ฐ›์•„์„œ ์ƒ์„ฑ
  • begin() : ์ฒซ ๋ฒˆ์งธ ์š”์†Œ์˜ ๋ฐ˜๋ณต์ž ์œ„์น˜
  • end() : ๋ฐ˜๋ณต์ž๊ฐ€ ๋งˆ์ง€๋ง‰ ์š”์†Œ๋ฅผ ์ง€๋‚œ ์œ„์น˜
  • rbegin() : ๋์„ ๋‚˜ํƒ€๋‚ด๋Š ์—ญ๋ฐ˜๋ณต์ž
  • rend() : ์—ญ๋ฐ˜๋ณต์ž๊ฐ€ ์ฒ˜์Œ์„ ์ง€๋‚œ ์œ„์น˜
  • front() ์ปจํ…Œ์ด๋„ˆ์˜ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ ๋ฐ˜ํ™˜
  • insert(iterator, value) : ์ปจํ…Œ์ด๋„ˆ์˜ ์ค‘๊ฐ„์— ์š”์†Œ ์‚ฝ์ž…
  • pop_back() : ์ปจํ…Œ์ด๋„ˆ์˜ ๋งˆ์ง€๋ง‰ ์š”์†Œ๋ฅผ ์‚ญ์ œ
  • push_back(value) : ์ปจํ…Œ์ด๋„ˆ์˜ ๋์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€
  • erase(iterator) : ์ปจํ…Œ์ด๋„ˆ์˜ ์ค‘๊ฐ„ ์š”์†Œ๋ฅผ ์‚ญ์ œ
  • erase(iterator, iterator) : ์ปจํ…Œ์ด๋„ˆ์˜ ์ง€์ •๋œ ๋ฒ”์œ„๋ฅผ ์‚ญ์ œ
  • clear() : ๋ชจ๋“  ์š”์†Œ๋ฅผ ์‚ญ์ œ
  • size() : ์ปจํ…Œ์ด๋„ˆ์˜ ํฌ๊ธฐ
  • empty() : ๋น„์–ด์žˆ๋Š”์ง€๋ฅผ ๊ฒ€์‚ฌ

์ฐธ๊ณ  : std::begin(), std::end() ํ•จ์ˆ˜ -> ์ปจํ…Œ์ด๋„ˆ์˜ begin(), end() ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ

Container Adapter | ์ปจํ…Œ์ด๋„ˆ ์–ด๋Œ‘ํ„ฐ

์ด๋ฏธ ์กด์žฌํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ํด๋ž˜์Šค
์ฆ‰ ๊ธฐ์กด์˜ ์ปจํ…Œ์ด๋„ˆ์˜ ๊ธฐ๋Šฅ์„ ๊ทธ๋Œ€๋กœ ์ด์šฉํ•˜๋ฉด์„œ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ
์Šคํƒ, ํ, ์šฐ์„ ์ˆœ์œ„ ํ ๋“ฑ์ด ์žˆ๋‹ค

stack์€ ์„ ํ˜•์ ์ธ ์ž๋ฃŒ๊ตฌ์กฐ๋งŒ ์žˆ์œผ๋ฉด ๋œ๋‹ค
์ค‘๊ฐ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๋Š” ๊ธฐ๋Šฅ์€ ํ•„์š” ์—†๋‹ค, ์˜คํžˆ๋ ค ์ˆœ์ฐจ ์ปจํ…Œ์ด๋„ˆ์˜ ๊ธฐ๋Šฅ์ด ๋„ˆ๋ฌด ๋งŽ์•„์„œ ๊ธฐ๋Šฅ์„ ์ œ์•ฝํ•ด์•ผ ์Šคํƒ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค

stack์€ deque๋ฅผ ๋””ํดํŠธ๋กœ ๋งŒ๋“ค์–ด์กŒ๋‹ค
๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ๋กœ ๋งŒ๋“ค๊ณ  ์‹ถ์œผ๋ฉด
stack<string, vector<string>> st; ์ฒ˜๋Ÿผ ๋‘ ๋ฒˆ์งธ ์ธ์ž๋ฅผ ๋„˜๊ฒจ์ฃผ๋ฉด ๋œ๋‹ค

์šฐ์„ ์ˆœ์œ„ ํ๋Š” ํžˆํ”„๋ฅผ ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

๐Ÿซง Iterator | ๋ฐ˜๋ณต์ž

์ปจํ…Œ์ด๋„ˆ์˜ ์š”์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค
์ปจํ…Œ์ด๋„ˆ์— ์ €์žฅ๋œ ์š”์†Œ์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•.

๋ฐ์ดํ„ฐ(์ปจํ…Œ์ด๋„ˆ)์™€ ์•Œ๊ณ ๋ฆฌ๋“ฌ์˜ ์—ฐ๊ฒฐ์ž.
์˜ˆ๋ฅผ ๋“ค์–ด sort() ์•Œ๊ณ ๋ฆฌ๋“ฌ์€ ์‹œ์ž‘ ๋ฐ˜๋ณต์ž์™€ ์ข…๋ฃŒ ๋ฐ˜๋ณต์ž๋ผ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค
sort() ์•Œ๊ณ ๋ฆฌ๋“ฌ์€ ๋ฐ˜๋ณต์ž๋ฅผ ์ด์šฉํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ์˜ ์š”์†Œ๋“ค์„ ๋น„๊ตํ•˜์—ฌ์„œ ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
๋ฐ˜๋ณต์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ปจํ…Œ์ด๋„ˆ์˜ ์œ ํ˜•์— ์ƒ๊ด€์—†์ด ๋™์ผํ•œ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ๋“ฌ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค

์˜ˆ์ „ ๋ฐฉ๋ฒ•
๋ฐฐ์—ด๊ณผ ๋ฒกํ„ฐ๋Š” ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์š”์†Œ์— ์ ‘๊ทผ ๊ฐ€๋Šฅ
๊ทธ๋Ÿฌ๋‚˜ ๋žœ๋ค ์ ‘๊ทผ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์—์„œ๋Š” ์ธ๋ฑ์Šค๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ณ  ์•„๋งˆ ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์•ผ ํ•  ๊ฒƒ
๋ฌธ์ œ๋Š” ์ปจํ…Œ์ด๋„ˆ์˜ ์ข…๋ฅ˜์— ๋”ฐ๋ผ์„œ ์š”์†Œ์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์ƒ๋‹นํžˆ ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ
๋”ฐ๋ผ์„œ ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์„ ์ฐพ์•„์•ผ ํ•œ๋‹ค

STL์„ ์ž‘์„ฑํ•œ ์‚ฌ๋žŒ๋“ค์€ ์ปจํ…Œ์ด๋„ˆ์˜ ์ข…๋ฅ˜์— ๊ด€๊ณ„์—†์ด ์š”์†Œ๋“ค์— ์ ‘๊ทผํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ๋ฐ˜๋ณต์ž๋ผ๋Š” ๋ฐฉ์‹์„ ์ œ์•ˆํ•˜์˜€๋‹ค
๋ฐ˜๋ณต์ž๋Š” ์ปจํ…Œ์ด๋„ˆ์˜ ์š”์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ์ฒด์ด๋‹ค
๊ธฐ์กด์˜ ํฌ์ธํ„ฐ์™€ ๋น„์Šทํ•˜์—ฌ์„œ ๋ฐ˜๋ณต์ž๋ฅผ ํ”ํžˆ ์ผ๋ฐ˜ํ™”๋œ ํฌ์ธํ„ฐ Generalized Pointer ๋ผ๊ณ  ํ•œ๋‹ค
๋ฐ˜๋ณต์ž๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์ปจํ…Œ์ด๋„ˆ์˜ ์ข…๋ฅ˜์— ์ƒ๊ด€์—†์ด ์ผ๊ด€๋œ ๋ฐฉ๋ฒ•์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ์˜ ์š”์†Œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์ž‡๋”ฐ

์•Œ๊ณ ๋ฆฌ๋“ฌ์€ ์ปจํ…Œ์ด๋„ˆ์˜ ์š”์†Œ์— ์ ‘๊ทผํ•˜์—ฌ์„œ ์ฝ๊ฑฐ๋‚˜ ์จ์•ผ ํ•œ๋‹ค
์ด๋•Œ ๋ฐ˜๋ณต์ž๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค
๋ฐ˜๋ณต์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์„œ ์ปจํ…Œ์ด๋„ˆ์˜ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•œ ํ›„์— ์ž‘์—…์„ ํ•˜๊ณ  ์ž‘์—…์ด ๋๋‚˜๋ฉด ๋ฐ˜๋ณต์ž๋ฅผ ์ฆ๊ฐ€ํ•˜์—ฌ์„œ ๋‹ค์Œ ์š”์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•œ๋‹ค
๋ฐ˜๋ณต์ž๊ฐ€ ๋งˆ์ง€๋ง‰ ์š”์†Œ๋ฅผ ๋ฒ—์–ด๋‚˜๊ฒŒ ๋˜๋ฉด ์ž‘์—…์„ ๋๋‚ด๋ฉด ๋œ๋‹ค

STL์˜ ํ•ต์‹ฌ ๊ฐœ๋…์€ ์‹œํ€ธ์Šค Sequence์ด๋‹ค
์‹œํ€ธ์Šค๋Š” ์–ด๋–ค ์ˆœ์„œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ผ๋ จ์˜ ๋ฐ์ดํ„ฐ์ด๋‹ค
์‹œํ€ธ์Šค์—๋Š” ์‹œ์ž‘๊ณผ ๋์ด ์žˆ๋‹ค
์‹œํ€ธ์Šค๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ์ˆœํšŒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ค‘๊ฐ„ ์š”์†Œ ์ฝ๊ธฐ ๋˜๋Š” ์“ฐ๊ธฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค
๋ฐ˜๋ณต์ž๋Š” ์‹œํ€ธ์Šค์˜ ์š”์†Œ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๊ฐ์ฒด์ด๋‹ค
์˜ˆ๋ฅผ ๋“ค์–ด์„œ begin()๊ณผ end()๋Š” ๋ฐ˜๋ณต์ž๋กœ์„œ ์‹œํ€ธ์Šค์˜ ์‹œ์ž‘๊ณผ ๋์„ ์‹๋ณ„ํ•œ๋‹ค

begin()์œผ๋กœ ์‹๋ณ„๋˜๋Š” ์š”์†Œ๋Š” ์‹œํ€ธ์Šค์˜ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ์ด๊ณ  end()๋Š” ์‹œํ€ธ์Šค์˜ ๋์„ ํ•˜๋‚˜ ์ง€๋‚œ ์œ„์น˜๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค

๋ฐ˜๋ณต์ž์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—ฐ์‚ฐ์ž๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฐ˜๋ณต์ž๋Š” ๋‹ค์Œ์˜ ์—ฐ์‚ฐ์ž๊ฐ€ ์ค‘๋ณต ์ •์˜๋˜์–ด ์žˆ๋Š” ๊ฐ์ฒด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

  • ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋‹ค์Œ ์š”์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ธฐ ์œ„ํ•œ ++์—ฐ์‚ฐ์ž
  • ์ด์ „ ์š”์†Œ โ€“ ์—ฐ์‚ฐ์ž
  • ๋‘ ๊ฐœ์˜ ๋ฐ˜๋ณต์ž๊ฐ€ ๊ฐ™์€ ์š”์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ์ง€๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ ==์™€ != ์—ฐ์‚ฐ์ž
  • ๋ฐ˜๋ณต์ž๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์š”์†Œ์˜ ๊ฐ’์„ ์ถ”์ถœํ•˜๊ธฐ ์œ„ํ•œ ์—ญ์ฐธ์กฐ ์—ฐ์‚ฐ์ž *

๊ฐ ์ปจํ…Œ์ด๋„ˆ๋Š” ํŠน๋ณ„ํ•œ ์œ„์น˜์˜ ๋ฐ˜๋ณต์ž๋ฅผ ์–ป๋Š” ํ•จ์ˆ˜๋ฅผ ์ง€์›ํ•œ๋‹ค

  • v.begin() ํ•จ์ˆ˜๋Š” ์ปจํ…Œ์ด๋„ˆ v์—์„œ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค
  • v.end() ํ•จ์ˆ˜๋Š” ์ปจํ…Œ์ด๋„ˆ v์—์„œ ๋งˆ์ง€๋ง‰ ์š”์†Œ๋ฅผ ํ•˜๋‚˜ ์ง€๋‚œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. v.end()๋Š” ๋งˆ์ง€๋ง‰ ์š”์†Œ๊ฐ€ ์•„๋‹ˆ๋ผ ์ปจํ…Œ์ด๋„ˆ์˜ ๋์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ณด์ดˆ๊ฐ’ Sentinel์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. v.end()๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ’์€ ํฌ์ธํ„ฐ์—์„œ์˜ NULL๊ฐ’๊ณผ ๊ฐ™์€ ์˜๋ฏธ๋ฅผ ์ง€๋‹Œ๋‹ค

์˜ˆ์ „ ๋ฐฉ๋ฒ•

1
2
3
4
5
6
7
8
// old
for (vector<int>::iterator it = v.begin(); it != c.end(); it++)

// new 1
for (auto it = v.begin(); it != c.end(); it++)

// new 2
for (auto& n : v)

๋ฐ˜๋ณต์ž๋Š” ์ฝ”๋“œ(์•Œ๊ณ ๋ฆฌ๋“ฌ)์„ ๋ฐ์ดํ„ฐ์— ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค
์ฝ”๋“œ ์ž‘์„ฑ์ž๋Š” ๋ฐ˜๋ณต์ž์— ๋Œ€ํ•ด ์•Œ๊ณ  ์žˆ์ง€๋งŒ ๋ฐ˜๋ณต์ž๊ฐ€ ์‹ค์ œ๋กœ ๋ฐ์ดํ„ฐ์— ์–ด๋–ป๊ฒŒ ์ ‘๊ทผํ•˜๋Š”์ง€์— ๋Œ€ํ•ด์„œ๋Š” ์ž์„ธํžˆ ์•Œ์ง€ ์•Š์œผ๋ฉฐ ๋ฐ์ดํ„ฐ ๊ณต๊ธ‰์ž๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๋Š” ๋ฐฉ์‹์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ํ‘œ์‹œํ•˜์ง€ ์•Š๊ณ  ๋‹จ์ˆœํžˆ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฐ˜๋ณต์ž๋ฅผ ์ œ๊ณตํ•œ๋‹ค

๋”ฐ๋ผ์„œ ๋ฐ˜๋ณต์ž๋Š” ์•Œ๊ณ ๋ฆฌ๋“ฌ๊ณผ ์ปจํ…Œ์ด๋„ˆ ์‚ฌ์ด์— ๋…๋ฆฝ์„ฑ์„ ์ œ๊ณตํ•œ๋‹ค
STL์„ ์ž‘์„ฑํ•˜์˜€๋˜ Alex Stepanov๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งํ–‡๋‹ค
STL ์•Œ๊ณ ๋ฆฌ๋“ฌ๊ณผ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ž˜ ์ž‘๋™ํ•˜๋Š” ์ด์œ ๋Š” ์„œ๋กœ์— ๋Œ€ํ•ด ์•Œ์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค

Iterator ์ข…๋ฅ˜

  • ์ „ํ–ฅ ๋ฐ˜๋ณต์žForward Iterator : ++์—ฐ์‚ฐ์ž
  • ์–‘๋ฐฉํ–ฅ ๋ฐ˜๋ณต์žBidirectional Iterator : ++์—ฐ์‚ฐ์ž, โ€“์—ฐ์‚ฐ์ž
  • ๋ฌด์ž‘์œ„ ์ ‘๊ทผ ๋ฐ˜๋ณต์žRandom Access Iterator : ++์—ฐ์‚ฐ์ž, โ€“ ์—ฐ์‚ฐ์ž, []์—ฐ์‚ฐ์ž
    • i.e. ๋ฒกํ„ฐ

C++11 - ๋ฒ”์œ„๊ธฐ๋ฐ˜๋ฃจํ”„(Range-Based Loop) ๋กœ ๋Œ€์‹  ํ•  ์ˆ˜ ์žˆ๋‹ค.
์ปจํ…Œ์ด๋„ˆ์˜ ์ค‘๊ฐ„์— ์‚ฝ์ž…ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ฐ˜๋ณต์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์•ผ ํ•œ๋‹ค

๐Ÿซง STL ์•Œ๊ณ ๋ฆฌ๋“ฌ

์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐ˜๋ณต์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฃผ์–ด์ง„ ํƒ€์ž…์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ์— ์ ‘๊ทผ
๋ฐ˜๋ณต์ž๋Š” ์•Œ๊ณ ๋ฆฌ๋“ฌ๊ณผ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค

์“ฐ๋Ÿฌ๋ฉด <algorithm> ํ—ค๋”

  • ํƒ์ƒ‰ find() ์ปจํ…Œ์ด๋„ˆ ์•ˆ์—์„œ ํŠน์ •ํ•œ ์ž๋ฃŒ๋ฅผ ์ฐพ๋Š”๋‹ค
  • ์ •๋ ฌ sort() ์ž๋ฃŒ๋“ค์„ ํฌ๊ธฐ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ๋‹ค
  • binary_search() ์ด์ง„ ํƒ์ƒ‰์œผ๋กœ ์ž๋ฃŒ๋ฅผ ์ฐพ๋Š”๋‹ค
  • ๋ฐ˜์ „ reverse() ์ž๋ฃŒ๋“ค์˜ ์ˆœ์„œ๋ฅผ ์—ญ์ˆœ์œผ๋กœ ํ•œ๋‹ค
  • ์‚ญ์ œ remove() ์กฐ๊ฑด์ด ๋งŒ์กฑ๋˜๋Š” ์ž๋ฃŒ๋ฅผ ์‚ญ์ œํ•œ๋‹ค
  • ๋ณ€ํ™˜ transform() ์ปจํ…Œ์ด๋„ˆ์˜ ์š”์†Œ๋“ค์„ ์‚ฌ์šฉ์ž๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ณ€ํ™˜ ํ•จ์ˆ˜์— ๋”ฐ๋ผ์„œ ๋ณ€ํ™˜ํ•œ๋‹ค

  • ๋ถˆ๋ณ€๊ฒฝ ์•Œ๊ณ ๋ฆฌ๋“ฌ (์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์•ˆ๋ณ€๊ฒฝ๋˜๋Š”)
    • ๊ฐœ์ˆ˜
      • count ๊ฐ’๊ณผ ์ผ์น˜ํ•˜๋Š” ์š”์†Œ ์ˆ˜
      • count_if ์กฐ๊ฑด์— ๋งž๋Š” ์š”์†Œ ์ˆ˜
    • ํƒ์ƒ‰
      • search ๊ฐ’๊ณผ ์ผ์น˜ํ•˜๋Š” ์ฒซ ๋ฒˆ์งธ ์š”์†Œ
      • search_n ๊ฐ’๊ณผ ์ผ์น˜ํ•˜๋Š” n๊ฐœ์˜ ์š”์†Œ
      • find ๊ฐ’๊ณผ ์ผ์น˜ํ•˜๋Š” ์ฒซ๋ฒˆ์งธ์š”์†Œ
      • find_if ์กฐ๊ฑด์— ์ผ์น˜ํ•˜๋Š” ์ฒซ ๋ฒˆ์งธ ์š”์†Œ
      • find_end ์กฐ๊ฑด์— ์ผ์น˜ํ•˜๋Š” ๋งˆ์ง€๋ง‰ ์š”์†Œ
      • binary_search ์ •๋ ฌ๋œ ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•ด ์ด์ง„ ํƒ์ƒ‰
    • ๋น„๊ต
      • equal ๋‘ ์š”์†Œ๊ฐ€ ๊ฐ™์€์ง€
      • mismatch ๋‘ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋น„๊ตํ•ด ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ์ฒซ ๋ฒˆ์งธ ์š”์†Œ
      • lexicographical_compare ๋‘ ์ˆœ์ฐจ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋น„๊ตํ•˜์—ฌ์„œ ์‚ฌ์ „์ ์œผ๋กœ ์–ด๋–ค ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ž‘์€ ์ง€ ๋ฐ˜ํ™˜
  • ๋ณ€๊ฒฝ ์•Œ๊ณ ๋ฆฌ๋“ฌ
    • ์ดˆ๊ธฐํ™”
      • fill ๋ชจ๋“  ์š”์†Œ๋ฅผ ์ง€์ •๋œ ๊ฐ’์œผ๋กœ
      • generate ์ง€์ •๋œ ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์„ ํ• ๋‹น
    • ๋ณ€๊ฒฝ
      • for_each ์ง€์ •๋œ ๋ฒ”์œ„์˜ ๋ชจ๋“  ์š”์†Œ์— ๋Œ€ํ•˜์—ฌ ์—ฐ์‚ฐ ์ˆ˜ํ–‰
      • transform ์ง€์ •๋œ ๋ฒ”์œ„์˜ ๋ชจ๋“  ์š”์†Œ์— ๋Œ€ํ•˜์—ฌ ํ•จ์ˆ˜๋ฅผ ์ ์šฉ
    • ๋ณต์‚ฌ
      • copy ํ•˜๋‚˜์˜ ๊ตฌ๊ฐ„์„ ๋‹ค๋ฅธ ๊ตฌ๊ฐ„์œผ๋กœ ๋ณต์‚ฌ
    • ์‚ญ์ œ
      • remove ์ง€์ •๋œ ๊ตฌ๊ฐ„์—์„œ ์ง€์ •๋œ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ์š”์†Œ๋“ค์„ ์‚ญ์ œ
      • unique ๊ตฌ๊ฐ„์—์„œ ์ค‘๋ณต๋œ ์š”์†Œ๋“ค์„ ์‚ญ์ œ
    • ๋Œ€์น˜
      • replace ์ง€์ •๋œ ๊ตฌ๊ฐ„์—์„œ ์š”์†Œ๊ฐ€ ์ง€์ •๋œ ๊ฐ’๊ณผ ์ผ์น˜ํ•˜๋ฉด ๋Œ€์น˜๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝ
    • ์ •๋ ฌ
      • sort ์ง€์ •๋œ ์ •๋ ฌ ๊ธฐ๋ถ„์— ๋”ฐ๋ผ์„œ ๊ตฌ๊ฐ„์˜ ์š”์†Œ๋“ค์„ ์ •๋ ฌ
        • ํ•ฉ๋ณ‘์ •๋ ฌ O(NLogN) ๊ฑฐ์˜ ์ •๋ ฌ๋œ ๋ฆฌ์ŠคํŠธ์— ๋Œ€ํ•ด์„œ๋Š” ์ƒ๋‹นํžˆ ๋น ๋ฅด๋‹จ
    • ๋ถ„ํ• 
      • partition ์ง€์ •๋œ ๊ตฌ๊ฐ„์˜ ์š”์†Œ๋“ค์„ ์กฐ๊ฑด์— ๋”ฐ๋ผ์„œ ๋‘ ๊ฐœ์˜ ์ง‘ํ•ฉ์œผ๋กœ ๋‚˜๋ˆˆ๋‹ค

๐Ÿ’ซ Lambda-Expression


C++์—์„œ ํ•จ์ˆ˜๋Š” ์ •์‹ ๊ฐ์ฒด (์ผ๊ธ‰๊ฐ์ฒด)๊ฐ€ ์•„๋‹ˆ๋‹ค
๋”ฐ๋ผ์„œ ํ•จ์ˆ˜๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†์—ˆ๋‹ค
๋˜ ํ•จ์ˆ˜๋ฅผ ๋‹ค๋ฅธ ํ•จ์ˆ˜์˜ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜ ํ•จ์ˆ˜ ๋ชธ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†์—ˆ๋‹ค

ํ•˜์ง€๋งŒ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ๋Š” ํ•จ์ˆ˜๊ฐ€ ์•„์ฃผ ์ค‘์š”์‹œ ๋œ๋‹ค
ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ๋Š” ํ•จ์ˆ˜๊ฐ€ ๊ฐ์ฒด๋กœ ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค
ํ•จ์ˆ˜๋ฅผ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ๋‹ค๋ฅธ ํ•จ์ˆ˜์˜ ์ธ์ˆ˜๋กœ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค
๋žŒ๋‹ค์‹์€ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ C++์— ๋„์ž…ํ•œ ๊ฒƒ์ด๋‹ค

1
2
[](arg1, arg2, ...) ๋ฐ˜ํ™˜ํ˜• { body }
auto sum = [](int x, int y) { return x + y; }

๐Ÿ’ซ TODO


size_t, unsigned int
size_t, unsigned int
size_t, unsigned int
ํŠน์ • ๋ฌธ์ž ์ œ๊ฑฐ erase remove
ํŠน์ • ๋ฌธ์ž ์ œ๊ฑฐ erase remove
string ์ƒ์„ฑ์ž
๋ฐฐ์—ด ํŠน์ • ์š”์†Œ ๊ฐœ์ˆ˜
Vector ํƒ์ƒ‰
size_t, unsigned int

  • ++ ++ a O, a ++ ++ X
    • ์˜ค๋ฅธ์ชฝ์—์„œ ์™ผ์ชฝ์œผ๋กœ ์‹คํ–‰๋˜๊ธฐ ๋Œ€๋ฌธ์—
    • ๋ฌดํŠผ ์—ฐ์‚ฐ์ž ๋งŒ๋“ค ๋•Œ ๊ทธ๋ž˜์„œ ์œ„์ชฝ์€ ๋˜๊ฒŒ, ์•„๋ž˜์ชฝ์€ ์•ˆ๋˜๊ฒŒ ๋งŒ๋“ค์–ด์•ผํ•จ
    • ์ด๊ฑธ ๊ฐ„๋‹จํžˆ ๊ตฌํ˜„ํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Œ
    • ๊ฐ์ฒด& operator++() ์—์„œ &์„ ๋ถ™์—ฌ์ฃผ๋Š” ์ด์œ 
    • ์˜ˆ๋ฅผ ๋“ค์–ด Temp a = v1 + v2 ๋ฅผ ๋ดค์„ ๋•Œ
    • v1 + v1 ์˜ ๊ฒฐ๊ณผ๊ฐ’์€ ์ž„์‹œ ๊ฐ์ฒด์ž„, v1์ด๋‚˜ v2์˜ ์‹ค์ฒด ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ
    • ์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ++ ++ a ๋ฅผ ๋ณด๋ฉด
    • ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ๋ณด๋‚ด๋ฉด
    • a = a + 1 ์—์„œ a(์™ผ์ชฝ) ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๊ณ  a + 1(์˜ค๋ฅธ์ชฝ) ์˜ ์ž„์‹œ ๊ฐ์ฒด๋ฅผ ๋ณด๋‚ด๋ฒ„๋ฆผ
    • ๊ทธ๋ž˜์„œ ์ž๊ธฐ ์ž์‹ ์„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ๋ณด๋ƒ„
  • C++ time
1
2
3
4
5
6
7
8
9
10
11
#include <time.h>

using namespace std;

int main()
{
	time_t cur;
	time(&cur);
	tm* gmTM = gmtime(&cur);
	printf("%d\n%02d\n%02d", 1900 + gmTM->tm_year, gmTM->tm_mon + 1, gmTM->tm_mday);
}

C++ C3861
์—๋Ÿฌ : โ€˜๋ญ์‹œ๊นฝโ€™ ์‹๋ณ„์ž๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
ํ•ด๊ฒฐ : ํ•จ์ˆ˜ ์œ„์น˜ ๋ฐ‘ ์„ ์–ธ ํ™•์ธ


C++ C2360, C++ C2361
์—๋Ÿฌ : โ€˜๋ญ์‹œ๊นฝโ€™ ์ดˆ๊ธฐํ™”๊ฐ€ โ€˜caseโ€™/โ€™defaultโ€™ ๋ ˆ์ด๋ธ”์— ์˜ํ•ด ์ƒ๋žต๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
ํ•ด๊ฒฐ : ๋ณ€์ˆ˜ ์„ ์–ธํ•˜๋Š” case์— ์Šค์ฝ”ํ”„ {} ๋‹ฌ์•„์ฃผ๊ธฐ
์„ค๋ช… : case/default ์ด์ „ ๊ณต๊ฐ„์—์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์•ˆ๋จ

ํฌ์ธํ„ฐ delete ํ›„ ์–ด๋–ค ์ฝ”๋“œ๊ฐ€ ์—†๋”๋ผ๋„ = nullptr ๋Œ€์ž…

์ด ๊ธฐ์‚ฌ๋Š” ์ €์ž‘๊ถŒ์ž์˜ CC BY 4.0 ๋ผ์ด์„ผ์Šค๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.