C++
π« Modern C++ (VS Old C++)
- μλ νμ μΆλ‘ (auto ν€μλ μ¬μ©)
- λ²μ κΈ°λ° λ£¨ν
- λλ€μ
- μ€λ§νΈ ν¬μΈν°
- 벑ν°, λͺ©λ‘ λ° λ§΅κ³Ό κ°μ νμ€ ν νλ¦Ώ λΌμ΄λΈλ¬λ¦¬ (STL) 컨ν μ΄λ
- STL μκ³ λ¦¬λ¬
- std::string λ° std::wstring νμ
- μ€λ₯ 쑰건μ λ³΄κ³ νκ³ μ²λ¦¬νλ μμΈ
- STL std::atomic<> λ₯Ό μ¬μ©νμ¬ μ κΈ μλ μ€λ λ κ° ν΅μ
π« λ©λͺ¨
𫧠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 λμ