포슀트

πŸŒ“ C++

🫧 VS λ‹€λ₯Έ μ–Έμ–΄

  • C
    • C + 객체지ν–₯ = C++
    • C ν”„λ‘œκ·Έλž¨μ„ κ·ΈλŒ€λ‘œ μ‚¬μš©ν•  수 μžˆλ‹€
    • μ—°μ‚°μž 쀑볡 Operator Overloading : λŒ€μƒμ— λ”°λΌμ„œ λ™μΌν•œ μ—°μ‚°μžλ‘œ μƒˆλ‘œμš΄ 연산을 μ •μ˜ν•  수 μžˆλ‹€
    • μ°Έμ‘° νƒ€μž… Reference Type : λ³€μˆ˜μ˜ 별λͺ…을 λ§Œλ“€μ–΄μ„œ λ³€μˆ˜μ™€ 같이 μ‚¬μš©ν•  수 μžˆλ‹€.
    • 훨씬 큰 ν‘œμ€€ 라이브러리 : C와 비ꡐ가 λ˜μ§€ μ•ŠλŠ” ν’λΆ€ν•œ ν‘œμ€€ 라이브러리 제곡
    • ν•¨μˆ˜ 쀑볡 Function Overloading : λ§€κ°œλ³€μˆ˜λ§Œ λ‹€λ₯΄λ©΄ λ™μΌν•œ μ΄λ¦„μ˜ ν•¨μˆ˜λ₯Ό μ—¬λŸ¬ 개 λ§Œλ“€ 수 μžˆλ‹€
    • new 와 delete μ—°μ‚°μž : 동적 λ©”λͺ¨λ¦¬ ν• λ‹Ήκ³Ό ν•΄μ œλ₯Ό λ‹΄λ‹Ήν•˜λŠ” μ—°μ‚°μž
    • μ œλ„€λ¦­ Generics : 클래슀 μ •μ˜λ₯Ό μžλ£Œν˜•μ— 상관없이 μž¬μ‚¬μš©ν•˜λŠ” 기술
  • Java, C#
    • 가상 κΈ°κ³„μ˜ μ½”λ“œ 생성
      • Java C# : 가상 κΈ°κ³„μ˜ μ½”λ“œλ₯Ό 생성 -> λ‹€λ₯Έ μ’…λ₯˜μ˜ μ»΄ν“¨ν„°μ—μ„œλŠ” λ°”λ‘œ μ‹€ν–‰λ˜λŠ”, 이식성이 μ’‹μŒ
      • C++ : 기계어 μ½”λ“œλ₯Ό μƒμ„±ν•˜κΈ° λ•Œλ¬Έμ— 그것은 λΆˆκ°€λŠ₯ν•˜μ§€λ§Œ, λΉ λ₯Έ μ†λ„λ‘œ 싀행이 κ°€λŠ₯
    • 포인터, 가비지 μ»¬λ ‰μ…˜ Garbage Collection
      • Java C# : 포인터 X, 가비지 μ»¬λ ‰μ…˜λ‘œ λ©”λͺ¨λ¦¬ 관리
      • C++ : 포인터 O, λ©”λͺ¨λ¦¬ 관리λ₯Ό 직접 해야함
    • 닀쀑 상속
      • Java C# : 닀쀑 상속 X
      • C++ : 닀쀑 상속 O
    • Classκ°€
      • Java C# : Classκ°€ Reference Type
      • C++ : Classκ°€ Value Type


🫧 Modern C++ (VS Old C++)

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


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
to_string(10);

auto add(int x, int y)
{
	return x + y;
}

// add()λŠ” μ •μˆ˜κ°’μ„ λ°˜ν™˜ν•˜λ―€λ‘œ sum은 intν˜•μ΄ λœλ‹€
auto sum = add(5, 6);

if (int condition = get_status())

// ν•¨μˆ˜μ˜ μ‹œκ·Έλ‹ˆμ²˜ (λ§€κ°œλ³€μˆ˜κ°œμˆ˜, νƒ€μž…, μˆœμ„œ)  

// ν•¨μˆ˜ μ›ν˜• Function Prototype
int spuare(int n);
int spuare(int);

// & 별λͺ…

// λ¬Έμžμ—΄ \> \< μ‚¬μ „μˆœ 비ꡐ  
// 크면 μ•žμ— μžˆλŠ”  

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μ΄λž€ μž…μΆœλ ₯을 λ°”μ΄νŠΈλ“€μ˜ νλ¦„μœΌλ‘œ μƒκ°ν•˜λŠ” 것이닀
슀트림의 μ΅œλŒ€ μž₯점은 μž₯치 독립성이닀
μž…μΆœλ ₯ μž₯μΉ˜μ— 상관없이 ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•  수 μžˆλ‹€λŠ” 것

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은 ν…œν”Œλ¦Ώ 기법을 μ‚¬μš©ν•˜μ˜€κΈ° λ•Œλ¬Έμ— μ–΄λ–€ μžλ£Œν˜•μ— λŒ€ν•΄μ„œλ„ μ‚¬μš©ν•  수 μžˆλ‹€

μ»¨ν…Œμ΄λ„ˆ
자료λ₯Ό μ €μž₯ν•˜λŠ” 창고와 같은 역할을 ν•˜λŠ” ꡬ쑰
즉 λ°°μ—΄μ΄λ‚˜ μ—°κ²°λ¦¬μŠ€νŠΈ, 벑터, 집합, 사전, 트리 등이 여기에 ν•΄λ‹Ήλœλ‹€
μ΅œλŒ€ν•œ μΌλ°˜ν™” 기법을 μ‚¬μš©ν•˜μ—¬ μž‘μ„±λ˜μ—ˆκΈ° λ•Œλ¬Έμ— μ–΄λ–€μžλ£Œν˜•λ„ μ €μž₯ν•  수 μžˆλ‹€

반볡자
반볡자 Iterator λŠ” μ»¨ν…Œμ΄λ„ˆμ˜ μš”μ†Œλ₯Ό κ°€λ¦¬ν‚€λŠ” 데 μ‚¬μš©λœλ‹€
λ°˜λ³΅μžλŠ” μ‹€μ œλ‘œ μ»¨ν…Œμ΄λ„ˆμ™€ μ•Œκ³ λ¦¬λ“¬ μ‚¬μ΄μ˜ 닀리 역할을 ν•œλ‹€
예λ₯Ό λ“€μ–΄ sort() μ•Œκ³ λ¦¬λ“¬μ€ μ‹œμž‘ λ°˜λ³΅μžμ™€ μ’…λ£Œ λ°˜λ³΅μžλΌλŠ” λ§€κ°œλ³€μˆ˜λ₯Ό 가지고 μžˆλ‹€
sort() μ•Œκ³ λ¦¬λ“¬μ€ 반볡자λ₯Ό μ΄μš©ν•˜μ—¬ μ»¨ν…Œμ΄λ„ˆμ˜ μš”μ†Œλ“€μ„ λΉ„κ΅ν•˜μ—¬μ„œ 정렬을 μˆ˜ν–‰ν•  수 μžˆλ‹€.
반볡자λ₯Ό μ‚¬μš©ν•˜λ©΄ μ»¨ν…Œμ΄λ„ˆμ˜ μœ ν˜•μ— 상관없이 λ™μΌν•œ μ •λ ¬ μ•Œκ³ λ¦¬λ“¬μ„ μ μš©ν•  수 μžˆλ‹€

μ•Œκ³ λ¦¬λ“¬
μƒˆλ‘œμš΄ ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•  λ•Œ μƒλ‹Ήνžˆ λ§Žμ€ μ•Œκ³ λ¦¬λ“¬λ“€μ΄ ν•„μš”ν•˜λ‹€
예λ₯Ό λ“€μ–΄μ„œ κ²Œμž„ ν”„λ‘œκ·Έλž¨μ—μ„œλŠ” μ‚¬μš©μžκ°€ 가진 μ•„μ΄ν…œλ“€μ„ μ •λ ¬ν•΄μ„œ λ³΄μ—¬μ£ΌλŠ” κΈ°λŠ₯이 ν•„μš”ν•˜λ‹€
λ§Žμ€ 자료 μ€‘μ—μ„œ νŠΉλ³„ν•œ 자료λ₯Ό νƒμƒ‰ν•œλ‹€λ˜μ§€, 자료λ₯Ό μ–΄λ–€ 기쀀에 μ˜ν•˜μ—¬ μ •λ ¬ν•œλ‹€λ˜μ§€, 자료의 μˆœμ„œλ₯Ό 거꾸둜 ν•œλ‹€λ“ μ§€ ν•˜λŠ” λ§Žμ€ μ•Œκ³ λ¦¬λ“¬λ“€μ΄ ν•„μš”ν•  수 μžˆλ‹€
이듀 μ•Œκ³ λ¦¬λ“¬μ€ μ²˜μŒλΆ€ν„° μƒˆλ‘œ λ§Œλ“œλŠ” κ²ƒλ³΄λ‹€λŠ” λˆ„κ΅°κ°€κ°€ κ΅¬ν˜„ν•œ 였λ₯˜μ—†λŠ” 버전을 μ‚¬μš©ν•˜λŠ” 편이 λΉ λ₯΄κ³  κ°„νŽΈν•˜λ‹€

STL은 이런 이유둜 μ»¨ν…Œμ΄λ„ˆμ™€ ν•¨κ»˜ μ‚¬μš©λ˜λŠ” λ§Žμ€ μ•Œκ³ λ¦¬λ“¬λ“€μ„ μž‘μ„±ν•˜μ—¬μ„œ μ œκ³΅ν•œλ‹€
예λ₯Ό λ“€μ–΄ sort() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ λ²”μœ„ μ•ˆμ˜ μš”μ†Œλ“€μ„ μ •λ ¬ν•˜κ³ , λ²”μœ„ μ•ˆμ˜ μš”μ†Œλ“€μ„ κ²€μƒ‰ν•˜λŠ” μž‘μ—…μ„ binary_search() ν•¨μˆ˜λ‘œ μˆ˜ν–‰ν•  수 μžˆλ‹€
또 reverse() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λ©΄ λ²”μœ„ μ•ˆμ— μžˆλŠ” μš”μ†Œλ“€μ„ 뒀집을 수 μžˆλ‹€.

  • 탐색 find() μ»¨ν…Œμ΄λ„ˆ μ•ˆμ—μ„œ νŠΉμ •ν•œ 자료λ₯Ό μ°ΎλŠ”λ‹€
  • μ •λ ¬ sort() μžλ£Œλ“€μ„ 크기순으둜 μ •λ ¬ν•œλ‹€
  • λ°˜μ „ reverse() μžλ£Œλ“€μ˜ μˆœμ„œλ₯Ό μ—­μˆœμœΌλ‘œ ν•œλ‹€
  • μ‚­μ œ remove() 쑰건이 λ§Œμ‘±λ˜λŠ” 자료λ₯Ό μ‚­μ œν•œλ‹€
  • λ³€ν™˜ transform() μ»¨ν…Œμ΄λ„ˆμ˜ μš”μ†Œλ“€μ„ μ‚¬μš©μžκ°€ μ œκ³΅ν•˜λŠ” λ³€ν™˜ ν•¨μˆ˜μ— λ”°λΌμ„œ λ³€ν™˜ν•œλ‹€

STL μ‚¬μš©μ˜ μž₯점

  • STL은 ν”„λ‘œκ·Έλž˜λ°μ— 맀우 μœ μš©ν•œ μˆ˜λ§Žμ€ μ»¨ν…Œμ΄λ„ˆμ™€ μ•Œκ³ λ¦¬λ“¬μ„ μ œκ³΅ν•œλ‹€. 예λ₯Ό λ“€μ–΄ C++둜 μ—°κ²° 리슀트λ₯Ό λ§Œλ“œλŠ” 것은 λ…Έλ ¨ν•œ ν”„λ‘œκ·Έλž˜λ¨ΈλΌκ³  ν•˜λ”λΌλ„ μƒλ‹Ήν•œ μ‹œκ°„μ„ ν•„μš”λ‘œ ν•œλ‹€. ν•˜μ§€λ§Œ STLμ—λŠ” 기본으둜 μ—°κ²° λ¦¬μŠ€νŠΈκ°€ μ œκ³΅λœλ‹€. κ°œλ°œμžλŠ” μ‹œκ°„κ³Ό λ…Έλ ₯을 μ ˆμ•½ν•  수 μžˆλ‹€
  • STL은 객체 지ν–₯ 기법과 μΌλ°˜ν™” ν”„λ‘œκ·Έλž˜λ° 기법을 μ μš©ν•˜μ—¬μ„œ λ§Œλ“€μ–΄μ‘ŒμœΌλ―€λ‘œ μ–΄λ–€ μžλ£Œν˜•μ— λŒ€ν•΄μ„œλ„μ‚¬μš©ν•  수 μžˆλ”°. 즉 μ»¨ν…Œμ΄λ„ˆ λ˜λŠ” μ•Œκ³ λ¦¬λ“¬μ„ μ–΄λ–€ μžλ£Œν˜•μ—μ„œλ„ μ‚¬μš©ν•  수 μžˆλ”°. 예λ₯Ό λ“€μ–΄ μ •μˆ˜λ₯Ό μ •λ ¬ν•˜κ±°λ‚˜ 객체λ₯Ό μ •λ ¬ν•  λ•Œλ„ μ‚¬μš©ν•  수 μžˆλ‹€. 즉 μžλ£Œν˜•λ§ˆλ‹€ μ •λ ¬ μ•Œκ³ λ¦¬λ“¬μ„ κ΅¬ν˜„ν•  ν•„μš”κ°€ μ—†λ‹€
  • STL은 μ „λ¬Έκ°€κ°€ λ§Œλ“€μ–΄μ„œ ν…ŒμŠ€νŠΈλ₯Ό 거치 κ²€μ¦λœ λΌμ΄λΈŒλŸ¬λ¦¬λ‹€. λ”°λΌμ„œ 버그λ₯Ό λ°œμƒμ‹œν‚€μ§€ μ•ŠμœΌλ―€λ‘œ μ•ˆμ‹¬ν•˜κ³  μ‚¬μš©ν•  수 μžˆλ‹€. STL은 ν‘œμ€€ 라이브러리이기 λ•Œλ¬Έμ— μ–΄λ–€ C++ μ»΄νŒŒμΌλŸ¬λ„ μ§€μ›ν•œλ‹€. λ”°λΌμ„œ ν˜Έν™˜μ„± λ¬Έμ œκ°€ μ—†λ‹€. 결둠적으둜 STL을 μ‚¬μš©ν•˜λ©΄ 개발 기간을 단좕할 수 있고 버그가 μ—†λŠ” ν”„λ‘œκ·Έλž¨μ„ μ‰½κ²Œ λ§Œλ“€ 수 μžˆλ‹€.

STL의 μ»¨ν…Œμ΄λ„ˆ λΌμ΄λΈŒλŸ¬λ¦¬λŠ” μ»¨ν…Œμ΄λ„ˆλ₯Ό μ œκ³΅ν•œλ‹€
μ»¨ν…Œμ΄λ„ˆλŠ” 데이터듀을 μ €μž₯ν•˜λŠ” 클래슀라고 ν•  수 μžˆλ‹€
μ»¨ν…Œμ΄λ„ˆλŠ” λ³΄μž‘ν•œ 데이터 ꡬ쑰λ₯Ό μ‰½κ²Œ κ΅¬ν˜„ν•˜λŠ”λ° 도움이 λœλ‹€
μ»¨ν…Œμ΄λ„ˆλŠ” ν…œν”Œλ¦ΏμœΌλ‘œ κ΅¬ν˜„λ˜λ―€λ‘œ μ»¨ν…Œμ΄λ„ˆκ°€ μ„œλ‘œ λ‹€λ₯Έ μ’…λ₯˜μ˜ 객체λ₯Ό μ €μž₯ν•˜λŠ” 데 μ‚¬μš©λ  수 μžˆλ‹€

  • 벑터 vector 동적 λ°°μ—΄μ²˜λŸΌ λ™μž‘ν•œλ‹€ λ’€μ—μ„œ μžλ£Œλ“€μ΄ μΆ”κ°€λœλ‹€
  • 큐 queue 데이터가 μž…λ ₯된 μˆœμ„œλŒ€λ‘œ 좜λ ₯λ˜λŠ” 자료 ꡬ쑰
  • μŠ€νƒ stack λ¨Όμ € μž…λ ₯된 데이터가 λ‚˜μ€‘μ— 좜λ ₯λ˜λŠ” 자료 ꡬ쑰
  • μš°μ„ μˆœμœ„ν priority queue 큐의 μΌμ •μœΌλ‘œ 큐의 μš”μ†Œλ“€μ΄ μš°μ„  μˆœμœ„λ₯Ό 가지고 있고 μš°μ„  μˆœμœ„κ°€ 높은 μš”μ†Œκ°€ λ¨Όμ € 좜λ ₯λ˜λŠ” 자료 ꡬ쑰
  • 리슀트 list 벑터와 μœ μ‚¬ν•˜μ§€λ§Œ μ€‘κ°„μ—μ„œ 자료λ₯Ό μΆ”κ°€ν•˜λŠ” 연산이 νš¨μœ¨μ μ΄λ‹€
  • 집합 set 쀑볡이 μ—†λŠ” μžλ£Œλ“€μ΄ μ •λ ¬λ˜μ–΄μ„œ μ €μž₯λœλ‹€
  • Map ν‚€-κ°’(key-value)의 ν˜•μ‹μœΌλ‘œ μ €μž₯λœλ‹€ ν‚€κ°€ μ œμ‹œλ˜λ©΄ ν•΄λ‹Ήλ˜λŠ” 값을 찾을 수 μžˆλ‹€

μ»¨ν…Œμ΄λ„ˆμ˜ λΆ„λ₯˜

  • 순차 (Sequence) μ»¨ν…Œμ΄λ„ˆ : 순차 μ»¨ν…Œμ΄λ„ˆλŠ” 이름 κ·ΈλŒ€λ‘œ 자료λ₯Ό 순차적으둜 가지고 μžˆλ‹€. λŒ€ν‘œμ μœΌλ‘œ 벑터와 리슀트λ₯Ό λ“€ 수 μžˆλ‹€. 순차적인 μ»¨ν…Œμ΄λ„ˆλŠ” 자료의 μΆ”κ°€λŠ” λΉ λ₯΄μ§€λ§Œ 탐색할 λ•ŒλŠ” μ‹œκ°„μ΄ 많이 κ±Έλ¦°λ‹€
  • μ—°κ΄€(μ—°κ΄€ Sequence) μ»¨ν…Œμ΄λ„ˆ : μ—°κ΄€ μ»¨ν…Œμ΄λ„ˆλŠ” 사전과 같은 ꡬ쑰λ₯Ό μ‚¬μš©ν•˜μ—¬μ„œ 자료λ₯Ό μ €μž₯ν•œλ‹€. μ—°κ΄€ μ»¨ν…Œμ΄λ„ˆλŠ” μ›μ†Œλ“€μ„ κ²€μƒ‰ν•˜κΈ° μœ„ν•œ ν‚€ keyλ₯Ό 가지고 μžˆλ‹€. μžλ£Œλ“€μ€ μ •λ ¬λ˜μ–΄ μžˆλ‹€. 자료의 μΆ”κ°€μ—λŠ” μ‹œκ°„μ΄ κ±Έλ¦¬μ§€λ§Œ 자료의 탐색은 맀우 λΉ λ₯΄λ‹€. Mapμ΄λ‚˜ 집합이 λŒ€ν‘œμ μΈ μ—°κ΄€ μ»¨ν…Œμ΄λ„ˆμ΄λ‹€

반볡자
μ»¨ν…Œμ΄λ„ˆμ™€ μ•Œκ³ λ¦¬λ“¬μ„ μ œλŒ€λ‘œ μ‚¬μš©ν•˜λ €λ©΄ 반볡자 Iteratorλ₯Ό μ˜¬λ°”λ₯΄κ²Œ μ΄ν•΄ν•˜μ—¬μ•Ό ν•œλ‹€
μ»¨ν…Œμ΄λ„ˆμ—λŠ” μš”μ†Œλ“€μ΄ μ €μž₯λ˜μ–΄ μžˆλ‹€
μš”μ†Œμ— μ ‘κ·Όν•˜λ €λ©΄?

μ˜ˆμ „ 방법
λ°°μ—΄κ³Ό λ²‘ν„°λŠ” 인덱슀λ₯Ό μ‚¬μš©ν•˜μ—¬ μš”μ†Œμ— μ ‘κ·Ό κ°€λŠ₯
κ·ΈλŸ¬λ‚˜ 랜덀 접근을 ν—ˆμš©ν•˜μ§€ μ•ŠλŠ” μ—°κ²° λ¦¬μŠ€νŠΈμ—μ„œλŠ” μΈλ±μŠ€λŠ” μ‚¬μš©ν•  수 μ—†κ³  μ•„λ§ˆ 포인터λ₯Ό μ‚¬μš©ν•˜μ—¬μ•Ό ν•  것
λ¬Έμ œλŠ” μ»¨ν…Œμ΄λ„ˆμ˜ μ’…λ₯˜μ— λ”°λΌμ„œ μš”μ†Œμ— μ ‘κ·Όν•˜λŠ” 방법이 μƒλ‹Ήνžˆ λ‹€λ₯΄λ‹€λŠ” 것
λ”°λΌμ„œ 일반적인 방법을 μ°Ύμ•„μ•Ό ν•œλ‹€

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
vector<int> vec;
for (vector<int>::iterator it = vec.begin(); it != c.end(); it++) // old
for (auto it = vec.begin(); it != c.end(); it++)
	cout << *it << " ";
for (auto& n : v)
	cout << n << " ";

λ°˜λ³΅μžλŠ” μ½”λ“œ(μ•Œκ³ λ¦¬λ“¬)을 데이터에 μ—°κ²°ν•˜λŠ” 데 μ‚¬μš©λœλ‹€
μ½”λ“œ μž‘μ„±μžλŠ” λ°˜λ³΅μžμ— λŒ€ν•΄ μ•Œκ³  μžˆμ§€λ§Œ λ°˜λ³΅μžκ°€ μ‹€μ œλ‘œ 데이터에 μ–΄λ–»κ²Œ μ ‘κ·Όν•˜λŠ”μ§€μ— λŒ€ν•΄μ„œλŠ” μžμ„Ένžˆ μ•Œμ§€ μ•ŠμœΌλ©° 데이터 κ³΅κΈ‰μžλŠ” 데이터가 μ €μž₯λ˜λŠ” 방식에 λŒ€ν•œ μ„ΈλΆ€ 정보λ₯Ό ν‘œμ‹œν•˜μ§€ μ•Šκ³  λ‹¨μˆœνžˆ μ‚¬μš©μžμ—κ²Œ 반볡자λ₯Ό μ œκ³΅ν•œλ‹€
λ”°λΌμ„œ λ°˜λ³΅μžλŠ” μ•Œκ³ λ¦¬λ“¬κ³Ό μ»¨ν…Œμ΄λ„ˆ 사이에 독립성을 μ œκ³΅ν•œλ‹€
STL을 μž‘μ„±ν•˜μ˜€λ˜ Alex StepanovλŠ” λ‹€μŒκ³Ό 같이 말햇닀
STL μ•Œκ³ λ¦¬λ“¬κ³Ό μ»¨ν…Œμ΄λ„ˆκ°€ 잘 μž‘λ™ν•˜λŠ” μ΄μœ λŠ” μ„œλ‘œμ— λŒ€ν•΄ μ•Œμ§€ λͺ»ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€

반볡자의 μ’…λ₯˜

  • μ „ν–₯ 반볡자 Forward Iterator ++μ—°μ‚°μžλ§Œ κ°€λŠ₯ν•˜λ‹€
  • μ–‘λ°©ν–₯ 반볡자 Bidirectional Iterator ++μ—°μ‚°μžμ™€ β€“μ—°μ‚°μžκ°€ κ°€λŠ₯ν•˜λ‹€
  • λ¬΄μž‘μœ„ μ ‘κ·Ό 반볡자 Random Access Iterator ++μ—°μ‚°μžμ™€ – μ—°μ‚°μž, []μ—°μ‚°μžκ°€ κ°€λŠ₯ν•˜λ‹€
    • i.e. 벑터

ν•˜μ§€λ§Œ μ΅œμ‹  버전인 C++11μ—μ„œλŠ” λ²”μœ„κΈ°λ°˜λ£¨ν”„ Range-Based Loop 문법을 λ„μž…ν•˜λ©΄μ„œ 반볡자λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” ν•„μš”μ„±μ΄ 크게 κ°μ†Œλ˜μ—‡λ”°
ν•˜μ§€λ§Œ μ»¨ν…Œμ΄λ„ˆμ˜ 쀑간에 μ‚½μž…ν•˜λŠ” κ²½μš°μ—λŠ” λ°˜λ“œμ‹œ 반볡자λ₯Ό μ‚¬μš©ν•˜μ—¬μ•Ό ν•œλ‹€
그리고 std 이름 곡간 μ•ˆμ— begin()κ³Ό end() ν•¨μˆ˜κ°€ μΆ”κ°€λ˜μ—ˆλŠ”λ° 이듀은 μ»¨ν…Œμ΄λ„ˆμ˜ begin() 멀버 ν•¨μˆ˜μ™€ end() 멀버 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•΄μ£ΌλŠ” κΈ°λŠ₯을 ν•œλ‹€

μ»¨ν…Œμ΄μ–΄μ˜ 곡톡 멀버 ν•¨μˆ˜

  • Container() κΈ°λ³Έ μƒμ„±μž
  • Container(size) 크기가 size인 μ»¨ν…μ΄λ„ˆ 생성
  • Container(size, value) 크기가 size이고 μ΄ˆκΈ°κ°’μ΄ value인 μ»¨ν…Œμ΄λ„ˆ 생성
  • Container(iterator, iterator) λ‹€λ₯Έ μ»¨ν…Œμ΄λ„ˆλΆ€ν„° μ΄ˆκΈ°κ°’μ˜ λ²”μœ„λ₯Ό λ°›μ•„μ„œ 생성
  • begin() 첫 번째 μš”μ†Œμ˜ 반볡자 μœ„μΉ˜
  • clear() λͺ¨λ“  μš”μ†Œλ₯Ό μ‚­μ œ
  • empty() λΉ„μ–΄μžˆλŠ”μ§€λ₯Ό 검사
  • end() λ°˜λ³΅μžκ°€ λ§ˆμ§€λ§‰ μš”μ†Œλ₯Ό μ§€λ‚œ μœ„μΉ˜
  • erase(iterator) μ»¨ν…Œμ΄λ„ˆμ˜ 쀑간 μš”μ†Œλ₯Ό μ‚­μ œ
  • erase(iterator, iterator) μ»¨ν…Œμ΄λ„ˆμ˜ μ§€μ •λœ λ²”μœ„λ₯Ό μ‚­μ œ
  • front μ»¨ν…Œμ΄λ„ˆμ˜ 첫 번재 μš”μ†Œ λ°˜ν™˜
  • insert(iterator, value) μ»¨ν…Œμ΄λ„ˆμ˜ 쀑간에 μš”μ†Œ μ‚½μž…
  • pop_back μ»¨ν…Œμ΄λ„ˆμ˜ λ§ˆμ§€λ§‰ μš”μ†Œλ₯Ό μ‚­μ œ
  • push_back(value) μ»¨ν…Œμ΄λ„ˆμ˜ 끝에 데이터λ₯Ό μΆ”κ°€
  • rbegin 끝을 λ‚˜νƒ€λ‚΄λŠ μ—­λ°˜λ³΅μž
  • rend μ—­λ°˜λ³΅μžκ°€ μ²˜μŒμ„ μ§€λ‚œ μœ„μΉ˜
  • size μ»¨ν…Œμ΄λ„ˆμ˜ 크기
  • operator=(Container) λŒ€μž… μ—°μ‚°μžμ˜ 쀑볡 μ •μ˜

μ»¨ν…Œμ΄λ„ˆ μ–΄λŒ‘ν„° Container Adapter ν΄λž˜μŠ€λŠ” 이미 μ‘΄μž¬ν•˜λŠ” μ»¨ν…Œμ΄λ„ˆλ₯Ό λ³€κ²½ν•˜μ—¬ μƒˆλ‘œμš΄ κΈ°λŠ₯을 μ œκ³΅ν•˜λŠ” 클래슀
즉 기쑴의 μ»¨ν…Œμ΄λ„ˆμ˜ κΈ°λŠ₯을 κ·ΈλŒ€λ‘œ μ΄μš©ν•˜λ©΄μ„œ μƒˆλ‘œμš΄ κΈ°λŠ₯μ΄λ‚˜ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ œκ³΅ν•˜λŠ” 것
μŠ€νƒ, 큐, μš°μ„ μˆœμœ„ 큐 등이 μžˆλ‹€

μŠ€νƒμ€ μ„ ν˜•μ μΈ 자료ꡬ쑰만 있으면 λœλ‹€
μ€‘κ°„μ—μ„œ 데이터λ₯Ό μΆ”κ°€ν•˜κ±°λ‚˜ μ‚­μ œν•˜λŠ” κΈ°λŠ₯은 ν•„μš” μ—†λ‹€, 였히렀 순차 μ»¨ν…Œμ΄λ„ˆμ˜ κΈ°λŠ₯이 λ„ˆλ¬΄ λ§Žμ•„μ„œ κΈ°λŠ₯을 μ œμ•½ν•΄μ•Ό μŠ€νƒμ„ λ§Œλ“€ 수 μžˆλ‹€
μŠ€νƒμ€ dequeλ₯Ό λ””ν΄νŠΈλ‘œ λ§Œλ“€μ–΄μ‘Œλ‹€
λ‹€λ₯Έ μ»¨ν…Œμ΄λ„ˆλ‘œ λ§Œλ“€κ³  μ‹ΆμœΌλ©΄
stack<string, vector<string>> st; 처럼 두 번째 인자λ₯Ό λ„˜κ²¨μ£Όλ©΄ λœλ‹€

μš°μ„ μˆœμœ„ 큐
νžˆν”„λ₯Ό λ‚΄λΆ€μ μœΌλ‘œ μ‚¬μš©

  • μž‘μ—… μŠ€μΌ€μ€„λ§

STL μ•Œκ³ λ¦¬λ“¬
탐색 μ •λ ¬ κ°œμˆ˜μ„ΈκΈ° 같은 일반적인 μ•Œκ³ λ¦¬λ“¬μ€ ν”„λ‘œκ·Έλž¨μ—μ„œ 널리 μ‚¬μš©λœλ‹€
STL은 μ΄λŸ¬ν•œ λ¬Έμ œλ“€μ„ ν•΄κ²°ν•˜μ§€ μœ„ν•΄ ν…œν”Œλ¦Ώ 기반의 ν•¨μˆ˜λ₯Ό 제곡
거의 λͺ¨λ“  μ»¨ν…Œμ΄λ„ˆμ— λŒ€ν•΄ 같은 λ°©μ‹μœΌλ‘œ λ™μž‘ -> ν…œν”Œλ¦Ώμ„ 톡해 μΌλ°˜ν™” ν”„λ‘œκ·Έλž˜λ°μ„ μ μš©ν•˜κ³  μžˆλŠ”κ²ƒ

STl μ•Œκ³ λ¦¬λ“¬μ€ 일반적으둜 반볡자λ₯Ό μ‚¬μš©ν•˜μ—¬ 주어진 νƒ€μž…μœΌλ‘œ μƒμ„±λœ μ»¨ν…Œμ΄λ„ˆμ— μ ‘κ·Ό
λ°˜λ³΅μžλŠ” μ•Œκ³ λ¦¬λ“¬κ³Ό μ»¨ν…Œμ΄λ„ˆλ₯Ό μ—°κ²°ν•˜λŠ” 역할을 ν•œλ‹€
이 라이브러리λ₯Ό μ‚¬μš©ν•˜λŠ” μ½”λ“œλŠ” ν”„λ‘œκ·Έλž˜λ¨Έκ°€ 직접 μž‘μ„±ν•œ μ½”λ“œμ™€ λΉ„κ΅ν•˜μ—¬λ„ νš¨μœ¨μ„±μ— μžˆμ–΄μ„œ 손색이 μ—†λ‹€
μ“°λŸ¬λ©΄ <algorithm> 헀더

  • λΆˆλ³€κ²½ μ•Œκ³ λ¦¬λ“¬ (μ»¨ν…Œμ΄λ„ˆκ°€ μ•ˆλ³€κ²½λ˜λŠ”)
    • 개수
      • 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; }



size_t, unsigned int
size_t, unsigned int
size_t, unsigned int
νŠΉμ • 문자 제거 erase remove
νŠΉμ • 문자 제거 erase remove
string μƒμ„±μž
λ°°μ—΄ νŠΉμ • μš”μ†Œ 개수
Vector 탐색
size_t, unsigned int
size_t, unsigned int
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);
}

for (auto item : ~)
for (auto& item : ~)

iter find
string find

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

string::npos == -1
find μ‹€νŒ¨ μ‹œ 리턴

pow sqrt -> cmath
min max -> algorithm

rotate

toupper, tolower
isupper, islower, isdigit, isalpha

split λŒ€μ‹ 

1
2
3
4
5
6
7
#include <sstream>
stringstream ss(s);  
string word;
while (ss >> word)
{
	cout << word << endl;
}

ceil ceiling 올림
round 반올림
floor floor λ‚΄λ¦Ό

vector v2(v1)

memset(ptr, value, size)

μ˜€λ¦„μ°¨μˆœ μ •λ ¬λ˜μ–΄ μžˆλŠ” μžλ£Œκ΅¬μ‘°μ— λŒ€ν•˜μ—¬,
lower_bound : k <= μš”μ†Œκ°€ λ°°μ—΄ λͺ‡ λ²ˆμ§Έμ— 처음 λ“±μž₯ν•˜λŠ” 지
upper_bound : k < μš”μ†Œκ°€ λ°°μ—΄ λͺ‡ λ²ˆμ§Έμ— 처음 λ“±μž₯ν•˜λŠ” 지
iterator둜 λ°˜ν™˜λ˜λ―€λ‘œ 자료ꡬ쑰 μ£Όμ†Œλ₯Ό λΉΌμ£Όλ©΄ μΈλ±μŠ€κ°€ λ‚˜μ˜΄

νŠΉμ • λ²”μœ„μ˜ μˆ«μžκ°€ λͺ‡ 번 λ‚˜μ˜€λŠ” 지

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

C++ C3861
μ—λŸ¬ : β€˜λ­μ‹œκΉ½β€™ μ‹λ³„μžλ₯Ό 찾을 수 μ—†μŠ΅λ‹ˆλ‹€.
ν•΄κ²° : ν•¨μˆ˜ μœ„μΉ˜ λ°‘ μ„ μ–Έ 확인


C++ C2360, C++ C2361
μ—λŸ¬ : β€˜λ­μ‹œκΉ½β€™ μ΄ˆκΈ°ν™”κ°€ β€˜case’/’default’ λ ˆμ΄λΈ”μ— μ˜ν•΄ μƒλž΅λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
ν•΄κ²° : λ³€μˆ˜ μ„ μ–Έν•˜λŠ” case에 μŠ€μ½”ν”„ {} 달아주기
μ„€λͺ… : case/default 이전 κ³΅κ°„μ—μ„œλŠ” λ©”λͺ¨λ¦¬ ν• λ‹Ή μ•ˆλ¨

포인터 delete ν›„ μ–΄λ–€ μ½”λ“œκ°€ 없더라도 = nullptr λŒ€μž…


2의배수
int overflow
IEEE-754 format

μ‹€μˆ˜μ˜ μ„±μ§ˆ
μ €μž₯/μ—°μ‚° κ³Όμ •μ—μ„œ λ°˜λ“œμ‹œ μ˜€μ°¨κ°€ λ°œμƒν•œλ‹€
μ‹€μˆ˜λŠ” double을 μ“Έ 것
보톡 μ‹€μˆ˜λ₯Ό μ¨μ•Όν•˜λŠ” 문제라면 μ˜€μ°¨λ²”μœ„λ₯Ό μ•Œλ €μ£ΌλŠ”λ°, μ—†μœΌλ©΄ μ •μˆ˜λ§ŒμœΌλ‘œ ν’€ 수 μžˆλŠ” 문제일 것

double에 long long을 담지 말 것 (λ²”μœ„λ‘œ μΈν•œ 였차)

μ‹€μˆ˜λ₯Ό 비ꡐ할 λ•Œ λΆ€ν˜Έλ₯Ό 쓰지 말 것 (λ§ˆμ°¬κ°€μ§€λ‘œ 였차)
if (abs(a-b) - 1e-12) (10-12)

STL을 쌩으둜 ν•¨μˆ˜ μΈμžμ— λ„£μ–΄μ„œ 보내면 λ³΅μ‚¬ν•΄μ„œ 보낸닀

ν‘œμ€€ μž…μΆœλ ₯

c scanf printf (C++의 string을 μ“Έ 수 μ—†λ‹€)

c scanf printf
c++ cin cout
λ‘˜ λ‹€ 곡백 포함 λ¬Έμžμ—΄ μž…λ ₯을 λ°›κΈ° μ–΄λ €μš΄λ°

3가지 방법이 μžˆλ‹€

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
// 1. scanf의 μ˜΅μ…˜
char a1[10];
scanf("%[^\n]", a1);

// 2. gets ν•¨μˆ˜ (λ³΄μ•ˆμƒμ˜ 이유둜 C++14 μ΄μƒμ—μ„œλŠ” 제거됨)
char a2[10];
gets(a2);
puts(a2);

// 3. getline ν•¨μˆ˜
string s;
getline(cin, s);
cout << s;

// cin cout을 μ“Έ λ•Œ  
// μž…μΆœλ ₯이 많으면 μ‹œκ°„μ΄ˆκ³Όκ°€ λ‚  수 있음

```cpp
ios::sync_with_stdio(0);
// or
ios::sync_with_stdio(false);

// scanf printf μ—μ„œ μ“°λŠ” c streamκ³Ό  
// cin cout μ—μ„œ μ“°λŠ” cpp stream이 λΆ„λ¦¬λ˜μ–΄μžˆλ‹€  

// 근데  

cout << "11111\n";
printf("22222\n");
cout << "33333\n";

// 같이 μ„žμ–΄ μ“°λŠ” 상황이면  
// μˆœμ„œλŒ€λ‘œ μ‹€ν–‰ λ˜λŠ”κ²Œ 일단 직관적이기 λ•Œλ¬Έμ— c streamκ³Ό cpp stream을 동기화 μ‹œμΌœμ£Όκ³  μžˆλ‹€  

// 근데 cpp stream만 μ“°λŠ” κ±°λ©΄ ꡳ이 동기화 ν•  ν•„μš”κ°€ μ—†μŒ  
// μ‹œκ°„μ  이득을 μ–»κΈ° μœ„ν•΄ λŠμ–΄μ£ΌκΈ°  

// vs2017 2019μ—μ„œλŠ” 써도 κ°•μ œμ μœΌλ‘œ 동기화λ₯Ό 해버림  
// 채점 μ„œλ²„λŠ” gcc라 차이가 있음  

cin.tie(0);
// or
cin.tie(nullptr);

// μž…μΆœλ ₯ 버퍼  
// λ²„νΌμ—μ„œ λͺ¨μ•˜λ‹€κ°€ μž…λ ₯/좜λ ₯  

for (~)
{
	cin >> a >> b;
	cout << a + b << '\n';
}

// 이것도 μˆœμ„œλŒ€λ‘œ λ‚˜μ˜€λŠ” 게 μ§κ΄€μ μ΄λ‹ˆκΉŒ
// μ§€λ³Έμ μœΌλ‘œλŠ” cin λͺ…령을 μˆ˜ν–‰ν•˜κΈ° 전에 cout 버퍼λ₯Ό λΉ„μ›Œμ€€λ‹€ (좜λ ₯을 ν•œλ‹€)

// 근데 온라인 채점 μ„œλ²„λŠ” κ·Έλƒ₯ 좜λ ₯κ°’λ§Œ 보고 채점을 ν•œλ‹€
// ꡳ이 cin λͺ…령을 μˆ˜ν–‰ν•˜κΈ° 전에 cout을 λΉ„μ›Œμ£Όμ§€ μ•Šμ•„λ„ 됨
// κ·Έκ±Έ λŠμ–΄μ£ΌλŠ”

// endl
// κ°œν–‰λ¬Έμžλ₯Ό 좜λ ₯ν•˜κ³  버퍼λ₯Ό λΉ„μ›Œμ£ΌλŠ”
// 버퍼λ₯Ό λΉ„μ›Œμ€„ μ΄μœ κ°€ μ—†μœΌλ‹ˆκΉŒ μ ˆλŒ€ 쓰지 말 것

μ½”λ”© ν…ŒμŠ€νŠΈμ™€ κ°œλ°œμ€ λ‹€λ₯΄λ‹€
ν΄λ¦°μ½”λ“œλ₯Ό μ§œλŠ”κ²Œ μ•„λ‹ˆλΌ, μ œν•œλœ μ‹œκ°„μ•ˆμ— λ‚΄κ°€ νŽΈν•œ λ°©λ²•μœΌλ‘œ 정닡을 λ§žμΆ”λŠ” 게 더 μ€‘μš”

좜λ ₯ λ§ˆμ§€λ§‰μ— 곡백, μ€„λ°”κΏˆμ΄ μΆ”κ°€λ‘œ μžˆμ–΄λ„ 상관이 μ—†λ‹€

λ””λ²„κ±°λŠ” ꡳ이 μ‚¬μš©ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€.
κ·Έλƒ₯ cout

이 κΈ°μ‚¬λŠ” μ €μž‘κΆŒμžμ˜ CC BY 4.0 λΌμ΄μ„ΌμŠ€λ₯Ό λ”°λ¦…λ‹ˆλ‹€.