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

์‹ ์ž… ๊ฐœ๋ฐœ์ž ๊ธฐ์ˆ ๋ฉด์ ‘ C++ : ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ (๐Ÿ†šGC)

์ซ€๋ƒ  2023. 12. 29. 17:30

๐Ÿ“ŒRAII ํŒจํ„ด ์ด๋ž€?

RAII (Resource Acquisition Is Initialization)๋Š” C++์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ•์œผ๋กœ, ๊ฐ์ฒด์˜ ์ƒ๋ช…์ฃผ๊ธฐ์™€ ์ž์› ๊ด€๋ฆฌ๋ฅผ ๊ด€๋ จ์ง“๋Š” ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค. ์ด ํŒจํ„ด์˜ ํ•ต์‹ฌ ์•„์ด๋””์–ด๋Š” ์ž์›์˜ ํ• ๋‹น๊ณผ ์ดˆ๊ธฐํ™”๋ฅผ ๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ ๊ฒฐ๋ถ€์‹œํ‚ค๊ณ , ์ž์›์˜ ํ•ด์ œ๋ฅผ ๊ฐ์ฒด์˜ ์†Œ๋ฉธ๊ณผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

RAII๋Š” C++์˜ ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ ์™€ ๊ฐ™์€ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ๋„๋ฆฌ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋“ค ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ๋Š” ์ž๋™์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ˆ˜๋™์œผ๋กœ new์™€ delete๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ณต์žก์„ฑ์„ ์ค„์—ฌ์ค๋‹ˆ๋‹ค.

 

๐Ÿ“Œ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ๋ž€?

#include <memory> ํ—ค๋”๋กœ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

C++ ํ”„๋กœ๊ทธ๋žจ์—์„œ new ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, delete๋กœ ํ•ด์ œํ•  ์ˆ˜ ์žˆ๋‹ค.

 

C++์€ ๋ฉ”๋ชจ๋ฆฌ ๋ฆญ์œผ๋กœ๋ถ€ํ„ฐ ์•ˆ์ „ํ•˜๊ธฐ ์œ„ํ•ด ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ํฌ์ธํ„ฐ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๋Š” ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ์œผ๋กœ ์‚ฌ์šฉ์ด ๋๋‚œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ž๋™์œผ๋กœ ํ•ด์ œํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ํ•œ๋‹ค. RAII ํŒจํ„ด์˜ ์ข‹์€ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

 

๐Ÿ“Œ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ์˜ ์ข…๋ฅ˜

`unique_ptr`

  • unique_ptr ๋Š” ํ•˜๋‚˜์˜ ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ๋งŒ์ด ํŠน์ • ๊ฐ์ฒด์— ๋Œ€ํ•œ ๋‹จ์ผ ์†Œ์œ ๊ถŒ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค. 
  • std::move ๋ฅผ ํ†ตํ•ด์„œ ์†Œ์œ ๊ถŒ์„ ๋‹ค๋ฅธ unique_ptr ๋กœ ์ด์ „ํ•  ์ˆ˜ ์žˆ๊ณ , ์ด ๊ณผ์ •์—์„œ ์›๋ž˜์˜ unique_ptr๋Š” null ์ƒํƒœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
  • ๋˜ํ•œ ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ์ฒด์˜ ์†Œ์œ ๊ถŒ์„ ๊ฐ€์ง€๊ณ  ์žˆ์„ ๋•Œ์—๋งŒ ์†Œ๋ฉธ์ž๊ฐ€ ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. (์ž๋™ ์†Œ๋ฉธ)
  • ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ๊ฐ€ ์†Œ๋ฉธ๋  ๋•Œ ์†Œ์œ ํ•œ ๊ฐ์ฒด๋„ ์ž๋™์œผ๋กœ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.
    • unique_ptr์—์„œ ๊ฐ์ฒด๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ณผ์ •์€ ์ž๋™์œผ๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. unique_ptr์ด ์†Œ๋ฉธ๋˜๋ฉด (์˜ˆ๋ฅผ ๋“ค์–ด, ์Šค์ฝ”ํ”„๋ฅผ ๋ฒ—์–ด๋‚˜๊ฑฐ๋‚˜ reset ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜์—ˆ์„ ๋•Œ), unique_ptr์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜๋Š” ๊ฐ์ฒด์— ๋Œ€ํ•œ ์†Œ๋ฉธ์ž๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ , ๊ฐ์ฒด๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค.
    • unique_ptr์˜ reset ๋ฉ”์†Œ๋“œ๋Š” unique_ptr๊ฐ€ ํ˜„์žฌ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ์‚ญ์ œํ•˜๊ณ , ์„ ํƒ์ ์œผ๋กœ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋กœ ์†Œ์œ ๊ถŒ์„ ๋ณ€๊ฒฝํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
    • ์•„๋ž˜ ์ฝ”๋“œ์—์„œ ์ฒซ ๋ฒˆ์งธ reset() ํ˜ธ์ถœ์€ ptr์ด ๊ฐ€๋ฆฌํ‚ค๋Š” int ๊ฐ์ฒด๋ฅผ ์‚ญ์ œํ•˜๊ณ , ptr์„ nullptr๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ reset(new int(20)) ํ˜ธ์ถœ์€ ptr์— ์ƒˆ๋กœ์šด int ๊ฐ์ฒด์˜ ์†Œ์œ ๊ถŒ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.
std::unique_ptr<int> ptr(new int(10));

// ptr์ด ํ˜„์žฌ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ํ•ด์ œํ•˜๊ณ , nullptr๋กœ ์„ค์ •
ptr.reset();

// ptr์— ์ƒˆ๋กœ์šด ๊ฐ์ฒด์˜ ์†Œ์œ ๊ถŒ์„ ๋ถ€์—ฌ
ptr.reset(new int(20));

////// ์†Œ์œ ๊ถŒ ์ด์ „ ////// 
#include <memory>
#include <iostream>

void uniquePtrExample() {
    std::unique_ptr<int> ptr1(new int(10));
    // std::unique_ptr<int> ptr2 = ptr1; // ์ด ์ฝ”๋“œ๋Š” ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.
    std::unique_ptr<int> ptr2 = std::move(ptr1); // ptr1์—์„œ ptr2๋กœ ์†Œ์œ ๊ถŒ ์ด์ „

    if (ptr1 == nullptr) {
        std::cout << "ptr1 is nullptr after move." << std::endl;
    }
}

 

`shared_ptr`

  • shared_ptr๋Š” ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋ฅผ ์—ฌ๋Ÿฌ ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ๊ฐ€ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋‚ด๋ถ€์ ์œผ๋กœ ์ฐธ์กฐ ์นด์šดํŠธ(ref count)๋ฅผ ์œ ์ง€ํ•˜์—ฌ, ๋งˆ์ง€๋ง‰ shared_ptr๊ฐ€ ์†Œ๋ฉธ๋  ๋•Œ ๊ฐ์ฒด๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰ ์ฐธ์กฐ ํšŸ์ˆ˜๊ฐ€ 0์ด ๋˜๋ฉด delete ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค. 

`weak_ptr`

  • shared_ptr๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ์ฒด์— ๋Œ€ํ•œ ์•ฝํ•œ ์ฐธ์กฐ(weak reference)๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • weak_ptr๋Š” ๊ฐ์ฒด์˜ ์†Œ์œ ๊ถŒ์„ ๊ฐ€์ง€์ง€ ์•Š์œผ๋ฉฐ, ์ฐธ์กฐ ์นด์šดํŠธ๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ˆœํ™˜ ์ฐธ์กฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ์ฆ‰ shared_ptr ์ธ์Šคํ„ด์Šค๊ฐ€ ์†Œ์œ ํ•˜๋Š” ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ œ๊ณตํ•˜์ง€๋งŒ, ์†Œ์œ ์ž์˜ ์ˆ˜๋Š” ํฌํ•จ๋˜์ง€ ์•Š๋Š” ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ๋กœ shared_ptr์—์„œ ์ˆœํ™˜ ์ฐธ์กฐ๊ฐ€ ์ผ์–ด๋‚˜๋Š” ๊ฒƒ์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.

๐Ÿ“Œ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

๊ธฐ๋ณธ์ ์œผ๋กœ new ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋ณธ ํฌ์ธํ„ฐ๊ฐ€ ์‹ค์ œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ํ•œ ํ›„์— ๊ธฐ๋ณธํฌ์ธํ„ฐ๋ฅผ ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ์— ๋Œ€์ž…ํ•˜์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ •์˜๋œ ์Šค๋งˆํŠธํฌ์ธํ„ฐ์˜ ์ˆ˜๋ช…์ด ๋‹คํ•˜๋ฉด ์†Œ๋ฉธ์ž์—์„œ deleteํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ž๋™์œผ๋กœ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ๋”ฐ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

 

๐Ÿ“Œ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ์™€ ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ์˜ ๋‹ค๋ฅธ ์ ์€?

๊ฐ€๋น„์ง€์ปฌ๋ ‰ํ„ฐ์˜ ๊ฒฝ์šฐ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•œ ๋ณ€์ˆ˜๋“ค์„ ์ „๋ถ€ ๋Œ๋ฉด์„œ ํ™•์ธํ•˜๋Š” ๊ฝค ํฐ ๋น„์šฉ์˜ ๊ณผ์ •์„ ๊ฑฐ์น˜์ง€๋งŒ

C++์˜ ์Šค๋งˆํŠธํฌ์ธํ„ฐ๋Š” ๋‚ด๊ฐ€ ์ง€์ •ํ•œ ๋ณ€์ˆ˜๋“ค์— ๋Œ€ํ•ด์„œ๋งŒ ๊ฒ€์‚ฌ๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ํฐ ๊ฐ•์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

 

์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ: ํŠนํžˆ, ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ์‹คํ–‰๋  ๋•Œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์Šค์บ”ํ•˜๊ณ  ์ฒญ์†Œํ•˜๋Š” ๊ณผ์ •์—์„œ ์ผ์‹œ์ ์ธ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ๋Š” ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋งค์šฐ ์ ๊ฑฐ๋‚˜ ์—†์œผ๋ฉฐ, ํ”„๋กœ๊ทธ๋žจ ์„ฑ๋Šฅ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์ด ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค.

 

GPT ์ฐจ์ด์ : ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๋Š” ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜๋ฉฐ ์ „์ฒด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ˜๋ฉด, ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ๋ฉ”๋ชจ๋ฆฌ์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ๋Š” ์„ฑ๋Šฅ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์ด ์ ์ง€๋งŒ, ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๋Š” ๋•Œ๋•Œ๋กœ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

GPT ๊ณตํ†ต์ : ๋‘ ๋ฐฉ๋ฒ• ๋ชจ๋‘ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ์ž๋™ํ™”ํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ํ”„๋กœ๊ทธ๋žจ์˜ ์•ˆ์ •์„ฑ์„ ๋†’์ด๋Š” ๋ฐ ๋„์›€์„ ์ค๋‹ˆ๋‹ค.

 

GPT ์šฐ์œ„:

  • C++์—์„œ๋Š” ์„ฑ๋Šฅ์ด ์ค‘์š”ํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๊ฐ€ ๋ช…ํ™•ํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์—์„œ ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ๊ฐ€ ๋” ์ ํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฐ˜๋ฉด, ์ž๋™ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๊ณ  ํ”„๋กœ๊ทธ๋žจ์˜ ๋ณต์žก์„ฑ์„ ์ค„์ด๊ณ ์ž ํ•˜๋Š” ํ™˜๊ฒฝ์—์„œ๋Š” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ๋” ์ ํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ตœ์ข…์ ์œผ๋กœ, ์„ ํƒ์€ ํ”„๋กœ๊ทธ๋žจ์˜ ์š”๊ตฌ ์‚ฌํ•ญ, ์„ฑ๋Šฅ ๊ธฐ๋Œ€์น˜, ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

 

๐Ÿ“Œ์ผ๋ฐ˜ ํฌ์ธํ„ฐ์™€ ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ์˜ ๋‹ค๋ฅธ ์ ์€? 

์ผ๋ฐ˜ ํฌ์ธํ„ฐ๋Š” ๊ฐ์ฒด์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์ฃผ์†Œ๋ฅผ ๋ณด๊ด€ํ•˜๋Š” ๊ฐœ๋…์ด์ง€๋งŒ

์Šค๋งˆํŠธ ํฌ์ธํ„ฐ์˜ ๊ฒฝ์šฐ ๊ฐ์ฒด์˜ ์†Œ์œ ๊ถŒ์„ ์ฆ๋ช…ํ•˜๋Š” ๊ฐœ๋…

 

๐Ÿ“Œ์–ธ๋ฆฌ์–ผ์—์„œ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ์žฅ์ ?

๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐฉ์ง€, ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ๋“ค์€ ๋” ์ด์ƒ ๊ณต์œ ๋œ ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ์—†์œผ๋ฉด ์˜ค๋ธŒ์ ํŠธ ์ž๋™ ์†Œ๋ฉธ

๋ช…ํ™•ํ•œ ์˜๋„, ์˜ค๋ธŒ์ ํŠธ์˜ ์†Œ์œ ์ž๋ฅผ ์‰ฝ๊ฒŒ ๋ถ„๋ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค

๋Œ•๊ธ€๋ง ํฌ์ธํ„ฐ ๋ฐฉ์ง€, ์‚ญ์ œ๋œ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋Œ•๊ธ€๋ง ํฌ์ธํ„ฐ๋ฅผ ๋ฐฉ์ง€ํ•œ๋‹ค.

 

๋‚ด์ผ ๋ฉด์ ‘ ์ž˜๋ณด์ž! ํ™”์ดํŒ… :)

 

์ถœ์ฒ˜ https://drag0n.tistory.com/19


shared_ptr๋Š” C++11์—์„œ ๋„์ž…๋œ ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ๋กœ, ์ฐธ์กฐ ์นด์šดํŒ…์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž๋™์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…๊ณผ ๊ด€๋ จ ๊ธฐ๋Šฅ๋“ค์„ ์„ค๋ช…๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค:

  1. std::shared_ptr: ์ž๋™์œผ๋กœ ์ฐธ์กฐ ์นด์šดํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜์—ฌ, ๋” ์ด์ƒ ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” shared_ptr๊ฐ€ ์—†์„ ๋•Œ ๊ฐ์ฒด๋ฅผ ์ž๋™์œผ๋กœ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” <memory> ํ—ค๋”์— ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ์ฐธ์กฐ ์นด์šดํŒ…(Reference Counting): shared_ptr ์ธ์Šคํ„ด์Šค ๊ฐ„์— ๊ณต์œ ๋˜๋Š” ๋‚ด๋ถ€ ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ, ํ•˜๋‚˜์˜ ๊ฐ์ฒด์— ๋Œ€ํ•œ shared_ptr์˜ ์ˆ˜๋ฅผ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค. ์ฐธ์กฐ ์นด์šดํŠธ๊ฐ€ 0์ด ๋˜๋ฉด ๊ด€๋ จ๋œ ๊ฐ์ฒด๋Š” ์ž๋™์œผ๋กœ ์†Œ๋ฉธ๋ฉ๋‹ˆ๋‹ค.
  3. std::make_shared: ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” shared_ptr๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ด ๋ฐฉ์‹์€ ๊ฐ์ฒด์™€ ์ฐธ์กฐ ์นด์šดํŠธ๋ฅผ ์œ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค.
    1. std::shared_ptr<MyClass> sharedPtr1(new MyClass());์™€ std::make_shared<MyClass>()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ std::shared_ptr๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์œ ์‚ฌํ•œ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์˜ค์ง€๋งŒ, ๋ช‡ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ์ฐจ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
    2. std::shared_ptr<MyClass> sharedPtr1(new MyClass()); ์œผ๋กœ ์ง์ ‘ ์ƒ์„ฑ ์‹œ, ๋จผ์ € ๊ฐ์ฒด๋ฅผ ์œ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์ด ์ด๋ฃจ์–ด์ง€๊ณ , ๊ทธ ๋‹ค์Œ์— shared_ptr์˜ ์ œ์–ด ๋ธ”๋ก(control block, ์ฐธ์กฐ ์นด์šดํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ)์„ ์œ„ํ•œ ๋ณ„๋„์˜ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. ์˜ˆ์™ธ ์•ˆ์ „์„ฑ์— ์•ฝ๊ฐ„์˜ ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. new MyClass()์™€ std::shared_ptr ์ƒ์„ฑ์ž ์‚ฌ์ด์— ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด, new๋กœ ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•ด์ œ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    3. ์ด์™€ ๋‹ฌ๋ฆฌ make_shared ๋กœ ๋งŒ๋“ค๋ฉด ๊ฐ์ฒด์™€ ์ œ์–ด ๋ธ”๋ก์„ ์œ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•˜๋‚˜์˜ ํ• ๋‹น ๋‹จ๊ณ„๋กœ ์ฒ˜๋ฆฌํ•ด์„œ, ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ํšŸ์ˆ˜๋ฅผ ์ค„์ด๊ณ  ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ make_shared๋Š” ์˜ˆ์™ธ ์•ˆ์ „์„ฑ์„ ๊ฐ–์ถ”๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์ฒด ์ƒ์„ฑ ์ค‘ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด, ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ž๋™์œผ๋กœ ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค.
  4. std::allocate_shared: ์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์ž์™€ ํ•จ๊ป˜ shared_ptr๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” make_shared์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ, ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ๋ฐฉ์‹์„ ์‚ฌ์šฉ์ž๊ฐ€ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    std::allocate_shared๋Š” std::shared_ptr๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์ž๋ฅผ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•  ๋•Œ ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ํŠนํžˆ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น๊ณผ ๊ด€๋ จํ•˜์—ฌ ์„ฑ๋Šฅ ์ตœ์ ํ™”๊ฐ€ ํ•„์š”ํ•˜๊ฑฐ๋‚˜, ํŠน์ˆ˜ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ์š”๊ตฌ์‚ฌํ•ญ์ด ์žˆ๋Š” ๊ฒฝ์šฐ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฉ”๋ชจ๋ฆฌ ํ’€์—์„œ ๊ฐ์ฒด๋ฅผ ํ• ๋‹นํ•˜๊ณ ์ž ํ•  ๋•Œ allocate_shared๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ํ’€์€ ๋ฏธ๋ฆฌ ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก์„ ๊ด€๋ฆฌํ•˜๋ฉฐ, ๊ฐ์ฒด๊ฐ€ ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ์ด ํ’€์—์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํž™ ํ• ๋‹น๊ณผ ๊ด€๋ จ๋œ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ค„์ด๊ณ  ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๋ฐ ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  5. std::weak_ptr: shared_ptr์— ๋Œ€ํ•œ ๋น„์†Œ์œ  ์ฐธ์กฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. weak_ptr๋Š” ๊ฐ์ฒด์˜ ์ƒ๋ช…์ฃผ๊ธฐ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ณ , ์ˆœํ™˜ ์ฐธ์กฐ๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  6. std::owner_less: shared_ptr ๋˜๋Š” weak_ptr ์ธ์Šคํ„ด์Šค๋ฅผ ๋น„๊ตํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์†Œ์œ ๊ถŒ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํฌ์ธํ„ฐ๋“ค์„ ๋น„๊ตํ•˜๋ฉฐ, ์ •๋ ฌ์ด๋‚˜ ์ปจํ…Œ์ด๋„ˆ์— ์ €์žฅํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  7. std::enable_shared_from_this: ํด๋ž˜์Šค ๋‚ด์—์„œ this ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ shared_ptr๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  8. std::shared_from_this: enable_shared_from_this๋ฅผ ์ƒ์†๋ฐ›์€ ๊ฐ์ฒด์—์„œ ํ˜ธ์ถœ๋˜๋ฉฐ, ๊ฐ์ฒด ์ž์‹ ์— ๋Œ€ํ•œ shared_ptr๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  9. std::static_pointer_cast, std::dynamic_pointer_cast, std::const_pointer_cast: ์ด๋“ค์€ shared_ptr์˜ ์บ์ŠคํŒ…์„ ์œ„ํ•œ ํ•จ์ˆ˜๋“ค๋กœ, ๊ฐ๊ฐ static_cast, dynamic_cast, const_cast์™€ ์œ ์‚ฌํ•˜๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  10. std::get_deleter: shared_ptr์— ์—ฐ๊ฒฐ๋œ ์‚ญ์ œ์ž(deleter)๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. shared_ptr๊ฐ€ ์‚ฌ์šฉ์ž ์ •์˜ ์‚ญ์ œ์ž๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ํ•ด๋‹น ์‚ญ์ œ์ž์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  11. ์‚ญ์ œ์ž(Deleter): shared_ptr๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์‚ฌ์šฉ์ž ์ •์˜ ์‚ญ์ œ ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” shared_ptr์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜๋Š” ๊ฐ์ฒด๊ฐ€ ์‚ญ์ œ๋  ๋•Œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
  12. ์Šค๋ ˆ๋“œ ์•ˆ์ „(Thread Safety): shared_ptr๋Š” ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ๋„ ์ฐธ์กฐ ์นด์šดํŠธ์˜ ๋ณ€๊ฒฝ์ด ์•ˆ์ „ํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ์—์„œ ๋™์ผํ•œ shared_ptr ์ธ์Šคํ„ด์Šค๋ฅผ ๋™์‹œ์— ์ฝ๊ณ  ์“ฐ๋Š” ๊ฒƒ์€ ์—ฌ์ „ํžˆ ์Šค๋ ˆ๋“œ ์•ˆ์ „ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  13. ์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ: shared_ptr๋Š” ํ‘œ์ค€ ์‚ญ์ œ์ž ์™ธ์— ์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์ž ๋˜๋Š” ์‚ญ์ œ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด์˜ ํ• ๋‹น๊ณผ ํ•ด์ œ ๋ฐฉ์‹์„ ์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

์ˆœํ™˜ ์ฐธ์กฐ(Circular References): shared_ptr ๊ฐ„์— ์ˆœํ™˜ ์ฐธ์กฐ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด, ์ฐธ์กฐ ์นด์šดํŠธ๊ฐ€ ์˜์›ํžˆ 0์ด ๋˜์ง€ ์•Š์•„ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด weak_ptr๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆœํ™˜ ์ฐธ์กฐ๋ฅผ ๋Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

make_shared<this>๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ C++์—์„œ ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค. ์ด์œ ๋Š” ๋ช‡ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค

  1. ์ž˜๋ชป๋œ ์‚ฌ์šฉ: std::make_shared ํ•จ์ˆ˜๋Š” ํƒ€์ž…์„ ํ…œํ”Œ๋ฆฟ ์ธ์ž๋กœ ๋ฐ›์•„ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š”๋ฐ, this ํฌ์ธํ„ฐ๋Š” ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ธฐ ๋•Œ๋ฌธ์—, make_shared<this>๋Š” ๋ฌธ๋ฒ•์ ์œผ๋กœ ์ž˜๋ชป๋์–ด.
  2. ์ค‘๋ณต๋œ ์†Œ์œ ๊ถŒ ๋ฌธ์ œ: ๋งŒ์•ฝ make_shared<this>๊ฐ€ ์ž‘๋™ํ•œ๋‹ค๊ณ  ํ•˜๋”๋ผ๋„, ์ด๋Š” ๊ฐ™์€ ๊ฐ์ฒด์— ๋Œ€ํ•ด ๋‘ ๊ฐœ์˜ ๋ณ„๋„ shared_ptr ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋˜๊ณ , ์ด๋Š” ์ค‘๋ณต๋œ ์†Œ์œ ๊ถŒ๊ณผ ๊ด€๋ จ๋œ ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐํ•ด.
  3. ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜: ๊ฐ shared_ptr๋Š” ์ฐธ์กฐ ์นด์šดํŠธ๋ฅผ ๊ด€๋ฆฌํ•ด. ๋งŒ์•ฝ ํ•œ ๊ฐ์ฒด์— ๋Œ€ํ•ด ๋‘ ๊ฐœ์˜ shared_ptr๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด, ๊ฐ๊ฐ์˜ ์ฐธ์กฐ ์นด์šดํŠธ๊ฐ€ ๋…๋ฆฝ์ ์œผ๋กœ ์ž‘๋™ํ•ด. ์ด๋Š” ๊ฐ์ฒด๊ฐ€ ์ ์ ˆํ•˜๊ฒŒ ํ•ด์ œ๋˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์–ด.
  4. ์˜ˆ๊ธฐ์น˜ ์•Š์€ ์†Œ๋ฉธ: ํ•œ shared_ptr๊ฐ€ ์†Œ๋ฉธ๋˜๋ฉด ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ์ฒด๋„ ๊ฐ™์ด ์†Œ๋ฉธํ•  ์ˆ˜ ์žˆ์–ด. ๋งŒ์•ฝ ๋‹ค๋ฅธ shared_ptr๋„ ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค๋ฉด, ์ด๋Š” ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๊ฐ์ฒด ์†Œ๋ฉธ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์–ด.
  5. this ํฌ์ธํ„ฐ์™€์˜ ์ถฉ๋Œ: this ํฌ์ธํ„ฐ๋Š” ํ˜„์žฌ ๊ฐ์ฒด์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ์•ผ. make_shared๋ฅผ ์‚ฌ์šฉํ•ด this๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ƒˆ shared_ptr๋ฅผ ์ƒ์„ฑํ•˜๋ ค ํ•˜๋ฉด, ์›๋ž˜ ๊ฐ์ฒด์™€ ์ƒˆ๋กœ์šด shared_ptr ๊ฐ„์— ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด.
  6. ์Šค๋ ˆ๋“œ ์•ˆ์ „์„ฑ ๋ฌธ์ œ: ๋™์ผ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ shared_ptr ์ธ์Šคํ„ด์Šค๊ฐ€ ์žˆ์„ ๋•Œ, ์ฐธ์กฐ ์นด์šดํŠธ์˜ ์กฐ์ •์€ ์Šค๋ ˆ๋“œ ์•ˆ์ „ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์–ด. ์ด๋Š” ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ๋ฌธ์ œ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์–ด.
  7. ์„ค๊ณ„ ๋ฌธ์ œ: this๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ shared_ptr๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ ์ผ๋ฐ˜์ ์ธ ๊ฐ์ฒด ์†Œ์œ ๊ถŒ์˜ ์›์น™์— ์–ด๊ธ‹๋‚˜. ์ด๋Š” ๊ฐ์ฒด์˜ ์ƒ๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ์™€ ์†Œ์œ ๊ถŒ์— ๋Œ€ํ•œ ํ˜ผ๋ž€์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์–ด.
  8. ๋Œ€์•ˆ์˜ ๋ถ€์žฌ: enable_shared_from_this๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ˜„์žฌ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์•ˆ์ „ํ•œ shared_ptr์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์–ด, make_shared<this> ๊ฐ™์€ ์ž˜๋ชป๋œ ์‚ฌ์šฉ์„ ํ”ผํ•  ์ˆ˜ ์žˆ์–ด.
  9. ๋””๋ฒ„๊น… ์–ด๋ ค์›€: ์ด๋Ÿฐ ๋ฌธ์ œ๋“ค์€ ๋””๋ฒ„๊น…์„ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค์–ด. ์–ด๋–ค shared_ptr๊ฐ€ ๊ฐ์ฒด๋ฅผ ์†Œ๋ฉธ์‹œ์ผฐ๋Š”์ง€ ์ถ”์ ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์›Œ์ ธ.
  10. ์„ค๊ณ„ ๊ฐ€์ด๋“œ ์œ„๋ฐ˜: shared_ptr์™€ ๊ฐ™์€ ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ๋Š” ๊ฐ์ฒด์˜ ์†Œ์œ ๊ถŒ๊ณผ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋๋Š”๋ฐ, make_shared<this> ์‚ฌ์šฉ์€ ์ด๋Ÿฌํ•œ ์„ค๊ณ„ ๊ฐ€์ด๋“œ๋ฅผ ๋ฌด์‹œํ•˜๋Š” ๊ฒƒ์ด ๋˜์–ด.

๊ฒฐ๋ก ์ ์œผ๋กœ, this ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ shared_ptr๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์˜ฌ๋ฐ”๋ฅธ ์‚ฌ์šฉ๋ฒ•์ด ์•„๋‹ˆ์•ผ. ๋Œ€์‹ , enable_shared_from_this๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์•ˆ์ „ํ•˜๊ณ  ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์ด์•ผ.

 

 

C ์บ์ŠคํŒ…๊ณผ C++ ์บ์ŠคํŒ…์˜ ์ฐจ์ด๋ฅผ ๊ฐ„๋‹จํžˆ ์š”์•ฝํ•˜๋ฉด ์ด๋ ‡์Šต๋‹ˆ๋‹ค

  1. C ์บ์ŠคํŒ…: C์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ (type) ํ˜•์‹์˜ ์บ์ŠคํŒ…์„ ์‚ฌ์šฉํ•ด์š”. ์ด ๋ฐฉ์‹์€ ๊ฐ„๋‹จํ•˜์ง€๋งŒ ํƒ€์ž… ์•ˆ์ „์„ฑ์ด๋‚˜ ๋ช…ํ™•์„ฑ์ด ๋ถ€์กฑํ•ด์š”.
  2. C++ ์บ์ŠคํŒ…: C++์—์„œ๋Š” static_cast, dynamic_cast, const_cast, reinterpret_cast์™€ ๊ฐ™์ด ๋‹ค์–‘ํ•œ ์บ์ŠคํŒ… ์—ฐ์‚ฐ์ž๋ฅผ ์ œ๊ณตํ•ด์š”. ์ด๋“ค์€ ๊ฐ๊ฐ ํŠน์ •ํ•œ ์‚ฌ์šฉ ๋ชฉ์ ๊ณผ ํƒ€์ž… ์•ˆ์ „์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์š”.
  3. ํƒ€์ž… ์•ˆ์ „์„ฑ: C++์˜ ์บ์ŠคํŒ… ์—ฐ์‚ฐ์ž๋“ค์€ C๋ณด๋‹ค ๋” ํƒ€์ž… ์•ˆ์ „์„ฑ์„ ์ œ๊ณตํ•ด์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, dynamic_cast๋Š” ๋Ÿฐํƒ€์ž„์— ํƒ€์ž… ์ฒดํฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜์ฃ .

 

 

`static_pointer_cast`, `dynamic_pointer_cast`, `const_pointer_cast`๋Š” `shared_ptr`์— ๋Œ€ํ•œ ์บ์ŠคํŒ… ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š” C++ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•จ์ˆ˜๋“ค์ž…๋‹ˆ๋‹ค. ์ด๋“ค์€ ๊ฐ๊ฐ C++์˜ ๊ธฐ๋ณธ ์บ์ŠคํŒ… ์—ฐ์‚ฐ์ž์ธ `static_cast`, `dynamic_cast`, `const_cast`์™€ ์œ ์‚ฌํ•˜๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. `reinterpret_cast`๋Š” `shared_ptr`์— ๋Œ€์‘๋˜๋Š” ๋ณ„๋„์˜ ์บ์ŠคํŒ… ํ•จ์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

 

์˜ˆ์‹œ ์ฝ”๋“œ

1. `static_pointer_cast`

   ```cpp
   class Base {};
   class Derived : public Base {};

   shared_ptr<Base> basePtr = make_shared<Derived>();
   shared_ptr<Derived> derivedPtr = static_pointer_cast<Derived>(basePtr);
   ```

`static_pointer_cast`๋Š” ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ํƒ€์ž… ์บ์ŠคํŒ…์ด ์œ ํšจํ•œ์ง€ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์—…์บ์ŠคํŒ…๊ณผ ๋‹ค์šด์บ์ŠคํŒ…์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

2. `dynamic_pointer_cast`

   ```cpp
   class Base { virtual void foo() {} };
   class Derived : public Base {};

   shared_ptr<Base> basePtr = make_shared<Derived>();
   shared_ptr<Derived> derivedPtr = dynamic_pointer_cast<Derived>(basePtr);
   ```

 

`dynamic_pointer_cast`๋Š” ๋Ÿฐํƒ€์ž„์— ํƒ€์ž… ์•ˆ์ „์„ฑ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ฃผ๋กœ ๋‹คํ˜•์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ํด๋ž˜์Šค์—์„œ ๋‹ค์šด์บ์ŠคํŒ…์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

3. `const_pointer_cast`

   ```cpp
   shared_ptr<const int> constIntPtr = make_shared<const int>(10);
   shared_ptr<int> intPtr = const_pointer_cast<int>(constIntPtr);
   ```

`const_pointer_cast`๋Š” ๊ฐ์ฒด์˜ `const` ๋˜๋Š” `volatile` ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

C++ ์บ์ŠคํŒ… ์—ฐ์‚ฐ์ž ๋น„๊ต

1. `static_cast`

   ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ํƒ€์ž… ์บ์ŠคํŒ…์˜ ์œ ํšจ์„ฑ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๊ด€๋ จ ํƒ€์ž… ๊ฐ„์˜ ๋ณ€ํ™˜์— ์‚ฌ์šฉ๋˜๋ฉฐ, ๋‹ค์šด์บ์ŠคํŒ…๊ณผ ์—…์บ์ŠคํŒ… ๋ชจ๋‘ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

2. `dynamic_cast`

   ๋Ÿฐํƒ€์ž„์— ํƒ€์ž… ์•ˆ์ „์„ฑ์„ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ฃผ๋กœ ๋‹คํ˜•์„ฑ์„ ๊ฐ€์ง„ ํด๋ž˜์Šค์—์„œ์˜ ๋‹ค์šด์บ์ŠคํŒ…์— ์‚ฌ์šฉ๋˜๋ฉฐ, RTTI(Run-Time Type Information)์„ ํ•„์š”๋กœ ํ•ฉ๋‹ˆ๋‹ค.

3. `const_cast`

   ๊ฐ์ฒด์˜ `const` ๋˜๋Š” `volatile` ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ฃผ๋กœ `const` ๋ฉ”์„œ๋“œ์—์„œ ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•  ํ•„์š”๊ฐ€ ์žˆ์„ ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

4. `reinterpret_cast`

   ์ €์ˆ˜์ค€ ์บ์ŠคํŒ…์œผ๋กœ, ํฌ์ธํ„ฐ ํƒ€์ž…์„ ์™„์ „ํžˆ ๋‹ค๋ฅธ ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ํƒ€์ž… ์•ˆ์ „์„ฑ์ด ๋ณด์žฅ๋˜์ง€ ์•Š์œผ๋ฉฐ, ์‚ฌ์šฉ ์‹œ ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

`static_pointer_cast`, `dynamic_pointer_cast`, `const_pointer_cast`๋Š” ์ด๋Ÿฌํ•œ ๊ธฐ๋ณธ ์บ์ŠคํŒ… ์—ฐ์‚ฐ์ž์˜ ๊ธฐ๋Šฅ์„ `shared_ptr`์— ์ ์šฉํ•œ ๊ฒƒ์œผ๋กœ, ๊ฐ๊ฐ์˜ ๋ชฉ์ ๊ณผ ์‚ฌ์šฉ๋ฒ•์€ ๊ธฐ๋ณธ ์บ์ŠคํŒ… ์—ฐ์‚ฐ์ž์™€ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.