C++
๐ซ Modern C++ (VS Old C++)
- ์๋ ํ์ ์ถ๋ก (auto ํค์๋ ์ฌ์ฉ)
- ๋ฒ์ ๊ธฐ๋ฐ ๋ฃจํ
- ๋๋ค์
- ์ค๋งํธ ํฌ์ธํฐ
- ๋ฒกํฐ, ๋ชฉ๋ก ๋ฐ ๋งต๊ณผ ๊ฐ์ ํ์ค ํ ํ๋ฆฟ ๋ผ์ด๋ธ๋ฌ๋ฆฌ (STL) ์ปจํ ์ด๋
- STL ์๊ณ ๋ฆฌ๋ฌ
- std::string ๋ฐ std::wstring ํ์
- ์ค๋ฅ ์กฐ๊ฑด์ ๋ณด๊ณ ํ๊ณ ์ฒ๋ฆฌํ๋ ์์ธ
- STL std::atomic<> ๋ฅผ ์ฌ์ฉํ์ฌ ์ ๊ธ ์๋ ์ค๋ ๋ ๊ฐ ํต์
๐ซ Memo
๐ซง Func, Hack
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 = #
์ฃผ์ ์ฐ์ฐ์ (์ฐธ์กฐ์ ์ฐ์ฐ์ ์๋)
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)์ด๋ผ๋ ๋ฉ์นด๋์ฆ์ ํตํด ์ฌ์ ์ํด์ค์ผ ํ๋ค
๊ฐ์ฒด ์งํฅ์์ ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
- is-a ๊ด๊ณ : ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์์ is-a์ ๊ฐ๋ ์ ์์์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ค. โA๋ B์ ํ์ ๋ฌผ๊ฑดโ ์ด๋ผ๊ณ ๋งํ๋ ๊ฒ๊ณผ ๊ฐ๋ค. Apple์ ๊ณผ์ผ์ ์ผ์ข , Car๋ ์๋์ฐจ์ ์ผ์
- 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
: ์ฒ์๋ถํฐ์ offsetios::cur
: ํ์ฌ ์์น๋ถํฐ์ offsetios::end
: ํ์ผ ๋์์๋ถํฐ์ offset
- way
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) ๊ฑฐ์ ์ ๋ ฌ๋ ๋ฆฌ์คํธ์ ๋ํด์๋ ์๋นํ ๋น ๋ฅด๋จ
- sort ์ง์ ๋ ์ ๋ ฌ ๊ธฐ๋ถ์ ๋ฐ๋ผ์ ๊ตฌ๊ฐ์ ์์๋ค์ ์ ๋ ฌ
- ๋ถํ
- 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 ๋์