[C++] RTTI(Run Time Type Information)

2023. 9. 7. 21:08ยท๐Ÿ“ Language/โœ C & C++

RTTI(Run Time Type Information)

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

 

๊ฐ์ฒด ์ง€ํ–ฅ์—์„  ํด๋ž˜์Šค ๊ฐ„ ์ƒ์†์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ณ , ๋‹คํ˜•์„ฑ์„ ๊ฐ€์ง€๊ฒŒ ๋˜์–ด ๊ธฐ์ดˆ ํด๋ž˜์Šค๋Š” ์ž์‹ ์˜ ๋ฉค๋ฒ„๋ฅผ ์œ„์ž„ํ•œ ํŒŒ์ƒ ํด๋ž˜์Šค๋ฅผ ์ž์‹ ์˜ ๊ฐ์ฒด ํฌ์ธํ„ฐ๋กœ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

 

Base *pBase = new Derived();

์ปดํŒŒ์ผ ๋‹น์‹œ์—๋Š” pBase๊ฐ€ ์–ด๋–ค ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์—†๋‹ค. ๊ทธ์ € ๊ธฐ์ดˆ ํด๋ž˜์Šค์™€ ํŒŒ์ƒ ํด๋ž˜์Šค ์ค‘ ์–ด๋–ค ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š”์ง€ ์ง์ž‘๋งŒ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ •๋ณด๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ๊ฒƒ์ด RTTI์ด๊ณ  ํ˜„์žฌ ๊ฐ์ฒด ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ๊ฐ์ฒด ํƒ€์ž… ์ •๋ณด๋ฅผ type_info๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ vftable์— ์ €์žฅํ•œ๋‹ค.

 

1. dynamic_cast()

dynamic_cast๋Š” ๋‹ค์šด ์บ์ŠคํŒ…์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ํ•จ์ˆ˜์ด๋‹ค. ๊ธฐ์ดˆ ํด๋ž˜์Šค์— ํŒŒ์ƒ ํด๋ž˜์Šค๋ฅผ ์—… ์บ์ŠคํŒ…ํ•ด์„œ ์„ ์–ธํ–ˆ๋‹ค๋ฉด, dynamic_cast๋กœ ๋‹ค์‹œ ์›๋ž˜ ํ˜•ํƒœ๋กœ ๋Œ์•„๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ ์‹คํŒจํ•œ๋‹ค๋ฉด nullptr๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

Base *pBase = new Derived();
Derived *pDerived = dynamic_cast<Derived *>(pBase);

 

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

if(pDerived = dynamic<Derived*>(pBase)){
	pDerived->print();
}
else{
	std::cout << "Failed cast to [Derived]" << std::endl;
    exit(0);
}

 

2. typeid ์—ฐ์‚ฐ์ž, type_info ํด๋ž˜์Šค

typeid ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•ด ๊ฐ์ฒด์˜ ๋ฐ์ดํ„ฐํ˜•์ด ๋™์ผํ•œ์ง€๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” type_info ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

 

int main(void) {
    
    A* a = new A();
    B* b = new B();
    
    A* arr[2];
    arr[0] = a;
    arr[1] = b;
    
    for (int i = 0; i < 2; ++i)
    {
        arr[i]->foo();
        if (typeid(B) == typeid(*arr[i]))
        {
            B* bb = (B*)arr[i];
            bb->foo();
            cout << "ํ˜„์žฌ ํƒ€์ž… : " << typeid(*arr[i]).name() << endl;
        }
    }
}

 

์ฐธ๊ณ 

https://velog.io/@cedongne/OOP-C-RTTIRun-Time-Type-Information

 

[OOP] C++ RTTI(Run Time Type Information)

C++์—์„  ๋Ÿฐํƒ€์ž„์— ๊ธฐ์ดˆ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด ํฌ์ธํ„ฐ๊ฐ€ ์–ด๋–ค ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š”์ง€ ์ •๋ณด๋ฅผ ์•Œ๋ ค์ฃผ๋Š” RTTI ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. RTTI๊ฐ€ ๋ฌด์—‡์ธ์ง€, ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์„œ๋“œ ๋ฐ ํด๋ž˜์Šค๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋ณด์ž.

velog.io

https://koreanfoodie.me/1161

 

C++ DevNote : ํƒ€์ž… ์ •๋ณด RTTI(Runtime Type Infomation or Runtime Type Identification) ์— ๋Œ€ํ•˜์—ฌ

C++ ์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ•œ ๊ฒƒ๊ณผ, ๊ฐœ๋ฐœํ•˜๋ฉด์„œ ์•Œ๊ฒŒ ๋œ ๊ฒƒ๋“ค์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค RTTI RTTI ๋Š” ๊ฐ„๋‹จํžˆ ๋งํ•ด, ์‹ค์‹œ๊ฐ„ ํƒ€์ž… ์ •๋ณด๋ผ๋Š” ๋œป์ด๋‹ค. RTTI ๋ผ๋Š” ๋‹จ์–ด๋ฅผ ํ‰์†Œ์—๋Š” ์ž˜ ๋“ค์–ด๋ณผ ์ผ์ด ์—†๋‹ค๊ฐ€, dynamic_cast ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„

koreanfoodie.me

์ €์ž‘์žํ‘œ์‹œ
'๐Ÿ“ Language/โœ C & C++' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [C++] ์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ(Operator Overloading)
  • [C++] ๋ฌธ์ž์—ด ์ŠคํŠธ๋ฆผ(stringstream)
  • [C++] l-value์™€ r-value
  • [C/C++] malloc()๊ณผ new์˜ ์ฐจ์ด
Blxxming
Blxxming
CS ์ง€์‹๊ณผ ๊ณต๋ถ€ํ•˜๋‹ค ๋ฐฐ์šด ๊ฒƒ, ๊ฒฝํ—˜ํ•œ ๊ฒƒ ๋“ฑ์„ ๊ธฐ๋กํ•˜๋Š” ๋ธ”๋กœ๊ทธ์ž…๋‹ˆ๋‹ค.
  • Blxxming
    ๐Ÿ’ก๋ฒˆ๋œฉ๐Ÿ’ก
    Blxxming
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
  • ๊ณต์ง€์‚ฌํ•ญ

    • Tech Interview
    • ๐Ÿ“š Tech (246)
      • ๐Ÿ“ Computer Science (96)
        • โœ OS (12)
        • โœ Network & Web (10)
        • โœ Database (11)
        • โœ Data Structure (6)
        • โœ Algorithm (40)
        • โœ Design Pattern (9)
        • โœ Cloud Computing (3)
        • โœ (5)
      • ๐Ÿ“ Language (73)
        • โœ Language (6)
        • โœ C & C++ (11)
        • โœ C# (19)
        • โœ JAVA (37)
      • ๐Ÿ“ Game (43)
        • โœ Computer Graphics (2)
        • โœ Unity (14)
        • โœ Unreal (26)
        • โœ (1)
      • ๐Ÿ“ Book (34)
        • โœ Effective (3)
        • โœ Game Server (16)
        • โœ Clean Code (14)
        • โœ (1)
  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.0
Blxxming
[C++] RTTI(Run Time Type Information)
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”