๐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์์ ๋์ ๋ ์ค๋งํธ ํฌ์ธํฐ๋ก, ์ฐธ์กฐ ์นด์ดํ ์ ์ฌ์ฉํ์ฌ ์๋์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค. ์ฌ๊ธฐ์ ๋ํ ์์ธํ ์ค๋ช ๊ณผ ๊ด๋ จ ๊ธฐ๋ฅ๋ค์ ์ค๋ช ๋๋ฆฌ๊ฒ ์ต๋๋ค:
- std::shared_ptr: ์๋์ผ๋ก ์ฐธ์กฐ ์นด์ดํธ๋ฅผ ๊ด๋ฆฌํ์ฌ, ๋ ์ด์ ํด๋น ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ shared_ptr๊ฐ ์์ ๋ ๊ฐ์ฒด๋ฅผ ์๋์ผ๋ก ์ญ์ ํฉ๋๋ค. ์ด๋ <memory> ํค๋์ ์ ์๋์ด ์์ต๋๋ค.
- ์ฐธ์กฐ ์นด์ดํ (Reference Counting): shared_ptr ์ธ์คํด์ค ๊ฐ์ ๊ณต์ ๋๋ ๋ด๋ถ ๋ฉ์ปค๋์ฆ์ผ๋ก, ํ๋์ ๊ฐ์ฒด์ ๋ํ shared_ptr์ ์๋ฅผ ์ถ์ ํฉ๋๋ค. ์ฐธ์กฐ ์นด์ดํธ๊ฐ 0์ด ๋๋ฉด ๊ด๋ จ๋ ๊ฐ์ฒด๋ ์๋์ผ๋ก ์๋ฉธ๋ฉ๋๋ค.
- std::make_shared: ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ํด๋น ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ shared_ptr๋ฅผ ๋ฐํํ๋ ํจ์์
๋๋ค. ์ด ๋ฐฉ์์ ๊ฐ์ฒด์ ์ฐธ์กฐ ์นด์ดํธ๋ฅผ ์ํ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ์ต์ ํํฉ๋๋ค.
- std::shared_ptr<MyClass> sharedPtr1(new MyClass());์ std::make_shared<MyClass>()๋ฅผ ์ฌ์ฉํ์ฌ std::shared_ptr๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์ ์ฌํ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ค์ง๋ง, ๋ช ๊ฐ์ง ์ค์ํ ์ฐจ์ด์ ์ด ์์ต๋๋ค.
- std::shared_ptr<MyClass> sharedPtr1(new MyClass()); ์ผ๋ก ์ง์ ์์ฑ ์, ๋จผ์ ๊ฐ์ฒด๋ฅผ ์ํ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ด ์ด๋ฃจ์ด์ง๊ณ , ๊ทธ ๋ค์์ shared_ptr์ ์ ์ด ๋ธ๋ก(control block, ์ฐธ์กฐ ์นด์ดํธ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฉ๋ชจ๋ฆฌ)์ ์ํ ๋ณ๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ด ์ด๋ฃจ์ด์ง๋๋ค. ์์ธ ์์ ์ฑ์ ์ฝ๊ฐ์ ๋ฌธ์ ๊ฐ ์์ ์ ์์ต๋๋ค. new MyClass()์ std::shared_ptr ์์ฑ์ ์ฌ์ด์ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด, new๋ก ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํด์ ๋์ง ์์ ์ ์์ต๋๋ค.
- ์ด์ ๋ฌ๋ฆฌ make_shared ๋ก ๋ง๋ค๋ฉด ๊ฐ์ฒด์ ์ ์ด ๋ธ๋ก์ ์ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ๋์ ํ ๋น ๋จ๊ณ๋ก ์ฒ๋ฆฌํด์, ๋ฉ๋ชจ๋ฆฌ ํ ๋น ํ์๋ฅผ ์ค์ด๊ณ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค. ๋ํ make_shared๋ ์์ธ ์์ ์ฑ์ ๊ฐ์ถ๊ณ ์์ต๋๋ค. ๊ฐ์ฒด ์์ฑ ์ค ์์ธ๊ฐ ๋ฐ์ํ๋ฉด, ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์๋์ผ๋ก ํด์ ๋ฉ๋๋ค.
- std::allocate_shared: ์ฌ์ฉ์ ์ ์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์์ ํจ๊ป shared_ptr๋ฅผ ์์ฑํ ๋ ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ make_shared์ ์ ์ฌํ์ง๋ง, ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ฐฉ์์ ์ฌ์ฉ์๊ฐ ์ปค์คํฐ๋ง์ด์งํ ์ ์์ต๋๋ค.
std::allocate_shared๋ std::shared_ptr๋ฅผ ์์ฑํ ๋ ์ฌ์ฉ์ ์ ์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์๋ฅผ ์ฌ์ฉํ๊ณ ์ ํ ๋ ํ์ฉ๋ฉ๋๋ค. ์ด ํจ์๋ ํนํ ๋ฉ๋ชจ๋ฆฌ ํ ๋น๊ณผ ๊ด๋ จํ์ฌ ์ฑ๋ฅ ์ต์ ํ๊ฐ ํ์ํ๊ฑฐ๋, ํน์ํ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์๊ตฌ์ฌํญ์ด ์๋ ๊ฒฝ์ฐ์ ์ ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฉ๋ชจ๋ฆฌ ํ์์ ๊ฐ์ฒด๋ฅผ ํ ๋นํ๊ณ ์ ํ ๋ allocate_shared๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ฉ๋ชจ๋ฆฌ ํ์ ๋ฏธ๋ฆฌ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ๊ด๋ฆฌํ๋ฉฐ, ๊ฐ์ฒด๊ฐ ํ์ํ ๋๋ง๋ค ์ด ํ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๊ณ ๋ฐํํ๋ ๋ฐฉ์์ผ๋ก ์๋ํฉ๋๋ค. ์ด๋ ํ ํ ๋น๊ณผ ๊ด๋ จ๋ ์ค๋ฒํค๋๋ฅผ ์ค์ด๊ณ ์ฑ๋ฅ์ ํฅ์์ํค๋ ๋ฐ ๋์์ ์ค ์ ์์ต๋๋ค. - std::weak_ptr: shared_ptr์ ๋ํ ๋น์์ ์ฐธ์กฐ๋ฅผ ์ ๊ณตํฉ๋๋ค. weak_ptr๋ ๊ฐ์ฒด์ ์๋ช ์ฃผ๊ธฐ์ ์ํฅ์ ์ฃผ์ง ์๊ณ , ์ํ ์ฐธ์กฐ๋ฅผ ๋ฐฉ์งํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
- std::owner_less: shared_ptr ๋๋ weak_ptr ์ธ์คํด์ค๋ฅผ ๋น๊ตํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ด๊ฒ์ ์์ ๊ถ์ ๊ธฐ๋ฐ์ผ๋ก ํฌ์ธํฐ๋ค์ ๋น๊ตํ๋ฉฐ, ์ ๋ ฌ์ด๋ ์ปจํ ์ด๋์ ์ ์ฅํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
- std::enable_shared_from_this: ํด๋์ค ๋ด์์ this ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ์ฌ shared_ptr๋ฅผ ์์ ํ๊ฒ ์์ฑํ ์ ์๋๋ก ํฉ๋๋ค.
- std::shared_from_this: enable_shared_from_this๋ฅผ ์์๋ฐ์ ๊ฐ์ฒด์์ ํธ์ถ๋๋ฉฐ, ๊ฐ์ฒด ์์ ์ ๋ํ shared_ptr๋ฅผ ๋ฐํํฉ๋๋ค.
- std::static_pointer_cast, std::dynamic_pointer_cast, std::const_pointer_cast: ์ด๋ค์ shared_ptr์ ์บ์คํ ์ ์ํ ํจ์๋ค๋ก, ๊ฐ๊ฐ static_cast, dynamic_cast, const_cast์ ์ ์ฌํ๊ฒ ๋์ํฉ๋๋ค.
- std::get_deleter: shared_ptr์ ์ฐ๊ฒฐ๋ ์ญ์ ์(deleter)๋ฅผ ๊ฒ์ํ๋ ํจ์์ ๋๋ค. shared_ptr๊ฐ ์ฌ์ฉ์ ์ ์ ์ญ์ ์๋ฅผ ๊ฐ์ง ์ ์๋๋ฐ, ์ด ํจ์๋ฅผ ์ฌ์ฉํด ํด๋น ์ญ์ ์์ ์ ๊ทผํ ์ ์์ต๋๋ค.
- ์ญ์ ์(Deleter): shared_ptr๋ฅผ ์์ฑํ ๋ ์ฌ์ฉ์ ์ ์ ์ญ์ ํจ์๋ฅผ ์ ๊ณตํ ์ ์์ผ๋ฉฐ, ์ด๋ shared_ptr์ ์ํด ๊ด๋ฆฌ๋๋ ๊ฐ์ฒด๊ฐ ์ญ์ ๋ ๋ ํธ์ถ๋ฉ๋๋ค.
- ์ค๋ ๋ ์์ (Thread Safety): shared_ptr๋ ๋ค์ค ์ค๋ ๋ ํ๊ฒฝ์์๋ ์ฐธ์กฐ ์นด์ดํธ์ ๋ณ๊ฒฝ์ด ์์ ํ๋๋ก ์ค๊ณ๋์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฌ๋ฌ ์ค๋ ๋์์ ๋์ผํ shared_ptr ์ธ์คํด์ค๋ฅผ ๋์์ ์ฝ๊ณ ์ฐ๋ ๊ฒ์ ์ฌ์ ํ ์ค๋ ๋ ์์ ํ์ง ์์ต๋๋ค.
- ์ฌ์ฉ์ ์ ์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ: shared_ptr๋ ํ์ค ์ญ์ ์ ์ธ์ ์ฌ์ฉ์ ์ ์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ๋๋ ์ญ์ ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด์ ํ ๋น๊ณผ ํด์ ๋ฐฉ์์ ์ฌ์ฉ์๊ฐ ์ ์ํ ์ ์๋๋ก ํฉ๋๋ค.
์ํ ์ฐธ์กฐ(Circular References): shared_ptr ๊ฐ์ ์ํ ์ฐธ์กฐ๊ฐ ๋ฐ์ํ๋ฉด, ์ฐธ์กฐ ์นด์ดํธ๊ฐ ์์ํ 0์ด ๋์ง ์์ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด weak_ptr๋ฅผ ์ฌ์ฉํ์ฌ ์ํ ์ฐธ์กฐ๋ฅผ ๋์ ์ ์์ต๋๋ค.
make_shared<this>๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ C++์์ ๋ฌธ์ ๊ฐ ๋ ์ ์๋ค. ์ด์ ๋ ๋ช ๊ฐ์ง๊ฐ ์๋ค
- ์๋ชป๋ ์ฌ์ฉ: std::make_shared ํจ์๋ ํ์ ์ ํ ํ๋ฆฟ ์ธ์๋ก ๋ฐ์ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ๋๋ฐ, this ํฌ์ธํฐ๋ ์ด๋ฏธ ์กด์ฌํ๋ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๊ธฐ ๋๋ฌธ์, make_shared<this>๋ ๋ฌธ๋ฒ์ ์ผ๋ก ์๋ชป๋์ด.
- ์ค๋ณต๋ ์์ ๊ถ ๋ฌธ์ : ๋ง์ฝ make_shared<this>๊ฐ ์๋ํ๋ค๊ณ ํ๋๋ผ๋, ์ด๋ ๊ฐ์ ๊ฐ์ฒด์ ๋ํด ๋ ๊ฐ์ ๋ณ๋ shared_ptr ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๊ฒ์ด ๋๊ณ , ์ด๋ ์ค๋ณต๋ ์์ ๊ถ๊ณผ ๊ด๋ จ๋ ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํด.
- ๋ฉ๋ชจ๋ฆฌ ๋์: ๊ฐ shared_ptr๋ ์ฐธ์กฐ ์นด์ดํธ๋ฅผ ๊ด๋ฆฌํด. ๋ง์ฝ ํ ๊ฐ์ฒด์ ๋ํด ๋ ๊ฐ์ shared_ptr๊ฐ ์์ฑ๋๋ฉด, ๊ฐ๊ฐ์ ์ฐธ์กฐ ์นด์ดํธ๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ์๋ํด. ์ด๋ ๊ฐ์ฒด๊ฐ ์ ์ ํ๊ฒ ํด์ ๋์ง ์๋ ๋ฉ๋ชจ๋ฆฌ ๋์๋ก ์ด์ด์ง ์ ์์ด.
- ์๊ธฐ์น ์์ ์๋ฉธ: ํ shared_ptr๊ฐ ์๋ฉธ๋๋ฉด ๊ด๋ฆฌํ๋ ๊ฐ์ฒด๋ ๊ฐ์ด ์๋ฉธํ ์ ์์ด. ๋ง์ฝ ๋ค๋ฅธ shared_ptr๋ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํจ๋ค๋ฉด, ์ด๋ ์๊ธฐ์น ์์ ๊ฐ์ฒด ์๋ฉธ๋ก ์ด์ด์ง ์ ์์ด.
- this ํฌ์ธํฐ์์ ์ถฉ๋: this ํฌ์ธํฐ๋ ํ์ฌ ๊ฐ์ฒด์ ๋ํ ํฌ์ธํฐ์ผ. make_shared๋ฅผ ์ฌ์ฉํด this๋ฅผ ๊ฐ๋ฆฌํค๋ ์ shared_ptr๋ฅผ ์์ฑํ๋ ค ํ๋ฉด, ์๋ ๊ฐ์ฒด์ ์๋ก์ด shared_ptr ๊ฐ์ ์ถฉ๋์ด ๋ฐ์ํ ์ ์์ด.
- ์ค๋ ๋ ์์ ์ฑ ๋ฌธ์ : ๋์ผ ๊ฐ์ฒด์ ๋ํ ์ฌ๋ฌ shared_ptr ์ธ์คํด์ค๊ฐ ์์ ๋, ์ฐธ์กฐ ์นด์ดํธ์ ์กฐ์ ์ ์ค๋ ๋ ์์ ํ์ง ์์ ์ ์์ด. ์ด๋ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ ๋ฌธ์ ๋ก ์ด์ด์ง ์ ์์ด.
- ์ค๊ณ ๋ฌธ์ : this๋ฅผ ์ฌ์ฉํ์ฌ shared_ptr๋ฅผ ์์ฑํ๋ ๊ฒ์ ์ผ๋ฐ์ ์ธ ๊ฐ์ฒด ์์ ๊ถ์ ์์น์ ์ด๊ธ๋. ์ด๋ ๊ฐ์ฒด์ ์๋ช ์ฃผ๊ธฐ ๊ด๋ฆฌ์ ์์ ๊ถ์ ๋ํ ํผ๋์ ์ด๋ํ ์ ์์ด.
- ๋์์ ๋ถ์ฌ: enable_shared_from_this๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ฌ ๊ฐ์ฒด์ ๋ํ ์์ ํ shared_ptr์ ์์ฑํ ์ ์์ด, make_shared<this> ๊ฐ์ ์๋ชป๋ ์ฌ์ฉ์ ํผํ ์ ์์ด.
- ๋๋ฒ๊น ์ด๋ ค์: ์ด๋ฐ ๋ฌธ์ ๋ค์ ๋๋ฒ๊น ์ ์ด๋ ต๊ฒ ๋ง๋ค์ด. ์ด๋ค shared_ptr๊ฐ ๊ฐ์ฒด๋ฅผ ์๋ฉธ์์ผฐ๋์ง ์ถ์ ํ๊ธฐ๊ฐ ์ด๋ ค์์ ธ.
- ์ค๊ณ ๊ฐ์ด๋ ์๋ฐ: shared_ptr์ ๊ฐ์ ์ค๋งํธ ํฌ์ธํฐ๋ ๊ฐ์ฒด์ ์์ ๊ถ๊ณผ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๋ช ํํ๊ฒ ๊ด๋ฆฌํ๊ธฐ ์ํด ์ค๊ณ๋๋๋ฐ, make_shared<this> ์ฌ์ฉ์ ์ด๋ฌํ ์ค๊ณ ๊ฐ์ด๋๋ฅผ ๋ฌด์ํ๋ ๊ฒ์ด ๋์ด.
๊ฒฐ๋ก ์ ์ผ๋ก, this ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ์ฌ shared_ptr๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋ง์ ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํ ์ ์์ผ๋ฉฐ, ์ฌ๋ฐ๋ฅธ ์ฌ์ฉ๋ฒ์ด ์๋์ผ. ๋์ , enable_shared_from_this๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์์ ํ๊ณ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ด์ผ.
C ์บ์คํ ๊ณผ C++ ์บ์คํ ์ ์ฐจ์ด๋ฅผ ๊ฐ๋จํ ์์ฝํ๋ฉด ์ด๋ ์ต๋๋ค
- C ์บ์คํ : C์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก (type) ํ์์ ์บ์คํ ์ ์ฌ์ฉํด์. ์ด ๋ฐฉ์์ ๊ฐ๋จํ์ง๋ง ํ์ ์์ ์ฑ์ด๋ ๋ช ํ์ฑ์ด ๋ถ์กฑํด์.
- C++ ์บ์คํ : C++์์๋ static_cast, dynamic_cast, const_cast, reinterpret_cast์ ๊ฐ์ด ๋ค์ํ ์บ์คํ ์ฐ์ฐ์๋ฅผ ์ ๊ณตํด์. ์ด๋ค์ ๊ฐ๊ฐ ํน์ ํ ์ฌ์ฉ ๋ชฉ์ ๊ณผ ํ์ ์์ ์ฑ์ ๊ฐ์ง๊ณ ์์ด์.
- ํ์ ์์ ์ฑ: 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`์ ์ ์ฉํ ๊ฒ์ผ๋ก, ๊ฐ๊ฐ์ ๋ชฉ์ ๊ณผ ์ฌ์ฉ๋ฒ์ ๊ธฐ๋ณธ ์บ์คํ
์ฐ์ฐ์์ ์ ์ฌํฉ๋๋ค.