์ฝ”๋”ฉ ๊ทœ์น™: ๐Ÿ’€rtti์™€ dynamic_cast์— ๋Œ€ํ•˜์—ฌ. 240709 ์ถ”๊ฐ€.

๋ณด๋ฌผ์ฐฝ๊ณ ยท2022๋…„ 8์›” 20์ผ
0

c++ basic ์ฝ”๋“œ๋ˆ„๋ฆฌ

๋ชฉ๋ก ๋ณด๊ธฐ
38/50
post-custom-banner

240517์— ์ถ”๊ฐ€ํ–ˆ์ง€๋งŒ,

๊ฐ€์ƒํ•จ์ˆ˜ ํ…Œ์ด๋ธ”

: ํƒ€์ž… ์ •๋ณด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ์™€ ๊ฐ€์‚ผํ•จ์ˆ˜๋“ค์˜ ์ฃผ์†Œ๊ฐ€ ์žˆ๋‹ค.
fundamental c++ p.433

dynamic_cast ํ•  ๋•Œ, ์™œ virtual ์žˆ์–ด์•ผ ํ•˜๋Š”์ง€?

-> dynamic_cast๋Š” ๋Ÿฐํƒ€์ž„์— ํƒ€์ž…๊ฒ€์‚ฌ๋ฅผ ํ•œ๋‹ค.

  • dynamic_cast ์‹œ์—๋Š”
    ํƒ€์ž… ์ •๋ณด ๊ฐ์ฒด typeinfo ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ€์ƒํ•จ์ˆ˜ ํ…Œ์ด๋ธ”์ด ํ•„์š”ํ•˜๋‹ค.
    ์ด ํฌ์ธํ„ฐ๋Š” ๋ฐ”๋กœ ๊ฐ€์ƒํ•จ์ˆ˜ ํ…Œ์ด๋ธ”์— ์œ„์น˜ํ•ด ์žˆ๊ณ ,
    ์œ„์น˜๋Š” ๊ฐ€์ƒํ•จ์ˆ˜ ํ…Œ์ด๋ธ”์˜ ์ฒซ๋ฒˆ์งธ ๊ฐ€์ƒํ•จ์ˆ˜ ๋ฉ”๋ชจ๋ฆฌ์˜ ๋ฐ”๋กœ ์•ž ๊ณต๊ฐ„์— ์žˆ๋‹ค.
    : ์ถœ์ฒ˜๋Š” fundamental c++

static_cast ์™€ dynamic_cast ๋น„๊ตํ•˜๊ธฐ

1) ๋™์ ํ• ๋‹น๋œ ๋ณ€์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ณด๋‚ด๋ฉด ์ด์ƒ์—†์Œ...
: ํƒ€์ž… ๊ฒ€์‚ฌ๋ฅผ ํ•˜์ง€ ์•Š๊ณ , ๊ทธ๋ƒฅ ์ง€๋‚˜์น˜๊ฒŒ ๋˜๋ฏ€๋กœ, ์œ„ํ—˜ํ•œ ์ƒํ™ฉ์ž„.
-> ๊ทธ๋Ÿฐ๋ฐ ๋ฌธ์ œ ์—†์ด ๋œ๋‹ค.
: ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ™•์žฅ๋œ๊ฒƒ์ด๋‹ค.

2) value ๊ฐ์ฒด ๋ณด๋‚ด๋ฉด ๋ฐ”๋กœ ์—๋Ÿฌ ๋ฐœ์ƒํ•จ.

3) dynamic_cast ์ผ ๊ฒฝ์šฐ, ์ž˜๋ชป๋œ ํ˜•๋ณ€ํ™˜์ด๋ฉด, ๊ทธ๋ƒฅ ์—๋Ÿฌ ๋ฐœ์ƒ์‹œํ‚ด.

  • ์ „๋ฌธ๊ฐ€ c++ : p.537
    -> Animal ์˜ ๊ฒฝ์šฐ, vTable์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ, Dog * ํƒ€์ž…์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— nullptr์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋”ฐ.

  • ์ฝ”๋“œ 1๋ฒˆ.

  • ์ฝ”๋“œ 2๋ฒˆ

4) dynamic_cast๊ฐ€ ์„ฑ๊ณตํ•˜๋Š” ๊ฒฝ์šฐ.
: ์—…์บ์ŠคํŒ…์„ ํ•œ ๊ฐ์ฒด์˜ ๊ฒฝ์šฐ, dynamic_cast ์„ฑ๊ณตํ•œ๋‹ค.

240709 ์ถ”๊ฐ€.

4) ๊ถ๊ธˆํ•œ ๊ฒŒ ์žˆ๋Š”๋ฐ, Dog์— int data๊ฐ€ ์žˆ์–ด์„œ ๊ทธ๋Ÿฐ๊ฑธ๊นŒ??

  • ๋””๋ฒ„๊น… ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด, ๋ฐ์ดํ„ฐ ์ •๋ณด๋Š” ์œก์•ˆ์œผ๋กœ ๋ณด๊ธฐ๋Š” ๋™์ผํ•˜์ง€๋งŒ,
    ๊ทธ๋ž˜๋„ ํƒ€์ž…์ด ๋ช…ํ™•ํžˆ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

5) Vtable ์˜ ์กด์žฌ
: virtual ์„ ์–ธ์„ ํ†ตํ•ด์„œ ๋‹คํ˜•์„ฑ์ด ๊ฒฐ์ •๋œ๋‹ค.

  • ์ง€๊ธˆ์˜ ๊ฒฝ์šฐ, ๋™์ผํ•œ ํด๋ž˜์Šค ํƒ€์ž…์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ ์—†์ด ์บ์ŠคํŒ… ๋จ.

  • ์ง€๊ธˆ์˜ ๊ฒฝ์šฐ, aa์˜ ํƒ€์ž…์ด virtual๋กœ ์ธํ•ด b๋กœ ๊ฒฐ์ •๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์—
    ๋ฌธ์ œ ์—†์ด nullptr ์ด ์•„๋‹Œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
    : b ์—์„œ ์žฌ์ •์˜๋ฅผ ํ•˜์ง€ ์•Š์•˜๋Š”๋ฐ๋„ ํƒ€์ž…์ด b๋กœ ๊ฒฐ์ •๋œ๋‹ค.

  • ์ง€๊ธˆ์˜ ๊ฒฝ์šฐ, aa ํƒ€์ž…์€ b๊ฐ€ ์•„๋‹ˆ๋ผ ์ง„์งœ a์ด๊ธฐ ๋•Œ๋ฌธ์— nullptr์ด ๋ฐ˜ํ™˜๋œ๋‹ค.

// 240709

-> ๋ฐ‘์— ์„ค๋ช…์žˆ๋‹ค.
์–ธ์ œ dynamic_cast๊ฐ€ nullptr ์ด ์•„๋‹Œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ• ์ง€์— ๋Œ€ํ•ด์„œ.

๊ฒฐ๋ก 

: static_cast๋ฅผ ์ด์šฉํ•œ ๋‹ค์šด์บ์ŠคํŒ…์€ ์œ„ํ—˜ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Œ.
:: ๋‹ค์šด์บ์ŠคํŒ…์„ ํ•˜๋ ค๊ณ  ํ•œ๋‹ค๋ฉด dynamic_cast ์•ˆ์ „ํ•˜์ง€๋งŒ, ์‹คํ–‰์‹œ๊ฐ„์— ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ ์†๋„๋Š” ๋Š๋ฆผ.
::: ํƒ€์ž…์„ ํ™•์‹คํžˆ ์•ˆ๋‹ค๋ฉด static_cast๋กœ ์ฒ˜๋ฆฌํ•˜์ž.

  • ์ถ”๊ฐ€ 240517 (๋ฐ”์•ผ๋„ค ์ŠคํŠธ๋กญ ์ฐฝ์‹œ์ž๋‹˜ ์ฑ… p.708)
    ์ปดํŒŒ์ผ๋Ÿฌ๋Š” void ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•ด ๊ทธ ์–ด๋–ค ๊ฐ€์ •๋„ ํ•  ์ˆ˜ ์—†๋‹ค.
    ํƒ€์ž…์„ ํŒ๋‹จํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ์ฒด๋ฅผ ๋“ค์—ฌ๋‹ค๋ด์•ผํ•˜๋Š” dynamic_cast๋Š” void
    ์—
    ์ ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๋œป์ด๋‹ค.
    ์ด๋•Œ๋Š” static_cast๋ฅผ ์‚ฌ์šฉํ•˜์ž.

dynamic_cast์˜ ์‚ฌ์šฉ

  • dynamic_cast๋Š” ๋‹คํ˜•ํ˜•์‹์„ ๋‚˜ํƒ€๋‚ด๋Š” virtual ํ‚ค์›Œ๋“œ๊ฐ€ ํ•˜๋‚˜๋ผ๋„ ์žˆ์–ด์•ผ ๊ฐ€๋Šฅํ•˜๋‹ค.
    -> ๋‹คํ˜•ํ˜•์‹์„ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’์— ๋Œ€ํ•ด์„œ

: ๋ฐ˜ํ™˜๊ฐ’์ด 0์ด ๋˜๋Š” ์ƒํ™ฉ์€ ํ˜•๋ณ€ํ™˜ํ•˜๋ ค๋Š” ํƒ€์ž…์— ๋Œ€ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ •๋ณด๋ฅผ
๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์„ ๋•Œ์ž„.
์˜ˆ๋ฅผ ๋“ค๋ฉด
dynamic_cast<Derived *> ( Derived ์˜ ์ •๋ณด๋ฅผ ์•„์˜ˆ ๋ชจ๋ฅผ ๋•Œ)

์ฐธ๊ณ  ์‚ฌ์ดํŠธ

https://blockdmask.tistory.com/241

1๋ฒˆ ์ฝ”๋“œ

: ์ •์ƒ์ ์ธ ์ƒํƒœ์ž„.
-> ํฌ์ธํ„ฐ ์—…์บ์ŠคํŒ…ํ•œ ์ƒํƒœ์ด๊ณ , a๋Š” Animal ๋ฟ์•„๋‹ˆ๋ผ, Dog์˜ ๋ฉ”๋ชจ๋ฆฌ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋”ฐ.

1-1๋ฒˆ ์ฝ”๋“œ : 240428 ์ถ”๊ฐ€.

: dynamic_cast๋Š” ๋‹คํ˜•ํ˜•์‹์„ ๋งŒ๋“ค์–ด์•ผ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.
-> virtual ํ‚ค์›Œ๋“œ๊ฐ€ ์—†์–ด์„œ ์ปดํŒŒ์ผ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ณ  ์žˆ๋‹ค.

2๋ฒˆ ์ฝ”๋“œ

: ์ƒ์„ฑ์ž๋กœ๋ถ€ํ„ฐ ๊ฐ€์ƒ ํฌ์ธํ„ฐ๊ฐ€ ํŒŒ์ƒ์„ ์ฐธ์กฐํ•ด์•ผ ํ•˜๋Š”๋ฐ, ๊ทธ๋ ‡์ง€ ๋ชปํ•˜๋ฏ€๋กœ,
์‹คํŒจํ•œ ์ƒํ™ฉ์ž„.

-> a ๋Š” Animal์˜ ๋ฉ”๋ชจ๋ฆฌ ์ •๋ณด๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ์ง€, ํŒŒ์ƒ๋œ Dog์˜ ๋ฉ”๋ชจ๋ฆฌ(int data) ๋ฅผ ๋ชจ๋ฅธ๋‹ค...
d ๋Š” 0์ด ๋‚˜์˜ด.

3๋ฒˆ ์ฝ”๋“œ

: ๋‹น์—ฐํ•œ ๊ฒฐ๊ณผ
-> a๋Š” Dog์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์•Œ์ง€ ๋ชปํ•จ.. ๊ทธ๋ฆฌ๊ณ  ํฌ์ธํ„ฐ๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•จ.

4๋ฒˆ ์ฝ”๋“œ : ๋‹น์—ฐํ•˜๊ฒŒ๋„. 240428 ์ถ”๊ฐ€

๊ฒฐ๋ก 

-> dynamic_cast ์˜ ๋ฐ˜ํ™˜๊ฐ’์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋‚˜์˜ค๋ ค๋ฉด, ์—…์บ์ŠคํŒ…๋œ ํฌ์ธํ„ฐ๋ฅผ ์ธ์ˆ˜๋กœ ๋„ฃ์ž.


rtti๋ž€? (run time type information)

: ์‹คํ–‰์‹œ๊ฐ„์— ํƒ€์ž…์˜ ์ •๋ณด๋ฅผ ์–ป์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์ˆ 

์กฐ๊ฑด

: c++ ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ •์ ๋ฐ”์ธ๋”ฉ์ž„์„ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•˜๊ณ ,
๋™์ ๋ฐ”์ธ๋”ฉ์„ ํ•˜๊ธฐ ์œ„ํ•ด virtual ์ด ์žˆ์–ด์•ผ ํ•จ์„ ์•Œ์•„์•ผ ํ•ด!

์‚ฌ์šฉ๋ฒ•

1) < typeinfo > ํ—ค๋”๋ฅผ ํฌํ•จํ•จ.
2) typeid ์—ฐ์‚ฐ์ž์˜ ์ธ์ž๋กœ ํ™•์ธํ•  ๋ณ€์ˆ˜๋‚˜ ์ƒ์ˆ˜๋ฅผ ๋„ฃ์Œ.
3) type_info ์ฐธ์กฐ ๊ฐ์ฒด๋กœ ๋ฐ˜ํ™˜ ๋ฐ›์Œ.
4) ์ฐธ์กฐ๊ฐ์ฒด์˜ ๋ฉค๋ฒ„ name()์„ ์ด์šฉํ•ด ์ถœ๋ ฅํ•จ.

  • ์˜ˆ์‹œ ์ฝ”๋“œ
int main()
{
	int n1 = 10;
    auto n2 = n1;
    
    const std::type_info& t1 = typeid(n2);
    std::cout << t1.name() << endl;
    
}

problem

: int ํ˜• ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ›„, typeid๋ฅผ ์ถœ๋ ฅํ•ด๋ณด์ž.

typeid

: ํƒ€์ž…์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์–ป์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์—ฐ์‚ฐ์ž.

  • ๋‹ค์–‘ํ•œ ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ.
  1. typeid(๋ณ€์ˆ˜) : typeid(int n)
  2. typeid(ํƒ€์ž…) : typeid(int)
  3. typeid(ํ‘œํ˜„์‹) : typeid( 3 + 4.2)
  • ๋ฐ˜ํ™˜๊ฐ’ : const std::type_info& ๊ฐ€ ๋ฐ˜ํ™˜๋จ.

type_info

: ํƒ€์ž…์˜ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ํด๋ž˜์Šค

  • ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘, ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์—†๊ณ , ๋ฐ˜๋“œ์‹œ typeid() ์—ฐ์‚ฐ์ž๋กœ๋งŒ ํ†ตํ•ด์„œ
    ์–ป์„ ์ˆ˜ ์žˆ์Œ.
  • ๋ฉค๋ฒ„ ํ•จ์ˆ˜์ธ name ์„ ํ†ตํ•ด ํƒ€์ž…์˜ ์ด๋ฆ„์„ ์–ป์–ด์˜ด.
  • ๋น„๊ต ์—ฐ์‚ฐ์ž : == ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํƒ€์ž…๊ฐ„์˜ ๋น„๊ต๊ฐ€ ๊ฐ€๋Šฅํ•จ.
    - ์˜ˆ์‹œ ์ฝ”๋“œ
const type_info &t1 = typeid(int);
const type_info &t2 = typeid(5);

if(t1 == t2) ... 

์ƒ์†๊ณผ rtti

  • typeid์˜ ํŠน์ง•
    1) ๊ฐ€์ƒ ํ•จ์ˆ˜๊ฐ€ ์—†๋Š” ๊ฐ์ฒด๋ฅผ ์กฐ์‚ฌํ•  ๊ฒฝ์šฐ,
    ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ํฌ์ธํ„ฐ ํƒ€์ž…์œผ๋กœ ์กฐ์‚ฌํ•จ.
    2) ๊ฐ€์ƒ ํ•จ์ˆ˜๊ฐ€ ์žˆ๋Š” ๊ฐ์ฒด์ผ ๊ฒฝ์šฐ,
    ์‹คํ–‰์‹œ๊ฐ„์— ํƒ€์ž…์„ ์กฐ์‚ฌํ•˜๊ฒŒ ๋จ.
    -> ๊ฐ€์ƒ ํ•จ์ˆ˜ ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•จ.

problem

1) Animal๊ณผ dog ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ฆ. virtual ์ž‘์„ฑํ•˜์ง€ ๋งˆ๋ผ.
-> ์ด๋Ÿฐ 2๋ฒˆ์งธ ์ถœ๋ ฅ๋ฌธ์—์„œ ์›์น˜ ์•Š์€ ๊ฒฐ๊ณผ๊ฐ€ ์ถœ๋ ฅ๋จ..
๋‹น์—ฐํ•˜๊ฒŒ๋„ virtual ์•ˆํ•ด์„œ Animal์ด ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์ด๊ณ ,

  • virtual์„ ์ถ”๊ฐ€ํ–ˆ๊ณ , ์ด๋Ÿฐ์‹์œผ๋กœ typeid๋ฅผ ์กฐ์‚ฌํ•ด์•ผ ํ•œ๋‹ค. 240428 ์ถ”๊ฐ€

2) foo(Aniaml *) ํ•จ์ˆ˜์— Animal a ๊ฐ์ฒด์™€ Dog d ๊ฐ์ฒด๋ฅผ ์ธ์ž๋กœ
๋ณด๋‚ด์„œ ์ธ์ž ํƒ€์ž…์„ ์ถœ๋ ฅํ•˜๋ผ.
-> ์ญ? Dog d ๋ฅผ ๋ณด๋ƒˆ๋Š”๋ฐ ์™œ?? Animal type ์œผ๋กœ ์ถœ๋ ฅ๋˜๋ƒ...
: c++์˜ ๊ธฐ๋ณธ ๋ฐ”์ธ๋”ฉ์€ ์ •์ ๋ฐ”์ธ๋”ฉ์ด์–ด์„œ base ํƒ€์ž…์œผ๋กœ ๊ฒฐ์ •๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

3) virtual ์†Œ๋ฉธ์ž๋ฅผ ๋งŒ๋“ค์–ด์„œ ์ถœ๋ ฅํ•ด๋ณด์•„๋ผ .
-> ์ฆ‰, ๋™์ ๋ฐ”์ธ๋”ฉ ํ•˜๋Š” virtual ์ด ํ•„์š”ํ•จ!
-> virtual ํ‚ค์›Œ๋“œ๋กœ ์ธํ•ด์„œ ํŒŒ์ƒํด๋ž˜์Šค์˜ ํ˜•์‹์ธ Dog ํƒ€์ž…์œผ๋กœ ๊ฒฐ์ •๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

4) dog๋งŒ์˜ ๋ฉค๋ฒ„ ๋ฐ์ดํ„ฐ color๊ฐ€ ์žˆ์Œ. foo() ํ•จ์ˆ˜์—์„œ
๋น„๊ต ์—ฐ์‚ฐ์ž๋กœ ํƒ€์ž…์„ ๋น„๊ตํ•ด์„œ, dog* ๊ฐ์ฒด๊ฐ€ ์ธ์ž๋กœ ๋“ค์–ด์˜ฌ ๊ฒฝ์šฐ,
color๊ฐ€ ์ถœ๋ ฅ๋˜๋„๋ก ๋งŒ๋“ค์–ด๋ผ .

  • ํžŒํŠธ : ์บ์ŠคํŒ…์„ ํ•ด์•ผ ํ•จ.

์—…์บ์ŠคํŒ…๊ณผ ๋‹ค์šด์บ์ŠคํŒ…

1) upCasting
: ํŒŒ์ƒ ํด๋ž˜์Šคํฌ์ธํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜ ํด๋ž˜์Šค ํƒ€์ž…์œผ๋กœ ์•”์‹œ์  ์บ์ŠคํŒ… ํ•˜๋Š” ๊ฒƒ

  • ์•ˆ์ „ํ•จ.

2) downCasting
: ๊ธฐ๋ฐ˜ ํด๋ž˜์Šค ํฌ์ธํ„ฐ๋ฅผ ํŒŒ์ƒ ํด๋ž˜์Šค ํƒ€์ž…์œผ๋กœ ์บ์ŠคํŒ…ํ•˜๋Š” ๊ฒƒ.

  • ์•ˆ์ „ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ.
    -> ์™œ๋ƒํ•˜๋ฉด, ๊ธฐ๋ฐ˜ ํด๋ž˜์Šค๋Š” ํŒŒ์ƒ ํด๋ž˜์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์•Œ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž„.

์•ˆ์ „์„ฑ์— ๋Œ€ํ•ด์„œ.

  • ๊ด€๋ จ ์ฝ”๋“œ
    : Dog๋ฅผ ์ธ์ž๋กœ ๋ณด๋‚ด๋ฉด ๋ฌด๊ด€ํ•˜์ง€๋งŒ, Animal์„ ์ธ์ž๋กœ ๋ณด๋‚ด๊ฒŒ ๋˜๋ฉด,
    ๊ทธ๋Œ€๋กœ ํ†ต๊ณผ๋จ. ์ฃผ์†Œ๊นŒ์ง€ ์ถœ๋ ฅ๋จ.
    :: ์—ฌ๊ธฐ์„œ ๋” ๋‚˜์•„๊ฐ€์„œ Dogํ˜•๋ณ€ํ™˜์ธ๋ฐ, Cat์„ ๋ณด๋‚ด๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊ฒƒ์ธ๊ฐ€...
class Animal{};
class Dog : public Animal{};

void foo(Animal *obj)
{
	Dog * dog = static_cast<Dog*>(obj);
    cout << dog << endl;
}

main()
{
	Animal *a = new Animal;
    foo(a); 
}

๊นจ์•Œ์ง€์‹

: static_cast์—์„œ์˜ static์€ ์ •์ ์ด๋‹ค ๋ผ๋Š” ์˜๋ฏธ์ด๋ฏ€๋กœ,
์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ์บ์ŠคํŒ…์„ ํ•จ!

๋‹ค์šด์บ์ŠคํŒ…๊ณผ ์บ์ŠคํŒ… ์—ฐ์‚ฐ์ž.

1) static_cast
- ์ž˜๋ชป๋œ ๋‹ค์šด์บ์ŠคํŒ…ํ•  ์ˆ˜ ์žˆ์Œ.
๋‹จ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ์บ์ŠคํŒ…์„ ํ•˜๋ฏ€๋กœ, ์˜ค๋ฒ„ํ—ค๋“œ ์—†์Œ.

2) ๐Ÿ’€dynamic_cast

  • 1) ์ž˜๋ชป๋œ ๋‹ค์šด์บ์ŠคํŒ…์„ ํ•˜๋ฉด, 0์œผ๋กœ ๋ฐ˜ํ™˜ํ•จ.
    - ์ด๊ฑธ ์ด์šฉํ•˜๋ฉด, ํƒ€์ž… ์— ๋Œ€ํ•ด ์•Œ ์ˆ˜ ์žˆ์Œ!

  • 2) ์‹คํ–‰์‹œ๊ฐ„์— ์บ์ŠคํŒ…ํ•˜๋ฏ€๋กœ, ์˜ค๋ฒ„ํ—ค๋“œ ๋ฐœ์ƒํ•จ.

  • 3) ๋ฐ˜๋“œ์‹œ virtual์ด ์„ ์–ธ๋˜์–ด ์žˆ์–ด์•ผํ•จ.

  • static_cast๋กœ ํ˜•๋ณ€ํ™˜ํ•  ํƒ€์ž…์„ ํ™•์‹ค์‹œ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด,
    dynamic_cast๋ณด๋‹ค๋Š” ํšจ์œจ์ด ์ข‹์Œ.

problem

  • foo ํ•จ์ˆ˜์—์„œ Animal* ์ธ์ž๋กœ ๋ฐ›์€ํ›„, static_cast๋ฅผ ์ด์šฉํ•ด
    dog๋กœ ํ˜•๋ณ€ํ™˜ํ•ด์„œ, dog๋งŒ์˜ ๋ฉค๋ฒ„ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๋ผ.

: Animal ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ณ , Dog๋Š” ํŒŒ์ƒ, Dog๋Š” Dog๋งŒ์˜ int data๋ฅผ ๋ฉค๋ฒ„๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์Œ.

๊ฐ€) ์ธ์ž๋กœ ๊ทธ๋ƒฅ Animal ๊ฐ์ฒด, Dog ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•˜์ž.
-> Animal ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•  ๊ฒฝ์šฐ, ๋ฌธ์ œ ๋ฐœ์ƒํ•จ.


: ๊ทธ๋Œ€๋กœ ์ ‘๊ทผํ•˜๋ฉด ๋ถˆ๊ฐ€ํ•จ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ.

  • ์กฐ๊ฑด ์ฒ˜๋ฆฌ ์—†์ด, static_cast ํ•  ๊ฒฝ์šฐ, ๋ฌธ์ œ์ž„.
    : Animal ๊ฐ์ฒด๋Š” dog ๊ฐ์ฒด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์•Œ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž„.

    • ๊ฒฐ๋ก 
      : ๋ณ€ํ™˜์ด ๊ฐ€๋Šฅํ•œ์ง€ ์—ฌ๋ถ€ ๊ทธ๋Ÿฐ๊ฑฐ ์ƒ๊ด€์—†์ด ๊ทธ๋ƒฅ ํ˜•๋ณ€ํ™˜ ์ฒ˜๋ฆฌํ•จ.

๋‚˜) dynamic_cast๋กœ ๋ณ€๊ฒฝํ•ด๋ณด์•„๋ผ.

๊ฒฐ๋ก 
: dynamic_cast๋Š” virtual์ด ํ•„์š”ํ•จ.

  • virtual์˜ ์˜๋ฏธ๋Š” ๋™์  ๋ฐ”์ธ๋”ฉ ์ฒ˜๋ฆฌ๋ฅผ ํ•จ!

๋‹ค) virtual์„ ์ถ”๊ฐ€ํ•˜๋ผ
-> ์—ฌ๊ธฐ์„œ ๋ฐœ์ƒํ•œ ์˜ค๋ฅ˜๋Š” ์ธ์ž์ธ obj์— Dog ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์ž„.

๋ผ) ๋งˆ๋ฌด๋ฆฌ ์ง€์–ด๋ผ.

profile
๐Ÿ”ฅ๐Ÿ”ฅ๐Ÿ”ฅ
post-custom-banner

0๊ฐœ์˜ ๋Œ“๊ธ€