์๋ ํ์ธ์, ์ซ๋๋ฏธ์ ๋๋ค.
์ฃผ์ธ์ด๊ฐ C++์ด์ง๋ง Java, Python ์ธ์ด ๊ด๋ จ ์ง์๋ ์ฒจ๋ถํ ์ ์ฐธ๊ณ ๋ถํ๋๋ฆฝ๋๋ค.
ํ๋ฆฐ ๋ด์ฉ์ด ์๋ค๋ฉด ๋๊ธ๋ก ์๋ ค์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
๐ฃ๏ธ ํจ์ ํฌ์ธํฐ๊ฐ ๋ฌด์์ธ๊ฐ์? ๋ช ๋ฐ์ดํธ์ธ์ง๋ ๋ง์ํด ์ฃผ์ธ์.
ํจ์ ํฌ์ธํฐ๋ ํน์ ํจ์๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ฐ ์ฌ์ฉ๋๋ ํฌ์ธํฐ์ ๋๋ค. ์ํฉ์ ๋ฐ๋ผ ๋ค๋ฅธ ํจ์๋ฅผ ์คํํด์ผ ํ ๋, ๋งค๋ฒ ์กฐ๊ฑด์ ํ์ธํ์ฌ ํด๋น ํจ์๋ฅผ ํธ์ถํ๋ ๊ฒ์ ๋นํจ์จ์ ์ผ ์ ์์ต๋๋ค. ์ด๋ ํจ์ ํฌ์ธํฐ๋ฅผ ํ์ฉํ๋ฉด, ์ฒ์์ ํ ๋ฒ๋ง ์กฐ๊ฑด์ ์ฒดํฌํ์ฌ ์ ์ ํ ํจ์๋ฅผ ํจ์ ํฌ์ธํฐ๋ก ์ง์ ํฉ๋๋ค. ๊ทธ ํ์๋ ์กฐ๊ฑด์ ๋ค์ ๊ฒ์ฌํ ํ์ ์์ด ํด๋น ํจ์ ํฌ์ธํฐ๋ฅผ ํธ์ถํจ์ผ๋ก์จ, ์ฝ๋๋ฅผ ๋ณด๋ค ๊ฐ๊ฒฐํ๊ณ ํจ์จ์ ์ผ๋ก ์์ฑํ ์ ์์ต๋๋ค. ์ด ๋ฐฉ๋ฒ์ ํ๋ก๊ทธ๋จ์ ๊ฐ๋ ์ฑ์ ๋์ด๊ณ , ์ ์ง ๋ณด์๋ฅผ ์ฉ์ดํ๊ฒ ํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
ํจ์ ํฌ์ธํฐ์ ํฌ๊ธฐ๋ ์์คํ ์ํคํ ์ฒ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. 32๋นํธ ์์คํ ์์๋ 4๋ฐ์ดํธ, 64๋นํธ ์์คํ ์์๋ 8๋ฐ์ดํธ๋ฅผ ์ฐจ์งํฉ๋๋ค. ์ด๋ ์ผ๋ฐ์ ์ธ ํฌ์ธํฐ์ ํฌ๊ธฐ์ ๊ฐ์ต๋๋ค.
์๋ ์ฝ๋์๋ condition ๋ณ์์ ๊ฐ์ ๋ฐ๋ผ functionA ๋๋ functionB ์ค ํ๋๊ฐ functionPointer์ ํ ๋น๋ฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋งค๋ฒ ์กฐ๊ฑด์ ์ฒดํฌํ ํ์ ์์ด, functionPointer()๋ฅผ ํธ์ถํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
#include <iostream>
void functionA() {
std::cout << "Function A is called." << std::endl;
}
void functionB() {
std::cout << "Function B is called." << std::endl;
}
int main() {
void (*functionPointer)(); // ํจ์ ํฌ์ธํฐ ์ ์ธ
bool condition = true; // ์กฐ๊ฑด ๋ณ์
// ์กฐ๊ฑด์ ๋ฐ๋ผ ํจ์ ํฌ์ธํฐ๋ฅผ ๋ค๋ฅธ ํจ์์ ํ ๋น
if (condition) {
functionPointer = functionA;
} else {
functionPointer = functionB;
}
// ํจ์ ํฌ์ธํฐ๋ฅผ ํตํด ํจ์ ํธ์ถ
functionPointer();
return 0;
}
๐ฃ๏ธ ๋งต๊ณผ ํด์ ๋งต์ ๋ํด์ ์ค๋ช ํ๊ณ , ์ด๋ค ๊ฒฝ์ฐ์ ์ด๋ค ๋งต์ ์ฐ๋ ๊ฒ ์ข์์ง ์ด์ผ๊ธฐํด๋ณด์ธ์
C++์์ Map๊ณผ Hash Map์ (Key, Value)์ผ๋ก ์ด๋ค์ง pair๊ฐ์ฒด๋ฅผ ์ ์ฅํ๋ ์ฐ๊ด ์ปจํ ์ด๋์ ๋๋ค.
์ด ๋ ์ปจํ
์ด๋๋ ์ฌ์ฉ ๋ชฉ์ ๊ณผ ๋ด๋ถ ๊ตฌํ ๋ฐฉ์์์ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
1. map
`std::map`์ ๊ท ํ ์ด์ง ํธ๋ฆฌ (๋ณดํต ๋ ๋-๋ธ๋ ํธ๋ฆฌ)๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํ๋ฉ๋๋ค.
๊ฐ ์์๋ ํค์ ์ํด ์๋์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌ๋๋ฉฐ, ์ค๋ณต ํค๋ฅผ ํ์ฉํ์ง ์์ต๋๋ค.
ํ์, ์ฝ์
, ์ญ์ ์์
์ ์ผ๋ฐ์ ์ผ๋ก `O(log n)` ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋๋ค.
์์์ ์ ๋ ฌ๋ ์ํ๋ฅผ ์ ์งํด์ผ ํ๋ค๋ฉด ํนํ ์ ์ฉํฉ๋๋ค.
std::map<std::string, int> map;
map["apple"] = 5;
map["banana"] = 8;
2. unordered_map
`std::unordered_map`์ ํด์ ํ
์ด๋ธ์ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํ๋ฉ๋๋ค.
๊ฐ ์์๋ ํด์ ํจ์์ ์ํด ๋ฒํท์ ์ ์ฅ๋๋ฉฐ, ํค์ ์์๋ฅผ ๋ณด์ฅํ์ง ์์ต๋๋ค.
์ด ์์๋ค์ ํด์ ํจ์์ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ์ ์ฅ๋๋ฏ๋ก ์์๊ฐ ๋ถ๊ท์นํฉ๋๋ค.
๋ํ map๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ค๋ณต ํค๋ฅผ ํ์ฉํ์ง ์์ต๋๋ค.
- ์ค๋ณต ํค๋ฅผ ํ์ฉํ๋ ํด์ ๊ธฐ๋ฐ ์ปจํ ์ด๋๊ฐ ํ์ํ๋ค๋ฉด, std::unordered_multimap์ ์ฌ์ฉํ ์ ์์ต๋๋ค. std::unordered_multimap์ ๋์ผํ ํค์ ์ฌ๋ฌ ๊ฐ์ ์ ์ฅํ ์ ์์ต๋๋ค.
ํ๊ท ์ ์ธ ๊ฒฝ์ฐ ์ฝ์
, ์ญ์ , ํ์ ์์
์ด `O(1)` ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋, ์ต์
์ ๊ฒฝ์ฐ `O(n)`์ด ๋ ์ ์์ต๋๋ค.
`std::unordered_map`์ ๋น ๋ฅธ ์ ๊ทผ ์๋๊ฐ ํ์ํ ๋, ํนํ ์์์ ์์๊ฐ ์ค์ํ์ง ์์ ๋ ์ ์ฉํฉ๋๋ค.
std::unordered_map<std::string, int> hashMap;
hashMap["apple"] = 5;
hashMap["banana"] = 8;
`std::map`
ํค-๊ฐ ์์ด ํน์ ์์(์: ์ฌ์ ์, ์ค๋ฆ์ฐจ์, ๋ด๋ฆผ์ฐจ์)๋ก ์ ๋ ฌ๋์ด์ผ ํ ๋.
์ค๊ฐ ์ค๊ฐ์ ์์์ ์ฝ์
๊ณผ ์ญ์ ๊ฐ ๋น๋ฒํ๊ฒ ์ผ์ด๋๊ณ , ์ด ๋ ์ ๋ ฌ ์ํ๋ฅผ ์ ์งํด์ผ ํ ๋.
(๋ฐ์ดํฐ์ ๋ณ๋์ด ์์ฃผ ๋ฐ์ํ๋ ๊ฒฝ์ฐ์๋ unordered_map์ด ์ผ๋ฐ์ ์ผ๋ก ๋ ๋น ๋ฅธ ์ฑ๋ฅ์ ๋ณด์ผ ์ ์์ต๋๋ค. ํ์ง๋ง ๋ฐ์ดํฐ๊ฐ ์ ๋ ฌ๋ ์ํ๋ฅผ ์ ์งํด์ผ ํ๋ ๊ฒฝ์ฐ์๋ map์ด ๋ ์ ํฉํ ์ ์์ต๋๋ค. `unordered_map`์ ์ผ๋ฐ์ ์ผ๋ก ๋ ๋น ๋ฅธ ์ฑ๋ฅ์ ์ ๊ณตํ์ง๋ง, ํน์ ์ํฉ์์๋ `std::map`์ ์ ๋ ฌ ๊ธฐ๋ฅ์ด ๋ ์ ๋ฆฌํ ์ ์์ต๋๋ค. )
`std::unordered_map`
์ฝ์
, ์ญ์ , ํ์ ์์
์ ์๋๊ฐ ์ค์ํ ๊ฒฝ์ฐ, ํนํ ๋๋์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋.
์์์ ์์๊ฐ ์ค์ํ์ง ์๊ฑฐ๋, ํค-๊ฐ ์์ ์ ๋ ฌ์ด ๋ถํ์ํ ๊ฒฝ์ฐ.
๐ฃ๏ธ call by value, call by reference ์ฐจ์ด๊ฐ ๋ฌด์์ธ๊ฐ์?
value์ ๊ฒฝ์ฐ ๋ฐ์ดํฐ ๊ฐ์ ๋ณต์ฌํด์ ํจ์๋ก ์ ๋ฌํ๊ธฐ ๋๋ฌธ์ ์๋ณธ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค. ๋ํ ์ธ์๋ฅผ ๋๊ฒจ์ค ๋ ๋ง๋ค ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ ๋นํ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ข ๋ ์ฌ์ฉํด์ผํฉ๋๋ค.
reference์ ๊ฒฝ์ฐ๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ ํ ๋น์ ๋ฌธ์ ๋ฅผ ๋ฒ์ด๋ฉ๋๋ค. ์ฐธ์กฐํ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝ์ ์๋ณธ ๋ฐ์ดํฐ ๊ฐ์ด ๋ณ๊ฒฝ๋๊ธฐ ๋๋ฌธ์ ์ ๊ฒฝ์จ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
๐ฃ๏ธ ์ค๋งํธ ํฌ์ธํฐ์ ๋ํด์ ์ค๋ช ํด์ฃผ์ธ์.
C++์์ ๋ฉ๋ชจ๋ฆฌ ๋์(memory leak)๋ก๋ถํฐ ํ๋ก๊ทธ๋จ์ ์์ ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ์ค๋งํธ ํฌ์ธํฐ๋ฅผ ์ ๊ณตํ๊ณ ์์ต๋๋ค. ํฌ์ธํฐ์ฒ๋ผ ๋์ํ๋ ํด๋์ค ํ ํ๋ฆฟ์ผ๋ก ์ฌ์ฉ์ด ๋๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋์ผ๋ก ํด์ ํด์ค๋๋ค.
`unique_ptr`
ํ๋์ ์ค๋งํธ ํฌ์ธํฐ๋ง์ด ํน์ ๊ฐ์ฒด๋ฅผ ์์ ํ ์ ์๋๋ก ๊ฐ์ฒด์ ์์ ๊ถ ๊ฐ๋ ์ ๋์ ํ ํฌ์ธํฐ์ ๋๋ค. ์ด ์ค๋งํธ ํฌ์ธํฐ๋ ํด๋น ๊ฐ์ฒด์ ์์ ๊ถ์ ๊ฐ์ง๊ณ ์์ ๋๋ง, ์๋ฉธ์๊ฐ ํด๋นํ๋ ๊ฐ์ฒด๋ฅผ ์ญ์ ํ ์ ์์ต๋๋ค.
`shared_ptr`
์ฐธ์กฐํ๋ ์ค๋งํธ ํฌ์ธํฐ๊ฐ ์ด ๋ช ๊ฐ์ธ์ง ์ฐธ์กฐํ๋ ์ค๋งํธ ํฌ์ธํฐ์ ๋๋ค. ์ด๋ ๊ฒ ์ฐธ์กฐํ๊ณ ์๋ ์ค๋งํธ ํฌ์ธํฐ์ ๊ฐ์๋ฅผ ์ฐธ์กฐ ํ์๋ผ๊ณ ํฉ๋๋ค. ์ฐธ์กฐ ํ์๋ ํน์ ๊ฐ์ฒด์ ์๋ก์ด `shared_ptr`์ด ์ถ๊ฐ๋ ๋ ๋ง๋ค `1`์ฉ ์ฆ๊ฐํ๊ณ ์๋ช ์ด ๋คํ ๋ `1`์ฉ ๊ฐ์ํฉ๋๋ค. ์ฐธ์กฐ ํ์๊ฐ `0`์ด ๋๋ฉด ์๋์ผ๋ก `delete` ํค์๋๊ฐ ๋ถ๋ฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํฉ๋๋ค.
`weak_ptr`
ํ๋ ์ด์์ `shared_ptr`์ธ์คํด์ค๊ฐ ์์ ํ๋ ๊ฐ์ฒด์ ๋ํ ์ ๊ทผ์ ์ ๊ณตํ์ง๋ง, ์์ ์์ ์์๋ ํฌํจ๋์ง ์๋ ์ค๋งํธ ํฌ์ธํฐ์ ๋๋ค. ๋ง์ฝ ์๋ก๊ฐ ์๋๋ฐฉ์ ๊ฐ๋ฆฌํค๋ `shared_ptr`๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ฉด, ์ฐธ์กฐ ํ์๋ ์ ๋ `0`์ด ๋์ง ์์ผ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ๋ ์์ํ ํด์ ๋์ง ์์ต๋๋ค. ์ด๋ ๊ฒ ์๋ก๊ฐ ์๋๋ฐฉ์ ์ฐธ์กฐํ๊ณ ์๋ ์ํฉ์ ์ํ ์ฐธ์กฐ๋ผ๊ณ ํฉ๋๋ค. `weak_ptr`์ ๋ฐ๋ก `shared_ptr`์ธ์คํด์ค ์ฌ์ด์ ์ํ ์ฐธ์กฐ๋ฅผ ์ ๊ฑฐํ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
๐ฃ๏ธ ๋๋ค๋?
์ฝ๊ฒ ๋งํด ์ด๋ฆ์ด ์๋ ํจ์์ ๋๋ค. ์บก์ณ, ์ธ์, ๋ฐํํ, ๋ชธํต์ผ๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ ๋ฐํ์ ์ ์ด๋ฆ์ ์์ง๋ง, ๋ฉ๋ชจ๋ฆฌ ์์ ์์์ ์ผ๋ก ์กด์ฌํ๋ ํด๋ก์ ธ ๊ฐ์ฒด๊ฐ ์์ฑ๋ฉ๋๋ค.
์บก์ณ ํ๋ ๋ฐฉ๋ฒ (์บก์ณ์ ๋ฒ์๋ ์ ์ญ)
- `[a,&b]` a๋ฅผ ๋ณต์ฌ๋ก ์บก์ฒ, b๋ฅผ ์ฐธ์กฐ๋ก ์บก์ฒ.
- `[this]` ํ์ฌ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐ๋ก ์บก์ฒ.
- `[&]` ๋ชธํต์์ ์ฐ์ด๋ ๋ชจ๋ ๋ณ์๋ ์์๋ฅผ ์ฐธ์กฐ๋ก ์บก์ฒํ๊ณ ํ์ฌ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐ๋ก ์บก์ฒ.
- `[=]` ๋ชธํต์์ ์ฐ์ด๋ ๋ชจ๋ ๋ณ์๋ ์์๋ฅผ ๋ณต์ฌ๋ก ์บก์ฒํ๊ณ ํ์ฌ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐ๋ก ์บก์ฒ.
- `[]` ์๋ฌด๊ฒ๋ ์บก์ฒํ์ง ์์.
๐ฃ๏ธ ์ ์ ์ฐ์ฐ๊ณผ ํ์ ์ฐ์ฐ์ ์ฐจ์ด๊ฐ ๋ฌด์์ธ๊ฐ์?
์ ์์ฐ์ฐ๊ณผ ํ์์ฐ์ฐ๊ณผ์ ์ฐจ์ด๋ ์์๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ ๋ฆฌํดํ๋๊ฐ? ์ ์ฐจ์ด ์ ๋๋ค.
Debug ๋ชจ๋์ ๊ฒฝ์ฐ์๋ ํ์์ฐ์ฐ์์ ๊ฒฝ์ฐ์๋ ์์๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ๋ฆฌํดํ์ฌ ๋น์ฐํ ์ ์์ฐ์ฐ๋ณด๋ค ๋๋ฆฌ์ง๋ง,
Release ๋ชจ๋์์๋ ์ปดํ์ผ๋ฌ์ ์ต์ ํ๋ก ๋์ ์ฑ๋ฅ์ ๊ฐ๋ค๊ณ ํฉ๋๋ค.
๐ฃ๏ธ ์ ์ฐจ์งํฅ, ๊ฐ์ฒด์งํฅ์ ์ฐจ์ด๊ฐ ๋ฌด์์ธ๊ฐ์?
์ ์ฐจ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ Top-Down ๋ฐฉ์์ผ๋ก ์ ๊ทผํ๋ฉฐ ์์ฐจ์ ์ธ ์ฒ๋ฆฌ๊ฐ ์ค์์ ๋์ด ํ๋ก๊ทธ๋จ์ด ์ ์ฒด์ ์ผ๋ก ์ฐ๊ฒฐ๋๋๋ก ๋ง๋๋ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ๋ฒ์ ๋๋ค. ๋ํ์ ์ธ ์ ์ฐจ์งํฅ ์ธ์ด๋ C์ธ์ด๊ฐ ์์ต๋๋ค. ํจ์๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๋ฐฉ์์ผ๋ก ์งํ๋ฉ๋๋ค. ์ ์ฐจ์ ํ๋ก๊ทธ๋๋ฐ ์ด๋ผ๋ ๋ง์ด ๋ ์ ํํฉ๋๋ค. ์ฝ๋์ ๊ฐ๋ ์ฑ์ด ์ข๊ณ , ์คํ์๋๊ฐ ๋น ๋ฅด๋ค๋ ์ฅ์ ์ด ์์ง๋ง, ์ ์ง๋ณด์ ๋ฐ ๋๋ฒ๊น ์ด ์ด๋ ต์ต๋๋ค.
๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ Bottom-Up ๋ฐฉ์์ผ๋ก ์ ๊ทผํ๋ฉฐ, ๋ฐ์ดํฐ์ ์ ์ฐจ๋ฅผ ํ๋์ Object๋ก ๋ฌถ์ด์ ์ฒ๋ฆฌํฉ๋๋ค. ๋ชจ๋ํ ๋ฐ ์บก์ํ๋ก ์ ์ง๋ณด์์ ์ฉ์ดํ๋ฉฐ, ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ์ด ๋์ต๋๋ค. ์ฒ๋ฆฌ์๋๊ฐ ์๋์ ์ผ๋ก ๋๋ฆฌ๊ณ , ๋ง์ ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค๋ ๋จ์ ์ด ์์ต๋๋ค.
๐ฃ๏ธ ํจ์ ๊ฐ์ฒด (Function Object, Functor) ๊ฐ ๋ฌด์์ธ๊ฐ์?
ํจ์ ํธ์ถ ์ฐ์ฐ์ `operator()` ๋ฅผ ์ค๋ฒ๋ก๋ฉํ์ฌ ํจ์์ฒ๋ผ ๋์ํ๋ ๊ฐ์ฒด๋ฅผ ๊ตฌํํ ๊ฒ์ ๋๋ค. ํจ์์ ๋ฌ๋ฆฌ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ฉด ์์ฑ์ ์ง๋ ์ ์๋ ๊ฒ์ด ๊ฐ๋ฅํ๊ณ , ํจ์ ๊ฐ์ฒด๊ฐ ์ผ๋ฐ์ ์ธ ํจ์๋ณด๋ค ๋น ๋ฅด๊ธฐ๋ ํ๊ณ ๊ฐ๊ฐ์ ํจ์ ๊ฐ์ฒด๋ ์๋ก ๋ค๋ฅธ ํ์ ์ ์ง๋๋ค๋ ์ฅ์ ์ ์ง๋๋๋ค.
#include <iostream>
// ํจ์ ๊ฐ์ฒด๋ฅผ ์ ์ํ๋ ํด๋์ค
class Adder {
public:
// ์์ฑ์
Adder(int n) : num(n) {}
// ํจ์ ํธ์ถ ์ฐ์ฐ์ ์ค๋ฒ๋ก๋ฉ
int operator()(int i) const {
return num + i;
}
private:
int num;
};
int main() {
Adder add_five(5); // 5๋ฅผ ๋ํ๋ ํจ์ ๊ฐ์ฒด ์์ฑ
std::cout << add_five(3) << std::endl; // 8 ์ถ๋ ฅ (5 + 3)
return 0;
}
๐ฃ๏ธ volatile ํค์๋๊ฐ ๋ฌด์์ธ๊ฐ์?
`volatile` ํค์๋๋ก ์ ์ธ๋ ๋ณ์๋ ์ธ๋ถ์ ์ธ ์์ธ์ผ๋ก ๊ทธ ๊ฐ์ด ์ธ์ ๋ ์ง ๋ฐ๋ ์ ์์์ ๋ปํฉ๋๋ค.
๐ฃ๏ธ ๊ฐ์ ์ํ ์ ๋ฌ๋ณด๋ค, ์ฐธ์กฐ์ ์ํ ์ ๋ฌ์ด ๋ ๋์ ์ด์ ๋ ๋ฌด์์ธ๊ฐ?
๊ฐ์ฒด๊ฐ ๊ฐ์ผ๋ก ์ ๋ฌ๋๋ฉด ๊ฐ์ฒด์ ์๋ก์ด ์ฌ๋ณธ์ด ์์ฑ๋์ด ํจ์์ ์ ๋ฌ๋ฉ๋๋ค. ์ด ์ ๋ฌ ๋ฐฉ์์ ๊ต์ฅํ ํฐ ๋ฒกํฐ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ๋ ๊ฒฝ์ฐ ์ฌ๋ณธ์ ์์ฑํ๋ ๋ฐ ๋น์ฉ์ด ๋ง์ด ๋ญ๋๋ค. ๊ทธ๋์ ํด๋์ค๊ฐ ๋ณต์ฌ ์์ฑ์๋ฅผ `private`์ผ๋ก ์ ์ธํ๋ ๋ฑ์ ๋ฐฉ๋ฒ์ ํตํด, ํด๋ผ์ด์ธํธ๊ฐ ๋ณต์ฌ๋ณธ์ ์์ฑํ์ง ๋ชปํ๊ฒ ํ๋ ๊ฒฝ์ฐ๋ ์์ต๋๋ค.
์ฐธ์กฐ๋ก ์ ๋ฌํ๋ฉด ๊ฐ์ฒด ์์ฒด๊ฐ ์ ๋ฌ๋ฉ๋๋ค. ์ ํํ ๋งํ๋ฉด ํจ์๋ ๊ฐ์ฒด์ ์ฃผ์๋ฅผ ๋ฐ์ต๋๋ค. ์ด ๊ฒฝ์ฐ ํจ์๋ ๋ชฉ์ ์ ๋ฐ๋ผ์ ๊ฐ์ฒด๋ฅผ ์์ ํ ์ ์์ต๋๋ค. ํจ์๊ฐ ๊ฐ์ฒด๋ฅผ ์์ ํ์ง ๋ชปํ๊ฒ ํ๋ ค๋ฉด, `const` ์ฐธ์กฐ๋ก ๊ฐ์ฒด๋ฅผ ์ ๋ฌํด์ผ ํฉ๋๋ค.
๊ฐ์ผ๋ก ์ ๋ฌํ ๋ ๋ฐ์ ๊ฐ๋ฅํ ๋ ๋ค๋ฅธ ๋ฌธ์ ๋ ์ํ์ง ์๋ ์์์ ๋ณํ์ด ์ผ์ด๋ ์ ์๋ค๋ ์ ์ ๋๋ค. ์๋ฅผ ๋ค๋ฉด ํ์ ํด๋์ค๊ฐ ๋คํ์ฑ์ ๋ฐฉ์งํ๋ ๊ธฐ๋ณธ ํด๋์ค๋ก ์บ์คํ ๋ ์ ์์ต๋๋ค.
๐ฃ๏ธ ์ดํฐ๋ ์ดํฐ๋? ์ดํฐ๋ ์ดํฐ์ ํฌ์ธํฐ์ ์ ์ฌ์ ๊ณผ ์ฐจ์ด์ ?
๋ ๋ค ๊ฐ์ ์ป๊ธฐ ์ํด ์ญ์ฐธ์กฐํ ์ ์๋ค๋ ์ ์์ ๋น์ทํฉ๋๋ค. ์ดํฐ๋ ์ดํฐ๋ ์ปจํ ์ด๋์ ์ ์ฅ๋์ด ์๋ ์์๋ค์ ์ฐธ์กฐํ ๋ ์ฌ์ฉํฉ๋๋ค. STL ์ปจํ ์ด๋์ ์ ์ฅ๋ ์์๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ์ํํ์ฌ, ๊ฐ๊ฐ์ ์์์ ๋ํ ์ ๊ทผ์ ์ ๊ณตํ๋ ๊ฐ์ฒด์ ๋๋ค. ์ฆ, ์ปจํ ์ด๋์ ๊ตฌ์กฐ๋ ์์์ ํ์ ๊ณผ๋ ์๊ด์์ด ์ปจํ ์ด๋์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ์ํํ๋ ๊ณผ์ ์ ์ผ๋ฐํํ ํํ์ ๋๋ค. ํ ํ๋ฆฟ์ด ํ์ ๊ณผ ์๊ด์์ด ์๊ณ ๋ฆฌ์ฆ์ ํํํ ์ ์๊ฒ ํด์ค๋ค๋ฉด, ์ดํฐ๋ ์ดํฐ๋ ์ปจํ ์ด๋์ ์๊ด์์ด ์๊ณ ๋ฆฌ์ฆ์ ํํํ ์ ์๊ฒ ํด์ฃผ๋ ๊ฒ์ ๋๋ค.
์ดํฐ๋ ์ดํฐ๋ ํฌ์ธํฐ๋ฅผ ์ผ๋ฐํํ ๊ฒ์ผ๋ก, ํฌ์ธํฐ๋ ๋ฐ๋ณต์๊ฐ ๊ฐ์ ธ์ผํ ๋ชจ๋ ์๊ตฌ ์ฌํญ์ ๋ง์กฑํฉ๋๋ค.
๋ฐ๋ณต์๊ฐ ๊ฐ์ ธ์ผ ํ ๋ชจ๋ ์๊ตฌ ์ฌํญ๊ณผ ์ ์๋์ด์ผ ํ ์ฐ์ฐ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๊ฐ๋ฆฌํค๋ ์์์ ๊ฐ์ ์ ๊ทผํ ์ ์์ด์ผ ํ๋ค. ๋ฐ๋ผ์ ์ฐธ์กฐ ์ฐ์ฐ์๊ฐ ์ ์๋์ด์ผ ํ๋ค.
- ๋ฐ๋ณต์ ์ฌ์ด์ ๋์ ์ฐ์ฐ, ๋น๊ต ์ฐ์ฐ์ด ๊ฐ๋ฅํด์ผ ํ๋ค. ๋ฐ๋ผ์ ๋์ , ๊ด๊ณ ์ฐ์ฐ์๊ฐ ์ ์๋์ด์ผ ํ๋ค.
- ๊ฐ๋ฆฌํค๋ ์์์ ์ฃผ๋ณ ์์๋ก ์ด๋ํ ์ ์์ด์ผ ํ๋ค. ๋ฐ๋ผ์ ์ฆ๊ฐ ์ฐ์ฐ์(++)๊ฐ ์ ์๋์ด์ผ ํ๋ค.
์ถ์ฒ https://song-ift.tistory.com/63
๋ฐ๋ณต์๋ ํฌ์ธํฐ์ ๋ค๋ฅด๊ฒ, ์ปจํ ์ด๋์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ฏ๋ก ๋ฐ๋ณต์์ ๋ํ ์ญ์ ๊ฐ๋ ์ด ์์ต๋๋ค. (์ปจํ ์ด๋๋ RAII ํจํด์ ๋ฐ๋ฅด๋ฉฐ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ๋ด๋นํฉ๋๋ค.)
๐ฃ๏ธ ์์ฑ์๋? ๊ธฐ๋ณธ ์์ฑ์, ๋ณต์ฌ ์์ฑ์, ์ด๋ ์์ฑ์๋ ์ด๋ป๊ฒ ๋ค๋ฅธ๊ฐ?
๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์์ ์์ฑ์๋ ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ๋ฐ ์ฌ์ฉ๋๋ ํน์ํ ํ์ ์ ์๋ธ ๋ฃจํด (๊ฐ์ ํ๋ก์ธ์ค ๋ด์์ Context Switching ์์ด ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ฝ๋ ๋ธ๋ก์ผ๋ก, OS์ ์ง์ ์ ์ธ ๊ด๋ฆฌ ์์ด ์คํ๋๋ค) ์ ๋๋ค. ์์ฑ์๋ ์ฌ์ฉํ ์ ๊ฐ์ฒด๋ฅผ ์ค๋นํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์์ฑ์๋ ํ๋๋ฅผ ์ค์ ํ๊ธฐ ์ํ ์ธ์๋ฅผ ๋ฐ๊ตฌ์, ํ๋ ์์ฒด๋ ๊ฐ์ฒด๊ฐ ๋ ์ ์์ผ๋ฏ๋ก ์์ฑ์๊ฐ ๋ค๋ฅธ ์์ฑ์๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค.
๊ธฐ๋ณธ ์์ฑ์๋ ๋งค๊ฐ๋ณ์๊ฐ ์๊ฑฐ๋ ๋ชจ๋ ๋งค๊ฐ๋ณ์์ ๊ธฐ๋ณธ๊ฐ์ด ์๋ ์์ฑ์์ ๋๋ค. ํด๋์ค์ ๊ฐ์ฒด๊ฐ ๋ช ์์ ์ธ ์ด๊ธฐ๊ฐ ์์ด ์์ฑ๋ ๋ ํธ์ถ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, `MyClass obj;`์ ๊ฐ์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ๊ธฐ๋ณธ ์์ฑ์๊ฐ ํธ์ถ๋ฉ๋๋ค.
๋ณต์ฌ ์์ฑ์๋ ํด๋์ค ์ธ์คํด์ค์ ๋ํ ์ผ๊ฐ ์ฐธ์กฐ๋ฅผ ์ธ์๋ก ์ฌ์ฉํ์ฌ ํธ์ถํ ์ ์์ต๋๋ค. ๋ณดํต `ClassName(const ClassName&)` ํํ๋ก ๊ตฌํํ๋ค. ์ธ์คํด์ค์ ์ ๋ณต์ฌ๋ณธ์ด `ClassName new_instance(existing_instance)`์ ๊ฐ์ด ๋ช ์์ ์ผ๋ก ์ด๊ธฐํ๋๊ฑฐ๋ ์ปดํ์ผ๋ฌ์ ์ํด ์์์ ์ผ๋ก ์ด๊ธฐํ๋ ๋ ํธ์ถ๋๋ค. ์๋ฅผ ๋ค๋ฉด, ์ธ์คํด์ค๊ฐ ๊ฐ์ผ๋ก ํจ์์ ์ ๋ฌ๋๊ฑฐ๋ ๊ฐ์ผ๋ก ๋ฐํ๋ ๋๋ค.
์ด๋ ์์ฑ์๋ ํด๋์ค ์ธ์คํด์ค์ ๋ํ ์ค๋ฅธ๊ฐ ์ฐธ์กฐ๋ฅผ ์ธ์๋ก ์ฌ์ฉํ์ฌ ํธ์ถํ ์ ์๋ ์์ฑ์์
๋๋ค. C++11๋ถํฐ ๋์
๋ ๊ฐ๋
์ผ๋ก, ์์ ๊ฐ์ฒด์ ๊ฐ์ด ๋ณต์ฌํ ํ์ ์์ด '์ด๋'ํ ์ ์๋ ๊ฐ์ฒด๋ฅผ ์ด๊ธฐํํ ๋ ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ ์์ฑ์๋ ๋ฆฌ์์ค๋ฅผ '๋ณต์ฌ'ํ๋ ๊ฒ์ด ์๋๋ผ '์ด๋'ํจ์ผ๋ก์จ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค. ์ด๋ ์์ฑ์์ ํํ๋ `MyClass(MyClass&&)` ์ ๊ฐ์ผ๋ฉฐ, rvalue ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ด๊ธฐํ ํ์ ์๋ฉธ๋๋ ์์ ๊ฐ์ฒด์์ ์ ์ธ์คํด์ค๊ฐ ์ด๊ธฐํ๋ ๋ ํธ์ถ๋๋ค.
class Knight
{
public:
Knight() {cout << "๊ธฐ๋ณธ ์์ฑ์" << endl;}
Knight(const Knight&) {cout << "๋ณต์ฌ ์์ฑ์" << endl;}
Knight(Knight&&) noexcept {cout << "์ด๋ ์์ฑ์" << endl;}
};
๐ฃ๏ธ ์ด๋ฏธ ๋ช ์์ ์ธ ์์ฑ์๊ฐ ์์ฑ๋์ด์์ผ๋ฉด ๊ธฐ๋ณธ ์์ฑ์๋ ํธ์ถ๋๋์?
C++์์ ํด๋์ค์ ๋ช
์์ ์ธ ์์ฑ์๋ฅผ ์์ฑํ๋ฉด, ์ปดํ์ผ๋ฌ๋ ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ์๋์ผ๋ก ์์ฑํ์ง ์์ต๋๋ค. ์ฆ, ํด๋์ค์ ํ๋ ์ด์์ ๋ช
์์ ์์ฑ์๊ฐ ์๊ณ , ๊ทธ ์ค ์ด๋ ๊ฒ๋ ๊ธฐ๋ณธ ์์ฑ์(๋งค๊ฐ๋ณ์๊ฐ ์๋ ์์ฑ์) ์ ์ญํ ์ ์ํํ์ง ์๋ ๊ฒฝ์ฐ, ๊ธฐ๋ณธ ์์ฑ์๋ ์ ๊ณต๋์ง ์์ต๋๋ค.
์ด๋ฌํ ์ํฉ์์ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑํ๋ ค๊ณ ํ๋ฉด, ์ปดํ์ผ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ํด๋์ค `MyClass`์ ๋งค๊ฐ๋ณ์๋ฅผ ๊ฐ์ง ์์ฑ์๋ง ์ ์๋์ด ์๋ค๋ฉด, `MyClass obj;` ์ ๊ฐ์ ์ฝ๋๋ ์ปดํ์ผ ์๋ฌ๋ฅผ ์ผ์ผํฌ ๊ฒ์
๋๋ค.
๋ง์ฝ ํด๋์ค์ ๋ช
์์ ์ธ ์์ฑ์๊ฐ ์์ง๋ง ์ฌ์ ํ ๊ธฐ๋ณธ ์์ฑ์๊ฐ ํ์ํ ๊ฒฝ์ฐ, ๊ฐ๋ฐ์๋ ์ง์ ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ๋ช
์์ ์ผ๋ก ์์ฑํด์ผ ํฉ๋๋ค.
class MyClass {
public:
MyClass() { // ๊ธฐ๋ณธ ์์ฑ์ ๋ช
์์ ์ ์
// ์ด๊ธฐํ ์ฝ๋
}
MyClass(int value) { // ๋ค๋ฅธ ์์ฑ์
// ์ด๊ธฐํ ์ฝ๋
}
};
์ด๋ ๊ฒ ํ๋ฉด `MyClass`์ ๊ฐ์ฒด๋ฅผ ๊ธฐ๋ณธ ์์ฑ์ ๋๋ ๋ค๋ฅธ ์์ฑ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑํ ์ ์์ต๋๋ค.
๐ฃ๏ธ ์์ ๋ณต์ฌ ๋ฌธ์ ์ , ๊น์ ๋ณต์ฌ ํ์์ฑ์ด ๋ญ๊ฐ์?
์์ ๋ณต์ฌ(Shallow Copy)์ ๊น์ ๋ณต์ฌ(Deep Copy)๋ ๊ฐ์ฒด๋ฅผ ๋ณต์ฌํ ๋ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ ๋ฐฉ์์ ์ฐจ์ด์์ ๋ฐ์ํ๋ ์ค์ํ ๊ฐ๋
์
๋๋ค. C++์์ ์ด๋ค์ ์ฐจ์ด์ ๊ฐ๊ฐ์ ๋ฌธ์ ์ ๋ฐ ํ์์ฑ์ ์ดํดํ๋ ๊ฒ์ ๋งค์ฐ ์ค์ํฉ๋๋ค.
์์ ๋ณต์ฌ๋ ๊ฐ์ฒด์ ๊ฐ ๋ฉค๋ฒ๋ฅผ ๋ค๋ฅธ ๊ฐ์ฒด๋ก ๋ณต์ฌํ๋ ๊ณผ์ ์์ ๋ฉค๋ฒ ๋ฐ์ดํฐ์ ๋นํธ-๋ฐ์ดํธ ๊ฐ์ ๊ทธ๋๋ก ๋ณต์ฌํฉ๋๋ค. ์ด ๋ฐฉ์์ ๊ธฐ๋ณธ ๋ฐ์ดํฐ ํ์
(int, char ๋ฑ)์ ๋ณต์ฌํ ๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ํ์ง๋ง, ํฌ์ธํฐ๋ ๋์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ์ง ํด๋์ค ๊ฐ์ฒด๋ฅผ ์์ ๋ณต์ฌํ ๊ฒฝ์ฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์์ ๋ณต์ฌ๋ก ์ธํด ๋ ๊ฐ์ฒด์ ํฌ์ธํฐ๊ฐ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋๋ฉด, ํ ๊ฐ์ฒด์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์์ ํ๊ฑฐ๋ ํด์ ํ๋ฉด ๋ค๋ฅธ ๊ฐ์ฒด์๋ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
- ๋ ๊ฐ์ฒด๊ฐ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ๋ฆฌํฌ ๋, ํ ๊ฐ์ฒด๊ฐ ์๋ฉธํ๋ฉด์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ๊ณ ๋๋ฉด, ๋ค๋ฅธ ๊ฐ์ฒด๋ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ๋ ค๊ณ ํ ๋ ์ด๋ฏธ ํด์ ๋ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ๊ฒ ๋์ด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
- ํ ๊ฐ์ฒด๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ ํ, ๋ค๋ฅธ ๊ฐ์ฒด๊ฐ ํด๋น ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ ์ ์๊ฒ ๋๋ฉด, ๊ทธ ๋ฉ๋ชจ๋ฆฌ๋ ๋ ์ด์ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ฉด์ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
๊น์ ๋ณต์ฌ๋ ๊ฐ์ฒด์ ๋ชจ๋ ๋ฉค๋ฒ๋ฅผ ๋ณต์ฌํ ๋, ํฌ์ธํฐ๋ ์ฐธ์กฐ๋ ๋ฐ์ดํฐ๊น์ง๋ ์๋ก์ด ๋ณต์ฌ๋ณธ์ ์์ฑํ์ฌ ๋ณต์ฌํฉ๋๋ค. ์ฆ, ์๋ณธ ๊ฐ์ฒด์ ๋ณต์ฌ๋ ๊ฐ์ฒด๊ฐ ์๋ก ๋
๋ฆฝ์ ์ธ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค. ๊น์ ๋ณต์ฌ๋ฅผ ์ฌ์ฉํ๋ฉด, ๊ฐ ๊ฐ์ฒด๊ฐ ์์ ๋ง์ ๋ฐ์ดํฐ ์ฌ๋ณธ์ ๊ฐ์ง๊ฒ ๋๋ฏ๋ก ํ ๊ฐ์ฒด์ ๋ณ๊ฒฝ์ด ๋ค๋ฅธ ๊ฐ์ฒด์ ์ํฅ์ ๋ฏธ์น์ง ์์ต๋๋ค.๊ฐ ๊ฐ์ฒด๊ฐ ๋
๋ฆฝ์ ์ธ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์, ๋ฉ๋ชจ๋ฆฌ ๋์๋ ์ด์ค ํด์ ์ ๊ฐ์ ๋ฌธ์ ๋ฅผ ์๋ฐฉํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์, ํฌ์ธํฐ๋ ๋์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ค๋ฃจ๋ ํด๋์ค์ ๊ฒฝ์ฐ, ๋ณต์ฌ ์์ฑ์์ ํ ๋น ์ฐ์ฐ์๋ฅผ ์ค๋ฒ๋ก๋ฉํ์ฌ ๊น์ ๋ณต์ฌ๋ฅผ ๊ตฌํํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ด๋ ๊ฒ ํจ์ผ๋ก์จ ๊ฐ์ฒด ๊ฐ์ ๋
๋ฆฝ์ฑ์ ์ ์งํ๊ณ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ จ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
๐ฃ๏ธ C ์คํ์ผ ๋ฌธ์์ด๊ณผ C++ ๋ฌธ์์ด์ ์ฐจ์ด์ ์ ๋ฌด์์ธ๊ฐ์?
C ์คํ์ผ ๋ฌธ์์ด์ ๋ฌธ์์ ๋ฐฐ์ด๋ก ํํ๋๋ฉฐ, ๋ฌธ์์ด์ ๋์ null ๋ฌธ์ `\0`๋ก ํ์๋ฉ๋๋ค.
- ๋ฌธ์ ๋ฐฐ์ด์ ์ฌ์ฉํฉ๋๋ค `char str[]`
- ๋ฌธ์์ด์ ๋์ null ๋ฌธ์(`\0`)๋ก ๊ตฌ๋ถ๋ฉ๋๋ค.
- ๋ฌธ์์ด ์ฒ๋ฆฌ๋ฅผ ์ํด ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์(์: `strcpy`, `strlen` ๋ฑ)๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ ์๋์ผ๋ก ํด์ผ ํฉ๋๋ค (๋์ ํ ๋น ๋ฐ ํด์ ).
- ๋ฒํผ ์ค๋ฒํ๋ก์ฐ์ ๊ฐ์ ๋ณด์ ๋ฌธ์ ์ ์ทจ์ฝํ ์ ์์ต๋๋ค.
C++ ์คํ์ผ ๋ฌธ์์ด์ `std::string` ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์์ด์ ํํํฉ๋๋ค. ์ด๋ C++ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ผ๋ถ์
๋๋ค.
- `std::string` ํด๋์ค๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ๋ฌธ์์ด ์ฒ๋ฆฌ๋ฅผ ์ํ ๋ค์ํ ๋ฉค๋ฒ ํจ์์ ์ฐ์ฐ์ ์ค๋ฒ๋ก๋ฉ์ ์ ๊ณตํฉ๋๋ค (์: `append`, `length`, ์ฐ์ฐ์ `+` ๋ฑ).
- ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ ์๋์ผ๋ก ์ด๋ฃจ์ด์ง๋๋ค (๋์ ์ผ๋ก ํฌ๊ธฐ ์กฐ์ ).
- ๋ณด์๊ณผ ๊ด๋ จํ์ฌ ๋ ์์ ํฉ๋๋ค (๋ฒํผ ์ค๋ฒํ๋ก์ฐ ์ํ ๊ฐ์).
- ๋ฌธ์์ด์ ๊ฐ์ฒด๋ก ์ฒ๋ฆฌํ์ฌ ๋ ๋ณต์กํ ์์
์ ์ฝ๊ฒ ์ํํ ์ ์์ต๋๋ค.
์ ์ฌ์
- ๋ ๋ค ๋ฌธ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์ฒ๋ฆฌํ๋ ๊ธฐ๋ณธ์ ์ธ ๋ชฉ์ ์ ๊ฐ์ง๋๋ค.
- C++์์๋ C ์คํ์ผ ๋ฌธ์์ด์ `std::string`์ผ๋ก ์ฝ๊ฒ ๋ณํํ ์ ์์ผ๋ฉฐ (`std::string str = "C-style string";`), ๋ฐ๋๋ก๋ ๊ฐ๋ฅํฉ๋๋ค (`const char* cstr = str.c_str();`).
- ๋ ๋ค ASCII ๋ฌธ์๋ฅผ ์ ์ฅํ๊ณ ์ฒ๋ฆฌํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ฆ C ์คํ์ผ ๋ฌธ์์ด๊ณผ C++ ์คํ์ผ ๋ฌธ์์ด์ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ์ ๋ฐ์ดํฐ(๋ฌธ์)๋ฅผ ๋ค๋ฃจ์ง๋ง, C ์คํ์ผ์ ๋ ๋ฎ์ ์์ค์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ์ง์ ์ ์ธ ๋ฐ์ดํฐ ์ ๊ทผ์ ํ์ฉํ๋ฉฐ, C++ ์คํ์ผ์ ๋ ๋์ ์์ค์ ์ถ์ํ์ ์์ ํ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
๐ฃ๏ธ v.push_back("xyzzyx") ์ v.emplace_back("xyzzyx")์ ์ฐจ์ด์ ์? ์ด๋ ์ชฝ์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ข์๊ฐ์?
`std::vector`์ `push_back`๊ณผ `emplace_back` ํจ์๋ ๋ฒกํฐ์ ๋์ ์๋ก์ด ์์๋ฅผ ์ถ๊ฐํ๋ ๋ฐ ์ฌ์ฉ๋์ง๋ง, ์๋ ๋ฐฉ์๊ณผ ์ฑ๋ฅ ๋ฉด์์ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
`push_back` ์ ์ ๋ฌ๋ฐ์ ๊ฐ์ฒด๋ฅผ ์์ ๋ณต์ฌํ๊ฑฐ๋ ์ด๋์์ผ์ ๊ฐ์ ๋ณต์ฌํฉ๋๋ค. ์ฆ, ๋ฐ๋ก ์ถ๊ฐ์ ์ธ ์ฐ์ฐ์ด ํ์ํฉ๋๋ค.
`emplace_back` ์ ํ์ํ ์ธ์๋ฅผ ์ง์ parameter๋ก ๋ฐ์ vector ๋ด๋ถ์์ ์ง์ ๊ฐ์ฒด๋ฅผ ์์ฑ-์ฝ์ -์๋ฉธ ํ๋ฉฐ ์ถ๊ฐํ๋ฏ๋ก ๋ณต์ฌ์ ์์ ๊ฐ์ฒด ์์ฑ์ ํผํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก, `push_back`์ผ๋ก ํ์ฌ๋ ์ปดํ์ผ๋ฌ ๋ด๋ถ์ ์ผ๋ก ์ต์ ํํ๋ฏ๋ก `emplace_back`์ผ๋ก ํ๋ ๊ฒ๊ณผ ๋ณ ์ฐจ์ด๊ฐ ์์ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ชจ๋ ์ํฉ์์ `emplace_back`์ด ์ ๋ฆฌํ๋ค๊ณ ํ ์ ์๊ณ , `push_back`์ด ํจ์จ์ ์ผ ์๋ ์์ต๋๋ค.
์ถ์ฒ: https://song-ift.tistory.com/63
`push_back` ํจ์๋ ๊ธฐ์กด ์์์ ๋ณต์ฌ๋ณธ์ ๋ฒกํฐ์ ๋์ ์ถ๊ฐํฉ๋๋ค. ๋ฌธ์์ด `"xyzzyx"`์ ๊ฐ์ ๊ฒฝ์ฐ, `push_back`์ ๋ฌธ์์ด์ ๋ณต์ฌ๋ณธ์ ์์ฑํ์ฌ ๋ฒกํฐ์ ์ถ๊ฐํฉ๋๋ค.
std::vector<std::string> v;
v.push_back("xyzzyx");
์ด ์์์, ๋ฌธ์์ด ๋ฆฌํฐ๋ด `"xyzzyx"`๋ `std::string` ๊ฐ์ฒด๋ก ๋ณํ๋๊ณ , ์ด ๊ฐ์ฒด๋ `push_back`์ ํตํด ๋ฒกํฐ์ ๋ณต์ฌ๋ฉ๋๋ค.
`emplace_back` ํจ์๋ ๊ฐ์ฒด๋ฅผ ๋ฒกํฐ์ ํ์ฌ ์์น์ ์ง์ ๊ตฌ์ฑ(์์ฑ)ํฉ๋๋ค. ์ด๋ ๋ณต์ฌ๋ ์ด๋์ด ํ์ ์์ผ๋ฏ๋ก ์ฑ๋ฅ์ ์ด์ ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
std::vector<std::string> v;
v.emplace_back("xyzzyx");
์ด ์์์, `emplace_back`์ ๋ฌธ์์ด ๋ฆฌํฐ๋ด `"xyzzyx"`๋ฅผ ์ฌ์ฉํ์ฌ ๋ฒกํฐ ๋ด๋ถ์์ ์ง์ `std::string` ๊ฐ์ฒด๋ฅผ ๊ตฌ์ฑํฉ๋๋ค.
์ด๋ ๊ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ข์๊ฐ์?
- ์ฑ๋ฅ ์ธก๋ฉด: `emplace_back`์ ์๋ณธ ์์๋ฅผ ์ง์ ๊ตฌ์ฑํ๊ธฐ ๋๋ฌธ์, ํนํ ๋ณต์ฌ ๋น์ฉ์ด ํฐ ๊ฐ์ฒด๋ฅผ ๋ค๋ฃฐ ๋ ์ฑ๋ฅ์์ ์ด์ ์ ์ ๊ณตํฉ๋๋ค. `push_back`์ ๊ฐ์ฒด๋ฅผ ๋ณต์ฌํ๊ฑฐ๋ ์ด๋ํด์ผ ํ๋ฏ๋ก ์ถ๊ฐ ๋น์ฉ์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
- ์ผ๋ฐ์ ์ธ ์ฌ์ฉ: ๋จ์ํ ํ์
(์: ๊ธฐ๋ณธ ๋ฐ์ดํฐ ํ์
, ์์ ํฌ๊ธฐ์ ์ฌ์ฉ์ ์ ์ ํ์
)์ ๊ฒฝ์ฐ `push_back`๊ณผ `emplace_back` ์ฌ์ด์ ์ฑ๋ฅ ์ฐจ์ด๋ ๋ฏธ๋ฏธํ ์ ์์ต๋๋ค. ํ์ง๋ง ๋ณต์กํ ๊ฐ์ฒด๋ ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋๋ `emplace_back`์ด ๋ ํจ์จ์ ์ผ ์ ์์ต๋๋ค.
์ฆ `emplace_back`์ ๋ณต์ฌ๋ ์ด๋ ์์ด ์ง์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์์ผ๋ก ๋ณดํต ๋ ์ข์ ์ ํ์
๋๋ค. ๊ทธ๋ฌ๋ ์ฑ๋ฅ ์ฐจ์ด๊ฐ ํฌ๊ฒ ์ค์ํ์ง ์์ ๊ฒฝ์ฐ๋ ์ฝ๋์ ๊ฐ๋
์ฑ์ ์ค์ํ๋ ๊ฒฝ์ฐ์๋ `push_back`์ ์ฌ์ฉํ๋ ๊ฒ๋ ์ ์ ํ ์ ์์ต๋๋ค. ๊ฐ์ฒด์ ์์ฑ์๊ฐ ๋ณต์กํ๊ฑฐ๋ ํน๋ณํ ๋ฐฉ์์ผ๋ก ๊ฐ์ฒด๋ฅผ ์ด๊ธฐํํด์ผ ํ๋ ๊ฒฝ์ฐ์๋ `emplace_back`์ด ๋ ์ ๋ฆฌํฉ๋๋ค
๐ฃ๏ธ vector ๋ฅผ ์ฌ์ฉํ ๋ ์ ์ฒ์๋ถํฐ reserve() ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ก์์ฃผ๋์?
capacity๊ฐ ๋ณํํ ๋๋ง๋ค ๊ธฐ์กด์ ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ๊ณ ์ด๋ฐ ๋ถ๋ถ์์ ๋น์ฉ์ด ๋ค์ด๊ฐ๋, ์ฒ์๋ถํฐ `reserve()` ๋ก ์ํ๋ capacity ๋ฅผ ์ก์์ฃผ๊ฒ ๋๋ฉด ๋ณต์ฌํ๋ ๋ถ๋ถ์ด ์๋ต๋์ ๋ ํจ์จ์ ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
๐ฃ๏ธ ๋ ์์ธํ ์ค๋ช ํด์ค๋์?
`std::vector`๋ ๋์ ๋ฐฐ์ด์ ๊ตฌํํ๋ C++ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํด๋์ค๋ก ์๋์ผ๋ก ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ ์ ์์ง๋ง, ์ด ๊ธฐ๋ฅ์ ๋ด๋ถ์ ์ผ๋ก ๋น์ฉ์ด ๋ฐ์ํ๋ ์์
์ ์๋ฐํฉ๋๋ค.
`std::vector`์ ์์๋ฅผ ์ถ๊ฐํ ๋, ํ์ฌ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ(์ฉ๋, capacity)๊ฐ ์ถฉ๋ถํ์ง ์์ผ๋ฉด, `vector`๋ ์๋ก์ด, ๋ ํฐ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ํ ๋นํ๊ณ ๊ธฐ์กด ๋ฐ์ดํฐ๋ฅผ ์๋ก์ด ์์น๋ก ๋ณต์ฌํฉ๋๋ค. ์ด ๊ณผ์ ์ ๋ค์ ๋จ๊ณ๋ฅผ ํฌํจํฉ๋๋ค:
1. ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ํ ๋น: ํ์ฌ ์ฉ๋๋ณด๋ค ํฐ ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ํ ๋นํฉ๋๋ค.
2. ๋ฐ์ดํฐ ๋ณต์ฌ: ๊ธฐ์กด ์์๋ค์ ์๋ก ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๋ก ๋ณต์ฌํฉ๋๋ค.
3. ๊ธฐ์กด ๋ฉ๋ชจ๋ฆฌ ํด์ : ๊ธฐ์กด ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ํด์ ํฉ๋๋ค.
์ด ๊ณผ์ ์ `push_back`์ด๋ `emplace_back`์ ํธ์ถํ ๋๋ง๋ค ๋ฒกํฐ์ ์ฉ๋์ด ๋ถ์กฑํ ๋ ๋ฐ์ํฉ๋๋ค. ์ด๋ก ์ธํด, ํนํ ํฌ๊ธฐ๊ฐ ํฐ ๊ฐ์ฒด๋ค์ ๋ค๋ฃฐ ๋ ์๋นํ ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.`reserve` ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด `std::vector`์ ์ด๊ธฐ ์ฉ๋์ ์ฌ์ ์ ์ค์ ํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ด๊ธฐ์ ์ถฉ๋ถํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํจ์ผ๋ก์จ, ์์ ์ถ๊ฐ ์ ๋ฐ๋ณต์ ์ธ ๋ฉ๋ชจ๋ฆฌ ์ฌํ ๋น๊ณผ ๋ฐ์ดํฐ ๋ณต์ฌ ๊ณผ์ ์ ํผํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ๋ฒกํฐ์ 1000๊ฐ์ ์์๋ฅผ ์ถ๊ฐํ ๊ณํ์ด๋ผ๋ฉด, `reserve(1000)`์ ํธ์ถํ์ฌ ์ฒ์๋ถํฐ 1000๊ฐ์ ์์๋ฅผ ์ ์ฅํ ์ ์๋ ์ถฉ๋ถํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ๋ณดํ ์ ์์ต๋๋ค. ์ด๋ ํนํ ๋ค์๊ณผ ๊ฐ์ ์ํฉ์์ ์ ์ฉํฉ๋๋ค.
1. ํฌ๊ธฐ๊ฐ ํฐ ๊ฐ์ฒด๋ค์ ๋ค๋ฃฐ ๋ ๋ฉ๋ชจ๋ฆฌ ์ฌํ ๋น๊ณผ ๋ณต์ฌ๋ก ์ธํ ์ค๋ฒํค๋๋ฅผ ์ค์ผ ์ ์์ต๋๋ค.
2. ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ฒ ์ฝ์
ํ๊ณ , ๋ฉ๋ชจ๋ฆฌ ์ฌํ ๋น์ผ๋ก ์ธํ ์ฑ๋ฅ ์ ํ๋ฅผ ํผํด์ผ ํ๋ ๊ฒฝ์ฐ.
3. ๋ถํ์ํ ๋ฉ๋ชจ๋ฆฌ ํ ๋น๊ณผ ํด์ ๋ฅผ ์ค์ฌ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ต์ ํํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์, `reserve` ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ฉ๋ชจ๋ฆฌ ์ฌํ ๋น๊ณผ ๋ฐ์ดํฐ ๋ณต์ฌ์ ๋ฐ๋ฅธ ๋น์ฉ์ ์ค์์ผ๋ก์จ ํนํ ๋๋์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๊ฑฐ๋, ์ฑ๋ฅ์ด ์ค์ํ ์ ํ๋ฆฌ์ผ์ด์
์์ ์ค์ํ ์ต์ ํ ๋ฐฉ๋ฒ์
๋๋ค.
๐ฃ๏ธ vector, list ์ฐจ์ด์ ์ด ๋ญ๊ฐ์?
`std::vector`์ `std::list`๋ C++ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ๊ณตํ๋ ๋ ๊ฐ์ง ์ค์ํ ์ปจํ
์ด๋ ํ์
์ผ๋ก, ๊ฐ๊ฐ์ ํน์ฑ๊ณผ ์ฌ์ฉ ์ฌ๋ก๊ฐ ๋ค๋ฆ
๋๋ค.
`std::vector`๋ ๋์ ๋ฐฐ์ด์ ๊ตฌํํ๋ ์ปจํ
์ด๋์
๋๋ค. ์ด์ ์ฃผ์ ํน์ง์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
`vector`๋ ๋ฉ๋ชจ๋ฆฌ์ ์ฐ์์ ์ผ๋ก ์์๋ฅผ ์ ์ฅํฉ๋๋ค. ์ด๋ก ์ธํด ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ ๋น ๋ฅธ ์ ๊ทผ์ด ๊ฐ๋ฅํฉ๋๋ค.
์ธ๋ฑ์ค๋ฅผ ์ด์ฉํด `O(1)` ์๊ฐ ์์ ์ด๋ค ์์์๋ ์ ๊ทผํ ์ ์์ต๋๋ค.
์์๋ฅผ ์ถ๊ฐํ ๋ ํ์ฌ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ๋ฉด ์๋ก์ด, ๋ ํฐ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ํ ๋นํ๊ณ ๊ธฐ์กด ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํด์ผ ํฉ๋๋ค.
์ค๊ฐ์ ์์๋ฅผ ์ฝ์
ํ๊ฑฐ๋ ์ญ์ ํ๋ ๊ฒฝ์ฐ ๋น์ฉ์ด ๋์ต๋๋ค. ๋ชจ๋ ๋ค์ชฝ ์์๋ค์ ์ด๋ํด์ผ ํ๊ธฐ ๋๋ฌธ์
๋๋ค.
`std::list`๋ ์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ๊ตฌํํ๋ ์ปจํ
์ด๋์
๋๋ค. ์ด์ ์ฃผ์ ํน์ง์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
๊ฐ ์์๋ ๋ฉ๋ชจ๋ฆฌ์ ๋ค๋ฅธ ์์น์ ํ ๋น๋๊ณ ํฌ์ธํฐ๋ฅผ ํตํด ์๋ก ์ฐ๊ฒฐ๋ฉ๋๋ค.
๋ฌด์์ ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํ๋ฉฐ, ํน์ ์์์ ์ ๊ทผํ๋ ค๋ฉด ์์์ ๋ถํฐ ์์ฐจ์ ์ผ๋ก ์ด๋ํด์ผ ํฉ๋๋ค.
์ค๊ฐ์ ์์๋ฅผ ์ฝ์
ํ๊ฑฐ๋ ์ญ์ ํ๋ ๊ฒ์ด ํจ์จ์ ์
๋๋ค. ํฌ์ธํฐ๋ง ๋ณ๊ฒฝํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ ์๋์ ์ผ๋ก ๋น ๋ฆ
๋๋ค.
๊ฐ ์์๊ฐ ๋ ๊ฐ์ ์ถ๊ฐ ํฌ์ธํฐ(์ด์ ๋ฐ ๋ค์ ์์๋ฅผ ๊ฐ๋ฆฌํค๋)๋ฅผ ์ ์งํด์ผ ํ๋ฏ๋ก ์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- **`std::vector`**: ๋ฌด์์ ์ ๊ทผ์ด ์์ฃผ ํ์ํ๊ฑฐ๋ ์์์ ์ฝ์
๋ฐ ์ญ์ ๊ฐ ์ฃผ๋ก ๋๋ถ๋ถ์์ ์ด๋ฃจ์ด์ง๋ ๊ฒฝ์ฐ์ ์ ํฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฐฐ์ด๊ณผ ์ ์ฌํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ํ์ํ ๊ฒฝ์ฐ์ ์ฌ์ฉ๋ฉ๋๋ค.
- **`std::list`**: ์ค๊ฐ ์ฝ์
๋ฐ ์ญ์ ์์
์ด ์์ฃผ ๋ฐ์ํ๊ณ , ์์ฐจ์ ์ ๊ทผ์ด ์ฃผ๋ก ์ด๋ฃจ์ด์ง๋ ๊ฒฝ์ฐ์ ์ ํฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์์์ ์์ ๋ณ๊ฒฝ์ด ๋น๋ฒํ ๊ฒฝ์ฐ์ ์ ๋ฆฌํฉ๋๋ค.
๐ฃ๏ธ list ๋ ์ ์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ก ๊ตฌํ๋์์๊ฑฐ๋ผ ์๊ฐํ๋์?
`std::list`๊ฐ ์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ(double-linked list)๋ก ๊ตฌํ๋์ด ์๋ ์ด์ ๋ ๋ช ๊ฐ์ง ์ฃผ์ํ ์ฅ์ ๋๋ฌธ์
๋๋ค. ์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ ๊ฐ ๋
ธ๋๊ฐ ๋ ๊ฐ์ ํฌ์ธํฐ๋ฅผ ๊ฐ๊ณ ์์ด์, ํ๋๋ ์ด์ ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํค๊ณ ๋ค๋ฅธ ํ๋๋ ๋ค์ ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํต๋๋ค. ์ด๋ฌํ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ์ ์ด์ ์ ์ ๊ณตํฉ๋๋ค
์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ ์๋ฐฉํฅ์ผ๋ก ์ํํ ์ ์์ต๋๋ค. ์ฆ, ๋ฆฌ์คํธ์ ์์๋ถํฐ ๋๊น์ง, ๋๋ ๊ทธ ๋ฐ๋๋ก๋ ์ด๋ํ ์ ์์ต๋๋ค. ์ด๋ ํน์ ์ํฉ์์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ๋ ์ ์ฐํ๊ฒ ๋ง๋ค์ด ์ค๋๋ค.
์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ์์ ๋
ธ๋์ ์ฝ์
์ด๋ ์ญ์ ๋ ๋งค์ฐ ํจ์จ์ ์
๋๋ค. ํน์ ๋
ธ๋๋ฅผ ์ญ์ ํ๊ฑฐ๋ ์ฝ์
ํ ๋, ์ด์ ๊ณผ ๋ค์ ๋
ธ๋์ ํฌ์ธํฐ๋ง ์์ ํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ ์๋์ ์ผ๋ก ์ ์ ์ฐ์ฐ์ผ๋ก ์์
์ ์๋ฃํ ์ ์์ต๋๋ค. ์ด๋ ํนํ ๋ฆฌ์คํธ์ ์ค๊ฐ์ ์์๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ญ์ ํ ๋ ์ ์ฉํฉ๋๋ค.
์ด๋ค ๊ฒฝ์ฐ์๋ ๋ฆฌ์คํธ์ ๋์์ ์์์ผ๋ก, ๋๋ ๊ทธ ๋ฐ๋๋ก ์ด๋ํด์ผ ํ๋ ์ํฉ์ด ๋ฐ์ํฉ๋๋ค. ์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ ์ด๋ฌํ ์๋ฐฉํฅ ์ด๋์ ์ฝ๊ฒ ํ ์ ์๊ฒ ํด์ค๋๋ค. ๊ฐ ๋
ธ๋๋ ๋
๋ฆฝ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น๋๋ฏ๋ก, ์ ์ฒด ๋ฆฌ์คํธ๋ฅผ ์ฌํ ๋นํ ํ์ ์์ด ๊ฐ๋ณ ๋
ธ๋๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํ ์ ์์ต๋๋ค. ์ด๋ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ต์ ํํ๊ณ , ํฐ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ๋ค๋ฃฐ ๋ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ์ค๋ฒํค๋๋ฅผ ์ค์ผ ์ ์์ต๋๋ค.
๋จ์ ์ผ๋ก๋, ์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ ๊ฐ ๋
ธ๋๋ง๋ค ์ถ๊ฐ์ ์ธ ๋ฉ๋ชจ๋ฆฌ(์ด์ ๋ฐ ๋ค์ ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ)๊ฐ ํ์ํ๋ฏ๋ก, ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ์ฆ๊ฐํฉ๋๋ค. ๋ํ, ๋ฌด์์ ์ ๊ทผ(random access)์ด ๋นํจ์จ์ ์ด๊ธฐ ๋๋ฌธ์, ํน์ ์ธ๋ฑ์ค์ ์์์ ์ ๊ทผํ๊ธฐ ์ํด์๋ ์ฒ์๋ถํฐ ์์ฐจ์ ์ผ๋ก ๋
ธ๋๋ฅผ ํ์ํด์ผ ํฉ๋๋ค. ์ด๋ฌํ ํน์ฑ ๋๋ฌธ์ `std::list`๋ ์ค๊ฐ ์ฝ์
๋ฐ ์ญ์ ๊ฐ ๋น๋ฒํ๊ณ , ์๋ฐฉํฅ ์ํ๊ฐ ํ์ํ ๊ฒฝ์ฐ์ ์ ํฉํ ์๋ฃ๊ตฌ์กฐ์
๋๋ค.
๐ฃ๏ธ map, set, multimap ์ฐจ์ด์ ์ด ๋ญ๊ฐ์?
`std::map`, `std::set`, `std::multimap`์ C++ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฐ๊ด ์ปจํ
์ด๋(associative container)๋ก, ๊ฐ๊ฐ ํน์ ํ ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ๊ด๋ฆฌํฉ๋๋ค. ์ด๋ค์ ์ฃผ์ ์ฐจ์ด์ ์ ๊ฐ๊ฒฐํ๊ฒ ์ค๋ช
ํ๊ฒ ์ต๋๋ค.
- `std::map`์ ํค์ ๊ฐ์ ์์ ์ ์ฅํฉ๋๋ค. ๊ฐ ํค๋ ๊ณ ์ ํด์ผ ํฉ๋๋ค.
- ํค์ ๋ฐ๋ผ ์๋์ผ๋ก ์ ๋ ฌ๋ฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ํค์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋ฉ๋๋ค.
- ์ด์ง ๊ฒ์ ํธ๋ฆฌ(๋๊ฐ ๋ ๋-๋ธ๋ ํธ๋ฆฌ)๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํ๋๋ฏ๋ก ๊ฒ์, ์ฝ์
, ์ญ์ ์์
์ด ๋ก๊ทธ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํค-๊ฐ ์๊ณผ ์ ์ฌํ ๊ตฌ์กฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ ๋ด์์ ํํํ ๋ ์์ฃผ ์ฌ์ฉ๋ฉ๋๋ค.
- `std::set`์ ๊ณ ์ ํ ์์๋ง (์ค์ง ํค๋ง์) ์ ์ฅํฉ๋๋ค. ์ฆ, ์ค๋ณต๋ ์์๋ ํ์ฉ๋์ง ์์ต๋๋ค.
- ์์๋ ์๋์ผ๋ก ์ ๋ ฌ๋ฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋ฉ๋๋ค.
- `std::map`๊ณผ ์ ์ฌํ๊ฒ ์ด์ง ๊ฒ์ ํธ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํ๋๋ฏ๋ก, ๋ก๊ทธ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋๋ค.
- ๊ณ ์ ํ ์์์ ์งํฉ์ ๊ด๋ฆฌํ ๋ ์ฌ์ฉ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ค๋ณต์ ํ์ฉํ์ง ์๋ ๋ชฉ๋ก์ ๊ด๋ฆฌํ ๋ ์ ํฉํฉ๋๋ค.
- `std::multimap`์ `std::map`๊ณผ ์ ์ฌํ์ง๋ง, ํ๋์ ํค์ ์ฌ๋ฌ ๊ฐ์ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค. ์ฆ, ์ค๋ณต ํค๋ฅผ ํ์ฉํฉ๋๋ค.
ํค์ ๋ฐ๋ผ ์๋์ผ๋ก ์ ๋ ฌ๋ฉ๋๋ค. `std::map`๊ณผ ๋์ผํ ๋ฐฉ์์ผ๋ก ์ ๋ ฌ๋ฉ๋๋ค.
- `std::map`๊ณผ ๋์ผํ๊ฒ ์ด์ง ๊ฒ์ ํธ๋ฆฌ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํ๋์ด ์์ต๋๋ค.
- ํ๋์ ํค์ ์ฌ๋ฌ ๊ฐ์ ์ฐ๊ฒฐํด์ผ ํ ๋ ์ฌ์ฉ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ํค๊ฐ ์นดํ
๊ณ ๋ฆฌ์ด๊ณ ๊ฐ์ด ์ฌ๋ฌ ์์ดํ
์ผ ์ ์๋ ๊ฒฝ์ฐ์ ์ ํฉํฉ๋๋ค.
์ถ๊ฐ ๋น๊ต
- ๋ชจ๋ ์ด์ง ๊ฒ์ ํธ๋ฆฌ๋ฅผ ์ฌ์ฉํด ์์๋ฅผ ์ ๋ ฌํฉ๋๋ค. ์ด๋ก ์ธํด ๊ฒ์, ์ฝ์
, ์ญ์ ์์
์ด ํจ์จ์ ์
๋๋ค.
- `std::set`์ ์ค๋ณต์ ํ์ฉํ์ง ์์ง๋ง, `std::multimap`์ ํค์ ๋ํ ์ค๋ณต์ ํ์ฉํฉ๋๋ค. `std::map`์ ํค์ ์ค๋ณต์ ํ์ฉํ์ง ์์ต๋๋ค.
์ด ์ปจํ
์ด๋๋ค์ ๊ฐ๊ฐ์ ํน์ ์ฌ์ฉ ์ฌ๋ก์ ๋ฐ๋ผ ์ ํ๋ฉ๋๋ค. `std::map`๊ณผ `std::set`์ ์ผ๋ฐ์ ์ผ๋ก ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ์๊ณ ๋ฆฌ์ฆ์์ ๊ฐ์ฅ ์์ฃผ ์ฌ์ฉ๋๋ฉฐ, `std::multimap`์ ํน์ ํ ๊ฒฝ์ฐ์ ํ์ํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
๐ฃ๏ธ shared_from_this() ์ shared_ptr(this) ๋ ๊ฐ๋์?
`shared_from_this()`์ `shared_ptr(this)`๋ ๋น์ทํด ๋ณด์ผ ์ ์์ง๋ง, ์ค์ ๋ก๋ ๋งค์ฐ ๋ค๋ฅธ ๋ชฉ์ ๊ณผ ์ฌ์ฉ๋ฒ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
- `shared_from_this()`๋ ๊ฐ์ฒด์ ์๋ช
๊ด๋ฆฌ๊ฐ ์ด๋ฏธ `std::shared_ptr`์ ์ํด ์ด๋ฃจ์ด์ง๊ณ ์์ ๋ ์์ ํ๊ฒ ํด๋น ๊ฐ์ฒด์ ๋ํ ์ถ๊ฐ์ ์ธ `shared_ptr`๋ฅผ ์์ฑํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
- ์ด ๋ฉ์๋๋ ํด๋น ๊ฐ์ฒด์ ๋ํ ์๋ก์ด `std::shared_ptr` ์ธ์คํด์ค๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด ์ธ์คํด์ค๋ ์๋ ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ ์นด์ดํธ๋ฅผ ์ฆ๊ฐ์ํต๋๋ค.
- ๊ฐ์ฒด๊ฐ `std::shared_ptr`์ ์ํด ๊ด๋ฆฌ๋์ง ์์ ๋ `shared_from_this()`๋ฅผ ํธ์ถํ๋ฉด, `std::bad_weak_ptr` ์์ธ๊ฐ ๋ฐ์ํฉ๋๋ค.
- ํด๋์ค์ ๋ด๋ถ์์ `shared_ptr(this)`๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ํด๋น ํด๋์ค์ `this` ํฌ์ธํฐ๋ก ์๋ก์ด `std::shared_ptr` ์ธ์คํด์ค๋ฅผ ์์ฑํฉ๋๋ค.
- ์ด ๋ฐฉ์์ ์ํํ ์ ์์ต๋๋ค. ์ด๋ฏธ ๋ค๋ฅธ `std::shared_ptr`์ ์ํด ๊ด๋ฆฌ๋๊ณ ์๋ ๊ฐ์ฒด์ ๋ํด `shared_ptr(this)`๋ฅผ ์ฌ์ฉํ๋ฉด, ๋์ผ ๊ฐ์ฒด์ ๋ํด ์๋ก ๋
๋ฆฝ์ ์ธ ์ฐธ์กฐ ์นด์ดํธ๋ฅผ ๊ฐ๋ ๋ ๊ฐ์ `shared_ptr`์ด ์๊ฒจ๋ฉ๋๋ค. ์ด๋ ๊ฐ์ฒด์ ์ค๋ณต ํด์ ๋ก ์ด์ด์ ธ ๋ฉ๋ชจ๋ฆฌ ์ค๋ฅ๋ฅผ ์ผ์ผํฌ ์ ์์ต๋๋ค.
- `shared_ptr(this)` ์ฌ์ฉ์ ๊ฐ์ฒด๊ฐ `std::shared_ptr`์ ์ํด ์์ง ๊ด๋ฆฌ๋๊ณ ์์ง ์์ ๋, ์ฆ ๊ฐ์ฒด์ ์์ฑ๊ณผ ๋์์ ์ฒซ `std::shared_ptr`์ ๋ง๋ค ๋๋ง ์์ ํฉ๋๋ค.
๐ฃ๏ธ C++์ lock, mutex, lockguard, shared_mutex, shared_lock, unique_lock ์ ๋ํด ์๋๋๋ก ์ค๋ช ํด์ฃผ์ธ์.
๐ mutex ๋ ์๋ฌผ์ , ๐๏ธ lock ์ ์ด์ ๋ผ๊ณ ๋น์ ํ ์ ์์ต๋๋ค.
C++์์๋ ๋ฉํฐ์ค๋ ๋ฉ ํ๊ฒฝ์์์ race condition ์ ๋ฐฉ์งํ๊ธฐ ์ํด
`lock`, `mutex`, `lock_guard`, `shared_mutex`, `shared_lock`, `unique_lock` ๋ฑ์ ๋๊ธฐํ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค.
`mutex`
์ํธ ๋ฐฐ์ (mutual exclusion)๋ฅผ ์ํ ๊ธฐ๋ณธ์ ์ธ ๋๊ตฌ์
๋๋ค. ํ ๋ฒ์ ํ๋์ ์ค๋ ๋๋ง์ด `mutex`๋ฅผ ์์ (์ ๊ธ)ํ ์ ์์ผ๋ฉฐ, ๋ค๋ฅธ ์ค๋ ๋๋ค์ ์์ ์ค๋ ๋๊ฐ `mutex`๋ฅผ ํด์ (์ ๊ธ ํด์ )ํ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผ ํฉ๋๋ค.
`lock()`๊ณผ `unlock()` ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ ๊ธ ๋ฐ ์ ๊ธ ํด์ ๋ฅผ ์ํํฉ๋๋ค. lock ์ ํ ๋ฒ์ ์ฌ๋ฌ ๋ฎคํ
์ค๋ฅผ ์์ ํ๊ฒ ์ ๊ธ ์ ์์ต๋๋ค.
`lock_guard`
RAII(Resource Acquisition Is Initialization) ํจํด์ ์ฌ์ฉํ์ฌ `mutex`์ ์๋ช
์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค. ์์ฑ๋ ๋ `mutex`๋ฅผ ์ ๊ทธ๊ณ , ํ๊ดด๋ ๋ ์๋์ผ๋ก ์ ๊ธ์ ํด์ ํฉ๋๋ค. `mutex`์ ํจ๊ป `lock_guard` ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ฉด ๋ฉ๋๋ค. ์ค์ฝํ๋ฅผ ๋ฒ์ด๋ ๋ ์๋์ผ๋ก ์ ๊ธ์ด ํด์ ๋ฉ๋๋ค.
`unique_lock`
`lock_guard`๋ณด๋ค ๋ ์ ์ฐํฉ๋๋ค. `lock()`๊ณผ `unlock()`์ ์๋์ผ๋ก ํธ์ถํ ์ ์์ผ๋ฉฐ, ๋ฝ์ ์ด์ ํ ์๋ ์์ต๋๋ค. `condition_variable`๊ณผ ํจ๊ป ์ฌ์ฉํ ๋ ์ ์ฉํฉ๋๋ค. ์์ฑ ์์ `mutex`๋ฅผ ์ ๊ทธ๊ฑฐ๋, ๋์ค์ `lock()` ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ ๊ธ์ ์ํํ ์ ์์ต๋๋ค.
`shared_mutex`
์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ์ฝ๊ธฐ ์์
์ ์ํํ ์ ์๋๋ก ํ์ฉํ๋ฉด์, ์ฐ๊ธฐ ์์
์ ํ ๋ฒ์ ํ๋์ ์ค๋ ๋๋ง ์ํํ ์ ์๋๋ก ํฉ๋๋ค.
`lock_shared()`์ `unlock_shared()`๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ์ฝ์ ์ ์๊ฒ ํ๊ณ , `lock()` ๋ฐ `unlock()`์ ์ฌ์ฉํ์ฌ ์ฐ๊ธฐ ์์
์ ์ํํฉ๋๋ค.
`shared_lock`
`shared_mutex`์ ๋ํ ๊ณต์ ์ ๊ธ์ ๊ด๋ฆฌํฉ๋๋ค. ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ `shared_mutex`๋ฅผ ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ์ ๊ธ ์ ์์ต๋๋ค.
`shared_lock` ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ `shared_mutex`๋ฅผ ๊ณต์ ๋ชจ๋๋ก ์ ๊ธ๋๋ค.
์ฆ `mutex`์ `lock_guard`๋ ๊ธฐ๋ณธ์ ์ธ ์ํธ ๋ฐฐ์ ๋ฅผ ์ ๊ณตํ๋ ๋ฐ๋ฉด, `unique_lock`๊ณผ `shared_lock`์ ๋ ์ ์ฐํ ์ ๊ธ ๊ด๋ฆฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. `shared_mutex`๋ ์ฝ๊ธฐ์ ์ฐ๊ธฐ ์์
์ด ๋์์ ๋ฐ์ํ๋ ์ํฉ์์ ํนํ ์ ์ฉํฉ๋๋ค. ๊ฐ๊ฐ์ ๋๊ตฌ๋ ํน์ ์ํฉ๊ณผ ์๊ตฌ ์ฌํญ์ ๋ฐ๋ผ ์ ํ๋์ด์ผ ํฉ๋๋ค.
๐ฃ๏ธ static ์ด ๋ฌด์์ธ๊ฐ์?
`static`์ ๋ณ์์ ํจ์์ ์๋ช ์ฃผ๊ธฐ์ ์ฌ์ฉ ๋ฒ์๋ฅผ ์ง์ ํ๋ ๋ฐฉ์ ์ค ํ๋๋ก์, `static`์ผ๋ก ์ ์ธ๋ ๋ณ์์ ํจ์์ ์๋ช ์ฃผ๊ธฐ๋ "ํ๋ก๊ทธ๋จ์ด ์์ํ ๋ ์์ฑ๋๊ณ , ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃํ ๋ ์๋ฉธ"ํ๋ ๊ฒ์ ๋๋ค. ๋ณ์๋ ํจ์๊ฐ ์ ์ธ๋ ๋ฒ์ ๋ด์์ ์ฌ์ฉ๋๋ฉฐ ์ ์ญ, ์ง์ญ์ผ๋ก ๊ตฌ๋ถ๋ฉ๋๋ค.
`static` ๋ฉค๋ฒ ํจ์๋ ์ค์ง `static` ๋ฉค๋ฒ ๋ณ์์ ์ ๊ทผํ๊ฑฐ๋ `static` ๋ฉค๋ฒ ํจ์๋ง ํธ์ถํ ์ ์์ต๋๋ค.
`static` ๋ฉค๋ฒ ํจ์๋ ๊ฐ์ฒด๊ฐ ์์ฑ๋์ง ์์ ์ด๋ค ์์ ์์๋ ํธ์ถ๋ ์ ์๊ณ , ํด๋์ค ์ด๋ฆ์ผ๋ก ์ง์ ํธ์ถ๋ ์ ์์ผ๋ฏ๋ก, `static` ๋ฉค๋ฒ ํจ์์์ `non static` ๋ฉค๋ฒ์ ์ ๊ทผํ๋ ๊ฒ์ ํ์ฉ๋์ง ์์ต๋๋ค.
์ ์ญ, ์ ์ ๋ณ์๋ ํ๋ก๊ทธ๋จ์ ์์ ์ง์ ์ 0 ๋๋ NULL๋ก ์๋ ์ด๊ธฐํ๋ฉ๋๋ค. ์ด๋ ํ๋ก๊ทธ๋จ์ ์คํ ์์ญ์ธ .data ๋ฐ .bss ์ธ๊ทธ๋จผํธ์ ์์นํ๊ณ , ์์คํ ์ ์ํด ์ด๊ธฐํ๋ฉ๋๋ค.
๐ฃ๏ธ shared_ptr ๋ ์ ์๋ ๊ด๋ฆฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋์? ๊ทธ๋ฆฌ๊ณ ์ ๋ง๋ก ์ค๋ ๋ ์์ ํ๊ฐ์?
์ฐธ์กฐ ์นด์ดํธ๊ฐ ์ง์๋๋ ํฌ์ธํฐ์ด๋ฉฐ, ๊ทธ๋ฐ ํฌ์ธํฐ์ ๋ํ ์ฐธ์กฐ ์นด์ดํ ์ ์์์ ๊ด๋ฆฌํด์ฃผ๋ฏ๋ก ์๋ ๊ด๋ฆฌ์์ ๋ฐ์ํ ์ ์๋ ์ฌ๋ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค.
ํน์ ์ธก๋ฉด์์ ์ค๋ ๋ ์์ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ชจ๋ ์ํฉ์์ ์๋ฒฝํ ์ค๋ ๋ ์์ ์ฑ์ ์ ๊ณตํ์ง๋ ์์ต๋๋ค.
- `shared_ptr`์ ์ฐธ์กฐ ์นด์ดํธ ์กฐ์์ atomicํ ์ฐ์ฐ์ผ๋ก ์ํ๋์ด, ์ฌ๋ฌ ์ค๋ ๋์์ `shared_ptr` ๊ฐ์ฒด๋ฅผ ๋ณต์ฌํ๊ฑฐ๋ ํ ๋นํ ๋ ์์ ํฉ๋๋ค. ์ฆ, ์ฐธ์กฐ ์นด์ดํธ์ ์ฆ๊ฐ์ ๊ฐ์๋ ์ค๋ ๋ ์์ ํฉ๋๋ค.
- ๊ทธ๋ฌ๋ `shared_ptr`๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ์ฒด์ ๋ํ ์ ๊ทผ์ ์ค๋ ๋ ์์ ํ์ง ์์ต๋๋ค. ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์ผํ `shared_ptr`๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ์ฒด์ ๋์์ ์ ๊ทผํ๋ ค๋ฉด, ์ด ๊ฐ์ฒด์ ๋ํ ์ ๊ทผ์ ๋ณ๋๋ก ๋๊ธฐํํด์ผ ํฉ๋๋ค (์: ๐ ๋ฎคํ ์ค ์ฌ์ฉ)
๐ฃ๏ธ shared_ptr ์์ ์ํ ๋ฌธ์ ๋ ๋ญ๊ฐ์ ์ด๋ป๊ฒ ํด๊ฒฐํ์ฃ ?
์๋ก๋ฅผ ์ฐธ์กฐํ๊ณ ์์ ๋ ์๋ฉธ์๊ฐ ์์ํ ํธ์ถ๋์ง ์์์ ์์ชฝ์ด ํด์ ๋์ง ์๋, ๋ฐ๋๋ฝ๊ณผ ๋น์ทํ ์ํฉ์ ์ฒํ๋ ๊ฒ์ ๋๋ค. ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
`weak_ptr`๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ์ฒด์ ์๋ช ์ฃผ๊ธฐ์ ์ํฅ์ ์ฃผ์ง ์๊ณ ์ฐธ์กฐ ์นด์ดํธ ๋ธ๋ก๋ง ์ ์งํ ์ ์์ต๋๋ค.
๐ฃ๏ธ map, vector ๋น๊ตํด์ฃผ์ธ์
`map`์ ๊ฒ์์ด O(logN) ์๊ฐ๋ณต์ก๋์ ์ด๋ฅด๋ ์ ๋์ ์ผ๋ก ๋น ๋ฅธ ์ปจํ ์ด๋์ด์ง๋ง
์ํ๊ฐ ์ฃผ ๊ธฐ๋ฅ์ด๊ณ ๊ฒ์์ด ํ์์๋ค๋ฉด, `vector`๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ซ์ต๋๋ค.
Reference
https://comfun.tistory.com/entry/c-c-%EB%A9%B4%EC%A0%91
https://cclient.tistory.com/11
https://se-jung-h.tistory.com/entry/C-C-%EA%B8%B0%EC%88%A0-%EB%A9%B4%EC%A0%91-%EC%A7%88%EB%AC%B8