๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ—ฃ๏ธ ์‹ ์ž… ์ธํ„ฐ๋ทฐ/C++

์‹ ์ž… ๊ฐœ๋ฐœ์ž ๊ธฐ์ˆ ๋ฉด์ ‘ C++ : Cast ์—ฐ์‚ฐ์ž (๐Ÿ†š C)

Dynamic_cast๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์—…, ๋‹ค์šด ์บ์ŠคํŒ…์ด ๊ฐ€๋Šฅํ•œ์ง€ ๊ฒ€์‚ฌํ•ด ์ค€๋‹ค๊ณ  ํ–ˆ๋Š”๋ฐ, C++์—์„œ C#์ฒ˜๋Ÿผ ๋ฆฌํ”Œ๋ ‰์…˜์ด ์—†๋Š”๋ฐ ์–ด๋–ป๊ฒŒ ๊ฐ€๋Šฅํ•œ๊ฐ€?

๊ฐ€์ƒํ•จ์ˆ˜ ํ…Œ์ด๋ธ”์„ ์ด์šฉํ•˜์—ฌ ์บ์ŠคํŒ…์ด ๊ฐ€๋Šฅํ•œ ์ž๋ฃŒ์ธ์ง€ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.


C์—์„œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ (ํƒ€์ž…)๋ณ€์ˆ˜ ํ˜•์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ์บ์ŠคํŒ… ๋ฐฉ์‹์€ ํƒ€์ž… ์•ˆ์ „์„ฑ์„ ์ œ๊ณตํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์–ด๋– ํ•œ ํƒ€์ž…์˜ ๋ณ€ํ™˜๋„ ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. C ์บ์ŠคํŒ…์€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํƒ€์ž… ์˜ค๋ฅ˜๋ฅผ ์žก์•„๋‚ด์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์–ด ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

int i = 3;
double d = 3.5;
cout << int(d);

 

๋ผ๊ณ  ํ–ˆ์„ ๋•Œ, `d`์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ ์†์‹ค์ด ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.

 

C++์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋„ค ๊ฐ€์ง€ ํƒ€์ž…์˜ ์บ์ŠคํŒ… ์—ฐ์‚ฐ์ž๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

์•„๋ž˜ ์บ์ŠคํŠธ ์—ฐ์‚ฐ์ž๋“ค์„ ์•Œ์•„๋ณด๊ณ  ๋ฐ์ดํ„ฐ ์†์‹ค์„ ์—†์• ๋ฉฐ ์•ˆ์ „ํ•˜๊ฒŒ ์บ์ŠคํŒ…ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.

์ผ๋ฐ˜์ ์œผ๋กœ ์•„๋ž˜ ์บ์ŠคํŠธ ๋ฉ”์†Œ๋“œ๋“ค์€ ํ•จ์ˆ˜<๋ณ€ํ™˜ํ• ํƒ€์ž…>(๋ณ€ํ™˜๋Œ€์ƒ)์œผ๋กœ ์ง„ํ–‰๋œ๋‹ค.

static_cast<int>(d);
  1. static_cast
    • static_cast๋Š” ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ํƒ€์ž… ์ฒดํฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์ธ ํƒ€์ž… ๋ณ€ํ™˜, ํด๋ž˜์Šค ๊ณ„์ธต ๋‚ด์—์„œ์˜ ์—…์บ์ŠคํŠธ(์ž์‹ ํด๋ž˜์Šค ํฌ์ธํ„ฐ๋ฅผ ๋ถ€๋ชจ ํด๋ž˜์Šค ํฌ์ธํ„ฐ๋กœ ๋ณ€ํ™˜)์™€ ๋‹ค์šด์บ์ŠคํŠธ(๋ถ€๋ชจ ํด๋ž˜์Šค ํฌ์ธํ„ฐ๋ฅผ ์ž์‹ ํด๋ž˜์Šค ํฌ์ธํ„ฐ๋กœ ๋ณ€ํ™˜)๋ฅผ ๋ชจ๋‘ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ฃผ๋กœ ์—…์บ์ŠคํŒ…์— ์‚ฌ์šฉ๋œ๋‹ค. 
    • C์Šคํƒ€์ผ ์บ์Šคํ„ฐ์™€ ๋˜‘๊ฐ™์€ ์˜๋ฏธ์™€ ํ˜•๋ณ€ํ™˜ ๋Šฅ๋ ฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ธฐ๋ณธ์ ์ธ ์บ์ŠคํŠธ ์—ฐ์‚ฐ์ž์ž…๋‹ˆ๋‹ค. 
    • ๋‹ค๋งŒ ๊ฐ•์ œ์บ์ŠคํŒ… (C ์Šคํƒ€์ผ ์บ์ŠคํŠธ) ๊ณผ ๋‹ค๋ฅธ์ ์€ ์œ„์˜ ์˜ˆ์‹œ์ฒ˜๋Ÿผ ๋…ผ๋ฆฌ์ƒ ๋งž์ง€ ์•Š๋Š” ๋ณ€ํ™˜์„ ๋ง‰์•„์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. 
    • ๋‹จ, ๋‹ค์šด์บ์ŠคํŠธ์˜ ๊ฒฝ์šฐ static_cast๋Š” ํƒ€์ž… ์•ˆ์ „์„ฑ์„ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์‹ค์ œ ๊ฐ์ฒด๊ฐ€ ๋ณ€ํ™˜ํ•˜๋ ค๋Š” ํƒ€์ž…์ด ์•„๋‹Œ ๊ฒฝ์šฐ์—๋„ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (dynamic_cast ์™€์˜ ์ฐจ์ด์ ์ด๋‹ค!)
  2. dynamic_cast
    • dynamic_cast๋Š” ๋Ÿฐํƒ€์ž„์— ํƒ€์ž… ์•ˆ์ „์„ฑ์„ ๊ฒ€์‚ฌ (RTTI) ํ•ฉ๋‹ˆ๋‹ค. ์ฃผ๋กœ ๋‹คํ˜•์„ฑ์„ ๊ฐ€์ง„ ํด๋ž˜์Šค (๊ฐ€์ƒ ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ง„ ํด๋ž˜์Šค) ์˜ ํฌ์ธํ„ฐ๋‚˜ ์ฐธ์กฐ ๊ฐ„์˜ ๋ณ€ํ™˜์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ฃผ๋กœ ๋‹ค์šด์บ์ŠคํŒ…(๊ธฐ๋ณธ ํด๋ž˜์Šค์—์„œ ํŒŒ์ƒ ํด๋ž˜์Šค๋กœ)์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    • dynamic_cast๋Š” ๋‹ค์šด์บ์ŠคํŒ… ์‹œ ์‹ค์ œ ๊ฐ์ฒด ํƒ€์ž…์ด ๋ชฉํ‘œ ํƒ€์ž…๊ณผ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด nullptr์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค(ํฌ์ธํ„ฐ์˜ ๊ฒฝ์šฐ). ์ด๋Š” ํƒ€์ž… ์•ˆ์ „์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
    • ๋Ÿฐํƒ€์ž„์— ํƒ€์ž… ์•ˆ์ •์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ง„ํ–‰ํ•˜๊ณ  ์ƒ์†๊ด€๊ณ„์—์„œ์˜ ์—…์บ์ŠคํŠธ๋‚˜ ๋ณ€ํ™˜์„ ์ง€์›ํ•ด์ฃผ์ง€๋งŒ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐํ˜• ๋ณ€ํ™˜์€ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. ์—…์บ์ŠคํŒ…๋งŒ์ด ๊ฐ€๋Šฅํ•˜๊ณ  ๋งŒ์•ฝ ๊ฐ€์ƒํ•จ์ˆ˜๊นŒ์ง€ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋‹ค์šด์บ์ŠคํŒ… ๋˜ํ•œ ์ง€์›ํ•ด์ค€๋‹ค.
  3. const_cast
    • const_cast๋Š” ๊ฐ์ฒด์˜ `const` ๋˜๋Š” `volatile` ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ฃผ๋กœ ์ƒ์ˆ˜ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ˆ˜์ •์ด ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. 
    • ์ฆ‰ ํƒ€์ž… ์ž์ฒด์˜ ๋ณ€ํ™˜๋ณด๋‹ค๋Š” ๊ฐ์ฒด์˜ ์†์„ฑ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐ ์ดˆ์ ์„ ๋งž์ถฅ๋‹ˆ๋‹ค.
  4. reinterpret_cast
    • reinterpret_cast๋Š” ์„œ๋กœ ๊ด€๋ จ ์—†๋Š” ํƒ€์ž… ๊ฐ„์˜ ๋ณ€ํ™˜์„ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ํฌ์ธํ„ฐ ํƒ€์ž…์„ ๋‹ค๋ฅธ ํฌ์ธํ„ฐ ํƒ€์ž…์œผ๋กœ, ํฌ์ธํ„ฐ๋ฅผ ์ถฉ๋ถ„ํ•œ ํฌ๊ธฐ์˜ ์ •์ˆ˜ ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐ ์ฃผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋งค์šฐ ๋‚ฎ์€ ์ €์ˆ˜์ค€์˜ ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, ์•ˆ์ „ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๊ฐ•์ œ ์บ์ŠคํŒ…์„ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ๋ณด๋‹ค static_cast, dynamic_cast์™€ ๊ฐ™์€ ์บ์ŠคํŠธ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ์˜ ์ด์ ์ด ๋ญ˜๊นŒ?

 

์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์˜ค๋ฅ˜ ์ฒดํฌ๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ

-> ๊ฐ•์ œ ์บ์ŠคํŒ…์„ ์‚ฌ์šฉํ•˜๋ฉด ๋Ÿฐํƒ€์ž„์‹œ seg fault, runtime error ๋“ฑ ์˜ˆ๊ธฐ์น˜ ๋ชปํ•œ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š”๋ฐ ์ปดํŒŒ์ผ๋Ÿฌ๋”ด์—์„œ ์˜ค๋ฅ˜๋ฅผ ์žก์•„ ์ถ”ํ›„ ๋ฌธ์ œ๊ฐ€ ๋  ๊ฐ€๋Šฅ์„ฑ์„ ์ค„์—ฌ์ฃผ๋Š” ์ด์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

์ƒ์†๊ด€๊ณ„์— ์žˆ์–ด๋„ ํ˜•๋ณ€ํ™˜์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์ถœ์ฒ˜ https://drag0n.tistory.com/18


์—…์บ์ŠคํŒ… (Upcasting)

  • ์—…์บ์ŠคํŒ…์€ ํŒŒ์ƒ ํด๋ž˜์Šค(ํ•˜์œ„ ํด๋ž˜์Šค)์˜ ๊ฐ์ฒด๋ฅผ ๊ธฐ๋ณธ ํด๋ž˜์Šค(์ƒ์œ„ ํด๋ž˜์Šค) ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ์ด ๋ณ€ํ™˜์€ ํ•ญ์ƒ ์•ˆ์ „ํ•˜๋ฉฐ, ๋ช…์‹œ์ ์œผ๋กœ ์บ์ŠคํŒ…ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ์—…์บ์ŠคํŒ…์„ ์‚ฌ์šฉํ•˜๋ฉด ํŒŒ์ƒ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋ฅผ ๊ธฐ๋ณธ ํด๋ž˜์Šค์˜ ํฌ์ธํ„ฐ๋‚˜ ์ฐธ์กฐ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์šด์บ์ŠคํŒ… (Downcasting)

  • ๋‹ค์šด์บ์ŠคํŒ…์€ ๊ธฐ๋ณธ ํด๋ž˜์Šค(์ƒ์œ„ ํด๋ž˜์Šค)์˜ ๊ฐ์ฒด๋ฅผ ํŒŒ์ƒ ํด๋ž˜์Šค(ํ•˜์œ„ ํด๋ž˜์Šค) ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ์ด ๋ณ€ํ™˜์€ ํƒ€์ž… ์•ˆ์ „์„ฑ์ด ๋ณด์žฅ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ, dynamic_cast๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•ˆ์ „ํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹ค์šด์บ์ŠคํŒ…์€ ์ฃผ๋กœ ์—…์บ์ŠคํŒ…๋œ ๊ฐ์ฒด๋ฅผ ์›๋ž˜์˜ ํŒŒ์ƒ ํด๋ž˜์Šค ํƒ€์ž…์œผ๋กœ ๋‹ค์‹œ ๋ณ€ํ™˜ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ๋‹ค์šด์บ์ŠคํŒ…์„ ์œ„ํ•ด์„œ๋Š” ๊ธฐ๋ณธ ํด๋ž˜์Šค์— ์ตœ์†Œ ํ•˜๋‚˜ ์ด์ƒ์˜ ๊ฐ€์ƒ ํ•จ์ˆ˜๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋‹คํ˜•์„ฑ์„ ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค.
class Base {
public:
    virtual void print() {} // ๊ฐ€์ƒ ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•˜์—ฌ ๋‹คํ˜•์„ฑ์„ ํ™œ์„ฑํ™”
};
class Derived : public Base {
public:
    void print() override {}
    void derivedFunction() {}
};

Base *b = new Derived(); // ์—…์บ์ŠคํŒ…
Derived *d = dynamic_cast<Derived*>(b); // ๋‹ค์šด์บ์ŠคํŒ…

if (d) {
    d->derivedFunction(); // ์•ˆ์ „ํ•˜๊ฒŒ ๋‹ค์šด์บ์ŠคํŒ…๋œ ๊ฐ์ฒด์˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ
}