포슀트

C++

C++

πŸ’« Modern C++ (VS Old C++)


  • μžλ™ νƒ€μž… μΆ”λ‘  (auto ν‚€μ›Œλ“œ μ‚¬μš©)
  • λ²”μœ„ 기반 루프
  • λžŒλ‹€μ‹
  • 슀마트 포인터
  • 벑터, λͺ©λ‘ 및 맡과 같은 ν‘œμ€€ ν…œν”Œλ¦Ώ 라이브러리 (STL) μ»¨ν…Œμ΄λ„ˆ
  • STL μ•Œκ³ λ¦¬λ“¬
  • std::string 및 std::wstring ν˜•μ‹
  • 였λ₯˜ 쑰건을 λ³΄κ³ ν•˜κ³  μ²˜λ¦¬ν•˜λŠ” μ˜ˆμ™Έ
  • STL std::atomic<> λ₯Ό μ‚¬μš©ν•˜μ—¬ 잠금 μ—†λŠ” μŠ€λ ˆλ“œ κ°„ 톡신

πŸ’« λ©”λͺ¨


🫧 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 λΌμ΄μ„ΌμŠ€λ₯Ό λ”°λ¦…λ‹ˆλ‹€.