class U
{
public:
ย ย ย virtual ~U();
}
class FGameProperty
{
public:
ย ย ย int Hp;
}
class AActor : public U, class FGameProperty
{
}
์ผ๋,
AActor* Character = new AActor{};
dynamic_cast<FGameProperty*>(Character);
์ฒ๋ผ dynamic_cast๋ฅผ ์จ๋ ๋จ?
์ผ๋จ ์ ๋ฐ์์ผ๋ก ์ฝ๋ฉ์ง์ ๊ฒ์์ด ๋์๊ฐ๊ธด ๋์๊ฐ๋๋ฐ,
์ ํํ๊ฒ ์ ๋๋๊ฑด์ง/์๋ผ๋๊ฑด์ง ์ค๋ช
ํด์ค์ ์์??
๊ทธ๋ฆฌ๊ณ
__interface IAttackable
{
}
์ด ์ธํฐํ์ด์ค๋ ๊ฐ์ ์๋ฉธ์๋ฅผ ๊ฐ์ง๊ณ ์์??
์๋จ ๋ค์ด๋๋ฏน์บ์คํธ ์ปดํ์ผ๋ฌ๋จ์์ ์๋ฌ๋ฑ์ด๋ผ์๋์์ ์ธ๋ ฌ์ฝ๋๊ฐ์๋ฐ ์บ์คํ ์ธ๋ฆฌ์ผ๊บผ์จ๋ผ ๊ธ๊ณ ๊ฐ์์๋ฉธ์๋ ๋๊ฐ์ํ๋ค
๋ ธ๋ ธ ์ธ๋ฆฌ์ผ ์๋ ์ปดํ์ผ๋ฌ์์๋ ์๋ฌ ์๋๊ณ ์๋๊น์ง ์๋จ. __interface ํค์๋๊ฐ ๊ฐ์ ์๋ฉธ์๋ฅผ ์ ์ ์ํด๋ ๋ด๋ถ์ ์ผ๋ก ๋ง๋ค์ด์ฃผ๋์ง๋ฅผ ๋ชป์ฐพ๊ฒ ์
์ธ๋ ฌ๋ง๊ณ ๋ ์กํฐ์ฐ๋๋ณด๋ค ์ํผ ๋คํ์ฑํ์ ๋ฌธ์ ๋ก ๋ค์ด๋๋ฏน์บ์คํธ ์ ๊ธฐ์์ฐ๋๊ฑฐ ์ํํจ
๋์๊ฐ์๋์๋๋ฐ ์ธ์ ์๋ฌ๋ฑ์ด๋ด๋ ์ด์ํ ๊ฒ ์๋์ฝ๋
๋๋ ๋ก์ฐ๋ ๋ฒจ์๋ชฐ๋ผ์ ์ด๋ฐ๊ฒฝ์ฐ ๊ฑ ์คํํฑ์ด๋ ๋ฆฌ์ธํฐํ๋ฆฌํธ์ธ๋ฏ
์ ์์ ์์ ๊บฝ์ ๊ดํธ <>์์ ์๋ ํด๋์ค๊ฐ ๋คํํด๋์ค๊ธฐ๋ง ํ๋ฉด๋จ?
์คํํฑ์ด๋ ๋ฆฌ์ธํฐํ๋ฆฌํธ ์ฐ๋ฉด AActorํด๋์ค์ ๋ช๋ฒ์งธ ์คํ์ ์ด FGameProperty์ ๋ฉค๋ฒ์ธ์ง ์์ ์์ง ์๋?
ใ ใ ํ์ ์์ด๋ ๋ฉํํ๋ก๊ทธ๋๋ฐ์ด๋ std ๋ ๋ญ์๋๊ฑฐ๊ฐ์๋ฐ ๊ธฐ์ต์๋จ ์จ์ํ๊ณ ์ธ๋ ฌ๋งํด์ ๋นก๋๊ฐ๋ฆฌ๋๋ฏ
๋คํํด๋์ค๊ฐ ์ ค๋ง์๋ฏ
๋ด์๊ฐ 1. ๊ฐ์์๋ฉธ์์ถ๊ฐํด ๋คํ์ฑ ์ฑ๊ฒจ์ฃผ๊ธฐ 2. ์คํํฑ ์บ์คํธ๋ฅผ ์ฐ๋๊ฒ( ์์ ์ฑ ๋ณด์ฅ๋์ง์์) 3. typeid ๋ฅผ ์ฌ์ฉํด์ ์บ๋ฆญํฐ ๊ฐ์ฒด์ ํ์ ์ ํ์ธํ๊ณ ์ผ์นํ๋์ง ๋น๊ต 4. C17์ด์์ผ๊ฒฝ์ฐ std variant ๋ any ์ฌ์ฉ rtti ๋๋ฌธ์ ๊ณต๋ถํ๋๊ฑฐ๋ผ๋ฉด 3๋ฒ์ ์ฃผ์๊น๊ฒ ์๊ฐํด๋ณผ๊ฒ
https://learn.microsoft.com/ko-kr/cpp/cpp/interface?view=msvc-170
์ธํฐํ์ด์ค ๊ด๋ จ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ์์๋ฉธ์ ์์
์ค๋ฌ๋ง์ C++ํ๋๊น ๋จธ๋ฆฌ์ํ๋ ธ ๊ฑ ๋๋ฐ๊ฑฐ๋ฆฌ๋ฉด์ ์์ง์ด๋ ๋ง์ ธ์ผ๊ฒ๋ค
์ ์บ์คํ ์ด๋๊น AActor* Character = new AActor{}; FGameProperty* CharacterProperty = Charcter; - ์์์ ๋ณํ ์ด๋ ๊ฒ ์ธ ์๋ ์์
์ด๋ํฐ ํจํด์ ์จ์ผํ ๋ฏ
์ผ๋จ AActor -> FGameProperty๋ ๊ผญ ๋ค์ด๋๋ฏน ์บ์คํ ๋ง๊ณ ๊ทธ๋ฅ static_cast๋ก๋ ๋จ.. ํฌ์ธํฐ ์คํ์ ๋ง ์ ์ฉํ๋ฉด ๋๋๊ฑฐ๋ผ.. ๋ค์ด๋๋ฏน ์บ์คํ ์ rtti๋ฅผ ์ด์ฉํด์ ๊ฐ์ฒด์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ฒดํฌํ ์ ์์ด์ ์ ๊ฑฐ์๋ค๊ฐ ์ฌ์ง์ด U* u = (U*)Character; ์์ u๋ฅผ ๊ฐ์ง๊ณ FGameProperty๋ก ์บ์คํ ํด๋ ์ ์์ ์ผ๋ก ์บ์คํ ์ด ๊ฐ๋ฅํจ. ์ด๊ฑฐ๋ ๋ง์ฝ static_cast๋ก ํ๊ณ ์ถ์ผ๋ฉด ์ฐ์ u๋ฅผ AActor๋ก ์บ์คํ ํ ๋ด์ ๋ค์ FGameProperty๋ก ์บ์คํ ํด์ค์ผ ์ ์์ ์ผ๋ก ํฌ์ธํฐ๊ฐ ์ป์ด์ง
static_cast๋ก ๋๋๊ฑด ์ข ์ ์ ์ดํด๋ฅผ ํ์๋๋ฐ, dynamic_cast๊ฐ ์ ํํ ๋๋๊ฑด์ง ์๋๋๊ฑด์ง๊ฐ ์์ง๋ ์ ๋ชจ๋ฅด๊ฒ ์. FGameProperty๋ ๋คํ ํด๋์ค๊ฐ ์๋๋ฐ๋ dynamic_cast๊ฐ ๋๋ค๋๊ฑฐ์ง?
์ ์ฐธ๊ณ ๋ก ์ static_cast๋ ํด๋น ํด๋์ค์ ๋ํ ํ์์ ๋ณด๊ฐ ์ ๊ทผ ๊ฐ๋ฅํ ์์น์์๋ง ์ ์์ ์ผ๋ก ๋จ.. ์ ๋ฐฉ์ ์ธ๋ง ๋ ์ํ๋ก ๋ ํด๋์ค๊ฐ์ ์์๊ด๊ณ๋ฅผ ๋ชจ๋ฅด๋ ์์น์์ ํ๋ฉด ๋ง๊ฐ
ใ ใ ๋จ ๋คํ ํด๋์ค๋ ์๊ด์์ ๊ทธ๋ฅ rtti๋ง ํ์ฑํ ๋์ด์๋ ํ๋ก์ ํธ ์ธํ ์ด๋ฉด ๋๋๊ฑฐ๋ผ.. ๊ทธ๋ฆฌ๊ณ ์ผ๋ถ๋ฌ ๊ฑด๋๋ฆฌ์ง ์๋ ์ด์ rtti๋ ์ผ์ง๊ฒ ๊ธฐ๋ณธ์ด๋ผ..
์ ์จ ๋๋ฌด ์ด๋ ค์ด๋ฐ.. rtti ์์ฃผ ์์ธํ๊ฒ ์๋ ค๋ฌ๋ผ๊ณ gpt์ ๋ฌผ์ด๋ด๋ ์์๋ ค์ฃผ๋๋ฐ ๋ญ ์ด์ผ ๊ณต๋ถํด์ผ๋๋์ง๋ฅผ ๋ชจ๋ฅด๊ฒ๋ค
__interface๋ vtable์ ์๊ฐ์ง๊ณ ์๋ค๋๋ฐ, vtable ์์ด ์ด๋ป๊ฒ ๊ฐ์ ํจ์๋ฅผ ์ฐ๋๊ฑด์ง๋ ์ดํด ์๋๊ณ
__interface ๋ก ํด๋์ค ์์ ์๊ฒ vtable์ด ์๋ค๋ ๋ป์.. ์์๋ฐ๋ ํด๋์ค๋ค์ vtable ๋ค ์๊ฒจ
https://getupnote.com/share/notes/Ab3fxYeN51fOiUpD77JICW4xvNj1/61ce293e-91b3-42e3-9120-16b2dec155a4
์ด๊ฒ
ํ๋ฆฐ ๋ต๋ณ์ด๋ผ๋๊ฑฐ์ง?
ํ ๋๋ ์ ๋๋ก ๋ชจ๋ฅด๋ ๋ด์ฉ์ด์๋ค ๊ฐ์ ํจ์๊ฐ ํ๋๋ผ๋ ์์ด์ผ dynamic_cast๋๋๊ตฌ๋. ์ ๋ต๋ณ์ด ๋ง๋๋ฏ?
๊ทผ๋ฐ ๋ด๊ฐ ์ข ๋ ์์๋ณด๋๊น ์๋๋ค๋๊ฒ dynamic_cast์ ์ธ์๋ก ์ธ ์ ์๋ค๋ ์๊ธฐ์. ๊ธฐ๋ณธ์ ์ผ๋ก ์ด๋ค ํด๋์ค๋ฅผ ์์๋ฐ๋ ํด๋์ค๋ ๋คํํด๋์ค๋ผ๊ณ ๊ฐ์ฃผํ ์ ์์. ์ด๊ฒ ๋ฌด์จ ๋ง์ด๋๋ฉด AActor* a; dynamic_cast(a); ๋ ์ธ์๊ฐ AActor๋๊น ์๊ด์์. ๊ทผ๋ฐ FGameProperty* p; dynamic_cast(p); ๋ ์๋จ. ๋ค ๋ง๋๋ก FGameProperty๋ ๋น๋คํํด๋์ค์ด๊ธฐ ๋๋ฌธ์ด์ง
๊บฝ์ ๊ดํธ๊ฐ ๋ค ๋ ์๊ฐ๋ค dynamic_cast[FGameProperty](a); dynamic_cast[AActor](p); ์์
__interface๋ ๋ญ์ง ๋ชฐ๋๋๋ฐ gptํํ ๋ฌผ์ด๋ณด๋๊น ๊ฐ์ ์๋ฉธ์ ๋ชป์ฐ๊ณ ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ ์ปจํ ์ด๋ ํด๋์ค๋ก๋ ์ฐ์ง ์๋๊ฒ ์ข์๊ฑฐ ๊ฐ๋คํจ
๊ฒ์ด๊ฒ์ด์ผ... ๋ถ๋ชจ ํฌ์ธํฐ๋ก ์์์ ๊ทธ๋ฅ ๋ด์ ์ ์๋๋ฐ ๋ค์ด๋๋ฏน ์บ์คํธ๋ ๋ญ๋... cpp ๊ณต๋ถ๋ฅผ ์ข ๋ ํ์ ์ผํ ๊ฑฐ ๊ฐ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์์๋ก ์ด๋ ๊ฒ ์์ฑ์ ํ ๋๋ ์ด๋ฏธ ์๋ ํํ์ ์ด๋ฆ ( AActor...!!!! ) ๋ฅผ ์์๋ก๋๋ฉด ๋งค์ฐ ํผ๋์ด ์ค๊ธฐ๋๋ฌธ์ ์ข์ง ์๋ํฉ๋๋ค.
๋ค์ค์์์ ์ ๋๋ก ์์จ๋ด์ ๋ชฐ๋๋ค 'ใ '. dynamic cast๊ฐ ์์ ๋นต์ด๋ผ๊ณ ํ๋๋ฐ... ๋ด๊ฐ ์ ๋ชจ๋ฅด๋ ๋ถ๋ถ์ด ์์๊ตฌ๋จผ.
์์์์์์ ์ด๊ฒ dynamic ์ด์ด์ผ ํ๋ค. ๊ทธ ์ด์ ๊ฐ, ๋ค์ค์์์ ๊ฒฝ์ฐ์ ์ค์ ๋ฉ๋ชจ๋ฆฌ ์คํ์ ์ด ์ด๋ป๊ฒ ๋ ์ง ๋ชจ๋ฅด๋๊น. ๊ทธ๊ฑธ ๊ฒ์ฌํ๋ ์ฉ๋๋ก ๋ค์ด๋๋ฏน ์ด์ด์ผ๋ง ํ ๋ฏ. ์ด๊ฒ ๋ง์ฝ ๋ ๋ค ๋ณ์๊ฐ ์๋ค๋ฉด ํฐ ๋ฌธ์ ์๊ฒ ์ผ๋, ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ฉด ๊ทธ offset์ ๋ง์ถฐ์ค์ผํ๋ ์์ ์ด ํ์ํ๋๊น ( ๊ทธ๋ฅ ๊นก์ผ๋ก ๋ค๋ฅธ ๋ถ๋ชจ ์บ์คํ ํ๋ฉด offset์ด ์๋ง์ผ๋ ) ๊ทธ๊ฑฐ ๋๋ฌธ์ ํ์ํ๊ฒ ๋ค. ๋๋ ์ค๋ ํ๋ ๋ฐฐ์ ๊ตฌ๋จผ...
๊ทธ๋์ ๊ฐ์ ์ ์ธ ๋ค์ค์์์ ์ฌ์ฉํ๋ฉด์ ๋ฌธ์ ์์๋๊ฑด ์ต๊ด์ ์ผ๋ก ๋ค๋ฅธ ์ธ์ด์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ธํฐํ์ด์ค์ ๋ฉค๋ฒ๋ณ์๋ฅผ ๋์ง ์์์ ํฐ ๋ฌธ์ ๊ฐ ์์๋๋ฏ. ์ด offset ๋ง์ถ๋ ๋ฌธ์ ๊ฐ ์๋ค๋ณด๋ ํ ๋ญ๊ท์ง์์ ์์ interface์๋ ๋ฉค๋ฒ๋ณ์๊ฐ ๋ค์ด๊ฐ๋ฉด ์๋๊ฒ ์ค๊ณ๋ฅผ ํ์์๋์๊ฒ ๋ค.
๋ด๊ฐ ์ด์ ์์๋ณธ ๋ฐ๋ก๋ static_cast๋ ๋ฉ๋ชจ๋ฆฌ ์คํ์ ์ ์ปดํ์ผ๋ฌ๊ฐ ๋ง์ถฐ์ค๋ค๊ณ ํจ. ์ง๋ฌธ์ด ์ข ์ด์ํ๊ธด ํ์ด์ ๋์ค์ ๋ค์ ์ง๋ฌธํด๋ด
์ข ํ ์คํธ ํด๋ด์ผ๊ฒ ๋ค. ์ด๋ฉด์ ์ง์ง ์ฐ ๋ค์ค์์ ํด๋ณธ๊ฒ ๋ฑ ํ๋ฒ์ด๋ผ...