์ธ๋ฆฌ์ผ ์ค๋ธ์ ํธ ํฌ์ธํฐ๋ C++์ ์ค๋งํธ ํฌ์ธํฐ์ ์ ํ ๋ค๋ฆ
UPROPERTY ๋งํน๋ raw pointer๋ C++ ๋ฌธ๋ฒ์ unmanaged์ฒ๋ผ ๋ณด์ด์ง๋ง ์ธ๋ฆฌ์ผ GC๊ฐ ์ถ์ ํ๊ธฐ ๋๋ฌธ์ strong reference์
UPROPERTY ๋งํน๋์ง ์์ raw pointer๋ ์ธ๋ฆฌ์ผ ํ๋กํผํฐ ์์คํ (๋ฆฌํ๋ ์ )์ ๋ณด์ด์ง ์๊ธฐ ๋๋ฌธ์ GC๊ฐ ์ถ์ ํ ์ ์์
๋ณดํต GC๋ ๋ชจ๋ ์ค๋ธ์ ํธ์ ๋ํด ์ฐธ์กฐ๊ด๊ณ๋ฅผ ๊ทธ๋ํ๋ก ๊ทธ๋ ค์ reachability(๋๋ฌ์ฑ)๋ฅผ ์ถ์ ํจ
๊ทธ๋ฌ๋ค๊ฐ ์ด๋ค ์ค๋ธ์ ํธ๊ฐ ๋ ์ด์ ์ฐธ์กฐ๋์ง ์์ unreachable(orphaned)์ด๋ผ๊ณ ํ๋จ๋๋ฉด ์ญ์ ํ๋ ์์ผ๋ก ๋์ํจ
์ฝ๊ฒ ๋งํด์ ์๋ฌด๋ ์ฐธ์กฐํ์ง ์์ผ๋ฉด ์ญ์ ํ๋๊ฑฐ์. ๋ญ ์ด๊ฑด ์ด๋ฏธ ์๊ณ ์๊ฒ ์ง๋ง..
๊ทธ๋ฌ๋ ์ธ๋ฆฌ์ผ์ ๊ฐ๋น์ง ์ฝ๋ ํฐ์๋ MarkPendingKill ์ด๋ผ๋ ๊ธฐ๋ฅ์ด ์๋๋ฐ, reachable object๋ผ๋ ๊ฐ์ ๋ก ์ญ์ ํ ์ ์๋ ๊ธฐ๋ฅ์
๊ทธ๋ผ ํด๋น object์ ๋ํ strong references๋ ์ด๋ป๊ฒ ๋๋๊ฑฐ๋?
GC๊ฐ ํด๋น reference(pointer)๋ฅผ ์๋์ผ๋ก null๋ก ๋ฐ๊ฟ์ค
๋๋ถ์ ๊ฐ์ ์ญ์ ๋๋๋ผ๋ dangling pointer๊ฐ ๋๋ ์ผ์ด ์์ด ์์ ํจ
๊ฐ์ฅ ํํ ์์๊ฐ ์ ๋ฌธ์์๋ ์จ์๋ฏ์ด AActor::Destroy() ๊ฐ์ ๊ธฐ๋ฅ์
์กํฐ๋ ๊ฒ์ ์ค๊ฐ์ ์ธ์ ๋ ์ญ์ ๋ ์ ์์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ด๋ฐ ๊ธฐ๋ฅ์ด ์๋ ๊ฒ์
UObejct์ ๋ํ ๋ ํผ๋ฐ์ค๋ฅผ UObject๊ฐ ์๋ Native C++์์ ๊ฐ์ง๊ณ ์๋ค๋ฉด...
์ด ๊ฒฝ์ฐ ๋ฆฌํ๋ ์ ์์คํ ์ด ๋ชป๋ณด๊ธฐ ๋๋ฌธ์ strong ref๊ฐ ๋ ์ ์๋ค (์ฐธ์กฐ์ค์ธ UObject์ ๋ํด reachableํ ๊ฒ์ผ๋ก ์ธ์ ๋ฐ์ง ๋ชปํจ)
๋ฐ๋ผ์ ํด๋น UObject๊ฐ unreachable์ด ๋์ด GC์ ์ํด ์ญ์ ๋๋ ๊ฒ์ ๋ง์ ์๋ ์๊ณ , GC๊ฐ ํด๋น reference๋ฅผ ์๋์ผ๋ก null๋ก ๋ง๋ค์ด์ฃผ์ง๋ ์๊ธฐ ๋๋ฌธ์ ์ญ์ ๋์๋ค๋ ์ฌ์ค์กฐ์ฐจ๋ ์ ์๊ฐ ์์ด ์ํํ๋ค
์ด๋ฐ ๊ฒฝ์ฐ๋ฅผ ์ํด์ TWeakObjectPtr์ด ์์. ์ญ์ ๋์๋์ง ์ฌ๋ถ๋ผ๋ ์ ์ ์๊ฒ ํด์ฃผ๋ ์น๊ตฌ์
์ค๋งํธ ํฌ์ธํฐ์ TWeakPtr๊ณผ๋ ๋น์ทํ๊ฒ ๊ฐ์ผ๋ฉด์๋ ์ ํ ๋ค๋ฅธ ๋ ์์ด๋ ํท๊ฐ๋ฆฌ์ง ์๋๋ก ์ฃผ์ํ์
์ฐธ๊ณ ๋ก ๋ธ๋ฆฌ๊ฒ์ดํธ๋ ๋ด๋ถ์ ์ผ๋ก UObject๋ฅผ TWeakObjectPtr๋ก ์ฐธ์กฐํ๋๋ก ๊ตฌํ๋์ด์์
๊ทธ๋์ BindUObject ํจ์๊ฐ ๋ฐ๋ก ์๋๊ฑฐ์
์ญ์ ๋ UObject์ ๋๊ณ ๋ธ๋ฆฌ๊ฒ์ดํธ ์คํ์์ผฐ๋ค๊ฐ ํฐ์ผ๋๋๊น ์ ์ด๋ ๋ฑ๋ก ๋์์ด ์ด์์๋์ง๋ ์์์์ด์ผ์ง
์ฝ๋๋ก ์ ๋ฆฌํ๋ฉด
UCLASS(...)
class UMyObject : public UObject
{
GENERATED_BODY()
UPROPERTY()
UAnotherMyObject* StrongRef; // GC๊ฐ ์ถ์ ํด์ ๊ด๋ฆฌํด์ค. ์ฐธ์กฐ ๋์์ ๋ํด ์์ ๊ถ ์์
TWeakObjectPtr<UAnotherMyObject> WeakRef; // GC๊ฐ ์ถ์ ํ์ง๋ ์์. ์์ ๊ถ์ ์์ง๋ง ์ด์์๋์ง ์กฐํํด๋ณผ์๋ ์์
UAnotherMyObject* UnmanagedRef; // ์ํํจ. ์์ ๊ถ๋ ์๊ณ ์ด์์๋์ง๋ ์์์์
TWeakPtr<FMyData> WeakPtr; // ์ ํ ๋ค๋ฅธ ๋. UObject๋ ๊ด๋ จ ์์ (native c++)
...
};
์ด์์ด ์ธ๋ฆฌ์ผ์ ์ค๋ธ์ ํธ ์ฒ๋ฆฌ์ ๊ฐ๋น์ง ์ฝ๋ ํฐ์ ๊ดํ ๋ด์ฉ์ด๊ณ
์ค๋งํธ ํฌ์ธํฐ์ ํํ ํผ๋ํ๋ ๋ถ๋ถ์ ์ ๋ฆฌํด์ฃผ์๋ฉด
C++์์ stack ๊ฐ์ฒด์ storage class๋ automatic storage duration์
์๋ช ์ฃผ๊ธฐ๊ฐ ์ธ์ด์ ๊ฐ๋ ์ธ '์ค์ฝํ { } ๋ด๋ถ' ๋ผ๊ณ ๋ช ํํ๊ฒ ์ ์๋จ
์๋ช ์ฃผ๊ธฐ๊ฐ ๋ช ํํ๊ธฐ ๋๋ฌธ์ ์ฌ์ง์ด ์์ธ๊ฐ ๋ฐ์ํ๋๋ผ๋ ์๋ฉธ์๋ ๋ฐ๋์ ํธ์ถ๋๋ค๋ ๊ฒ์ด ๋ณด์ฅ๋จ
๊ทธ๋์ ์๋ฉธ์๋ฅผ ์ด์ฉํ๋ฉด ๋์ (heap) ๊ฐ์ฒด์ ์๋ช ์ฃผ๊ธฐ๋ ์์ ํ๊ฒ ๊ด๋ฆฌํ ์ ์์ง ์๊ฒ ๋๋ ์์ด๋์ด์์ ๋์จ๊ฒ ์ค๋งํธ ํฌ์ธํฐ์
์์ฑ์/์๋ฉธ์๋ฅผ ์ด์ฉํด์ ํฌ์ธํฐ '์ค์ค๋ก' ์ฐธ์กฐ ํ์๋ฅผ ์ธ๋๋ก ํ๋๊ฑฐ์. ๊ทธ๋์ ์ค๋งํธ ๋ผ๊ณ ๋ถ๋ฅด๋ ๊ฒ
ํฌ์ธํฐ ์ค์ค๋ก ์ฐธ์กฐ ํ์๋ฅผ ์ผ๋ค๋ ๋ถ๋ถ์ด ์ค์ํจ
์ค๋งํธ ํฌ์ธํฐ ์ค์ค๋ก ์ง์ ํ๋จํ๊ธฐ ๋๋ฌธ์, ์ฐธ์กฐ๊ด๊ณ๊ฐ ๋ณ๊ฒฝ๋๋ '์ฆ์' ๋ ํผ๋ฐ์ค ์นด์ดํธ๋ฅผ ๊ฐฑ์ ํ ์ ์์
๊ทธ๋์ ์ค๋งํธ ํฌ์ธํฐ๋ก ๊ด๋ฆฌ๋๋ ์ค๋ธ์ ํธ๋ orphaned(๊ณ ์)๊ฐ ์์. ๊ณ ์๊ฐ ๋๋ ์ฆ์ ๋ฐ๋ก ์ญ์ ํ๋๊น.
๋ฐ๋ฉด GC ๋ฐฉ์์ GC๋ผ๋ ์ธ๋ถ ์์คํ ์ด ์ฐธ์กฐ๊ด๊ณ๋ฅผ '๋๊ธํ๊ฒ' ์ถ์ ํจ
๋๋ฌ์ฑ ๊ณ์ฐ์ด ์ ํด์ง ์ฃผ๊ธฐ์ ๋ฐ๋ผ ์ํ๋จ
void foo()
{
UMyObject* Obj = NewObject<UMyObject>();
...
}
์ด๋ ๊ฒ NewObject๋ก ์์ฑํ ๊ฐ์ฒด๋ฅผ raw pointer์ ๋ด์๋ ๋ฐ๋ก ์ญ์ ๋์ง ์๋๊ฑด ์ด๋ฐ ์ด์ ๋๋ฌธ์
ํ์ง๋ง ์ ๋ ๊ฒ ์์ฑํ ๊ฐ์ฒด๋ฅผ strong ref๋ก ๋ด์๋์ง ์์ผ๋ฉด ์กฐ๋ง๊ฐ ์ญ์ ๋๊ณ ๋ง๊ฒ ์ง
๋ง์ง๋ง์ผ๋ก, ์ง๋ฌธ์๊ฐ ์ฌ๋ฆฐ ์ฝ๋ ์ค๋ํซ์ ์ค๋ฅ๊ฐ ์๊ธธ๋ ์ค๋ช ์งค๋ก ๋ง๋ฌด๋ฆฌํจ
์ต์ ํ์ ,์ค๋ง๊ฒ,๋ฅ์จ ์ ์ค ํ ๊ณณ์ ๋์ค์ ๋ถ ์๋๊น ์ถ์ ์ ๋๋ก ์ง์์ ๊น์ด ๋จ๋ค๋ฅด๋ค์ ์ค๋๋ ๋ง์๊ฑธ ๋ฐฐ์ฐ๊ณ ๊ฐ๋๋ค, ์ ๋ฆฌ ์ ํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค ์ค๋๋ฆฌ์๋. ๋ฐ๋ก ๊ธ ์ฌ๋ฆดํ ๋ฐ ๋ง์ง๋ง์ผ๋ก ํ ๋ฒ๋ง ๋ด์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
๊ทธ๋ฌ์ผ๋ฉด ์ข๊ฒ ์ง๋ง ์ค์๊ธฐ์ ์์ ์ ๋ํฐ ๋ง์ง๊ณ ์๋ค
๊ตณ
์ ๋ํฐ ์ธ๋ฆฌ์ผ ๋ ๋ค ๋ค๋ฃธ?
ใ ใ - dc App
๊ธ ๋๋ฌ๋ณด๋ค๊ฐ ์ฌ์กฑ๋จ๊น ์๋ํฐ๋ ์ค ํ๋ก๊ทธ๋จ์ด๋ gc ๋๋ฆฌ๋ ์ฃผ๊ธฐ๊ฐ ๋ค๋ฅธ๊ฒฝ์ฐ ๋ง์ gc ์ธ๋ ค๋๊ฐ๋๊ฑฐ ์ฃผ์ํ๋ฉด์ ์ฝ๋ฉํด์ผํจ