๐Ÿ—ฃ๏ธ ์‹ ์ž… ์ธํ„ฐ๋ทฐ/C++

๐Ÿงž‍โ™‚๏ธ ์‹ ์ž… ๊ฐœ๋ฐœ์ž ๊ธฐ์ˆ ๋ฉด์ ‘ : C++ 02

์ซ€๋ƒ  2023. 12. 24. 00:57
์•ˆ๋…•ํ•˜์„ธ์š”, ์ซ€๋ƒ๋ฏธ์ž…๋‹ˆ๋‹ค.
์ฃผ์–ธ์–ด๊ฐ€ 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://velog.io/@kkanyo/%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91-C-%EC%9A%94%EC%95%BD-%EC%A0%95%EB%A6%AC-%EA%B3%84%EC%86%8D-%EC%88%98%EC%A0%95

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

https://developstudy.tistory.com/62