Dynamic_cast๊ฐ ๋ด๋ถ์ ์ผ๋ก ์ , ๋ค์ด ์บ์คํ ์ด ๊ฐ๋ฅํ์ง ๊ฒ์ฌํด ์ค๋ค๊ณ ํ๋๋ฐ, C++์์ C#์ฒ๋ผ ๋ฆฌํ๋ ์ ์ด ์๋๋ฐ ์ด๋ป๊ฒ ๊ฐ๋ฅํ๊ฐ?
๊ฐ์ํจ์ ํ ์ด๋ธ์ ์ด์ฉํ์ฌ ์บ์คํ ์ด ๊ฐ๋ฅํ ์๋ฃ์ธ์ง ๊ฒ์ฌํฉ๋๋ค.
C์์๋ ์ผ๋ฐ์ ์ผ๋ก (ํ์ )๋ณ์ ํ์์ ์ฌ์ฉํฉ๋๋ค. ์ด ์บ์คํ ๋ฐฉ์์ ํ์ ์์ ์ฑ์ ์ ๊ณตํ์ง ์์ผ๋ฉฐ, ์ด๋ ํ ํ์ ์ ๋ณํ๋ ๊ฐ์ ํ ์ ์์ต๋๋ค. C ์บ์คํ ์ ์ปดํ์ผ๋ฌ๊ฐ ํ์ ์ค๋ฅ๋ฅผ ์ก์๋ด์ง ๋ชปํ ์ ์์ด ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ๊ธฐ ์ฝ์ต๋๋ค.
int i = 3;
double d = 3.5;
cout << int(d);
๋ผ๊ณ ํ์ ๋, `d`์ ๋ํ ๋ฐ์ดํฐ ์์ค์ด ์ผ์ด๋ ์ ์๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ๋ ์ ์๋ค.
C++์ ๋ค์๊ณผ ๊ฐ์ ๋ค ๊ฐ์ง ํ์ ์ ์บ์คํ ์ฐ์ฐ์๋ฅผ ์ ๊ณตํ๋ค.
์๋ ์บ์คํธ ์ฐ์ฐ์๋ค์ ์์๋ณด๊ณ ๋ฐ์ดํฐ ์์ค์ ์์ ๋ฉฐ ์์ ํ๊ฒ ์บ์คํ ํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด์.
์ผ๋ฐ์ ์ผ๋ก ์๋ ์บ์คํธ ๋ฉ์๋๋ค์ ํจ์<๋ณํํ ํ์ >(๋ณํ๋์)์ผ๋ก ์งํ๋๋ค.
static_cast<int>(d);
- static_cast
- static_cast๋ ์ปดํ์ผ ์๊ฐ์ ํ์ ์ฒดํฌ๋ฅผ ์ํํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ธ ํ์ ๋ณํ, ํด๋์ค ๊ณ์ธต ๋ด์์์ ์ ์บ์คํธ(์์ ํด๋์ค ํฌ์ธํฐ๋ฅผ ๋ถ๋ชจ ํด๋์ค ํฌ์ธํฐ๋ก ๋ณํ)์ ๋ค์ด์บ์คํธ(๋ถ๋ชจ ํด๋์ค ํฌ์ธํฐ๋ฅผ ์์ ํด๋์ค ํฌ์ธํฐ๋ก ๋ณํ)๋ฅผ ๋ชจ๋ ์ง์ํฉ๋๋ค. ์ฃผ๋ก ์ ์บ์คํ ์ ์ฌ์ฉ๋๋ค.
- C์คํ์ผ ์บ์คํฐ์ ๋๊ฐ์ ์๋ฏธ์ ํ๋ณํ ๋ฅ๋ ฅ์ ๊ฐ์ง๊ณ ์๋ ๊ธฐ๋ณธ์ ์ธ ์บ์คํธ ์ฐ์ฐ์์ ๋๋ค.
- ๋ค๋ง ๊ฐ์ ์บ์คํ (C ์คํ์ผ ์บ์คํธ) ๊ณผ ๋ค๋ฅธ์ ์ ์์ ์์์ฒ๋ผ ๋ ผ๋ฆฌ์ ๋ง์ง ์๋ ๋ณํ์ ๋ง์์ฃผ๋ ์ญํ ์ ํ๋ค.
- ๋จ, ๋ค์ด์บ์คํธ์ ๊ฒฝ์ฐ static_cast๋ ํ์ ์์ ์ฑ์ ๋ณด์ฅํ์ง ์์ต๋๋ค. ์ฆ, ์ค์ ๊ฐ์ฒด๊ฐ ๋ณํํ๋ ค๋ ํ์ ์ด ์๋ ๊ฒฝ์ฐ์๋ ์ปดํ์ผ๋ฌ๋ ์ค๋ฅ๋ฅผ ๋ฐ์์ํค์ง ์์ต๋๋ค. (dynamic_cast ์์ ์ฐจ์ด์ ์ด๋ค!)
- dynamic_cast
- dynamic_cast๋ ๋ฐํ์์ ํ์ ์์ ์ฑ์ ๊ฒ์ฌ (RTTI) ํฉ๋๋ค. ์ฃผ๋ก ๋คํ์ฑ์ ๊ฐ์ง ํด๋์ค (๊ฐ์ ํจ์๋ฅผ ๊ฐ์ง ํด๋์ค) ์ ํฌ์ธํฐ๋ ์ฐธ์กฐ ๊ฐ์ ๋ณํ์ ์ฌ์ฉ๋ฉ๋๋ค. ๋ํ ์ฃผ๋ก ๋ค์ด์บ์คํ (๊ธฐ๋ณธ ํด๋์ค์์ ํ์ ํด๋์ค๋ก)์ ์ฌ์ฉ๋ฉ๋๋ค.
- dynamic_cast๋ ๋ค์ด์บ์คํ ์ ์ค์ ๊ฐ์ฒด ํ์ ์ด ๋ชฉํ ํ์ ๊ณผ ์ผ์นํ๋์ง ํ์ธํ๊ณ , ์ผ์นํ์ง ์์ผ๋ฉด nullptr์ ๋ฐํํฉ๋๋ค(ํฌ์ธํฐ์ ๊ฒฝ์ฐ). ์ด๋ ํ์ ์์ ์ฑ์ ์ ๊ณตํฉ๋๋ค.
- ๋ฐํ์์ ํ์ ์์ ์ฑ ๊ฒ์ฌ๋ฅผ ์งํํ๊ณ ์์๊ด๊ณ์์์ ์ ์บ์คํธ๋ ๋ณํ์ ์ง์ํด์ฃผ์ง๋ง ๋ค๋ฅธ ๋ฐ์ดํฐํ ๋ณํ์ ํ์ฉํ์ง ์๋๋ค. ์ ์บ์คํ ๋ง์ด ๊ฐ๋ฅํ๊ณ ๋ง์ฝ ๊ฐ์ํจ์๊น์ง ์ฌ์ฉํ๋ค๋ฉด ๋ค์ด์บ์คํ ๋ํ ์ง์ํด์ค๋ค.
- const_cast
- const_cast๋ ๊ฐ์ฒด์ `const` ๋๋ `volatile` ์์ฑ์ ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํฉ๋๋ค. ์ด๋ ์ฃผ๋ก ์์ ๊ฐ์ฒด์ ๋ํ ์์ ์ด ํ์ํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
- ์ฆ ํ์ ์์ฒด์ ๋ณํ๋ณด๋ค๋ ๊ฐ์ฒด์ ์์ฑ์ ๋ณ๊ฒฝํ๋ ๋ฐ ์ด์ ์ ๋ง์ถฅ๋๋ค.
- 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(); // ์์ ํ๊ฒ ๋ค์ด์บ์คํ
๋ ๊ฐ์ฒด์ ํจ์ ํธ์ถ
}