: ํ์
์ ๋ณด๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ์ ๊ฐ์ผํจ์๋ค์ ์ฃผ์๊ฐ ์๋ค.
fundamental c++ p.433
-> dynamic_cast๋ ๋ฐํ์์ ํ์ ๊ฒ์ฌ๋ฅผ ํ๋ค.
1) ๋์ ํ ๋น๋ ๋ณ์๋ฅผ ์ธ์๋ก ๋ณด๋ด๋ฉด ์ด์์์...
: ํ์
๊ฒ์ฌ๋ฅผ ํ์ง ์๊ณ , ๊ทธ๋ฅ ์ง๋์น๊ฒ ๋๋ฏ๋ก, ์ํํ ์ํฉ์.
-> ๊ทธ๋ฐ๋ฐ ๋ฌธ์ ์์ด ๋๋ค.
: ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ์ฅ๋๊ฒ์ด๋ค.
2) value ๊ฐ์ฒด ๋ณด๋ด๋ฉด ๋ฐ๋ก ์๋ฌ ๋ฐ์ํจ.
3) dynamic_cast ์ผ ๊ฒฝ์ฐ, ์๋ชป๋ ํ๋ณํ์ด๋ฉด, ๊ทธ๋ฅ ์๋ฌ ๋ฐ์์ํด.
์ ๋ฌธ๊ฐ c++ : p.537
-> Animal ์ ๊ฒฝ์ฐ, vTable์ ๊ฐ์ง๊ณ ์์ง๋ง, Dog * ํ์
์ด ์๋๊ธฐ ๋๋ฌธ์ nullptr์ ๋ฐํํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ฐ.
์ฝ๋ 1๋ฒ.
์ฝ๋ 2๋ฒ
4) dynamic_cast๊ฐ ์ฑ๊ณตํ๋ ๊ฒฝ์ฐ.
: ์
์บ์คํ
์ ํ ๊ฐ์ฒด์ ๊ฒฝ์ฐ, dynamic_cast ์ฑ๊ณตํ๋ค.
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๋ฅผ ์ฌ์ฉํ์.
: ๋ฐํ๊ฐ์ด 0์ด ๋๋ ์ํฉ์ ํ๋ณํํ๋ ค๋ ํ์
์ ๋ํ ๋ฉ๋ชจ๋ฆฌ ์ ๋ณด๋ฅผ
๊ฐ์ง๊ณ ์์ง ์์ ๋์.
์๋ฅผ ๋ค๋ฉด
dynamic_cast<Derived *> ( Derived ์ ์ ๋ณด๋ฅผ ์์ ๋ชจ๋ฅผ ๋)
https://blockdmask.tistory.com/241
: ์ ์์ ์ธ ์ํ์.
-> ํฌ์ธํฐ ์
์บ์คํ
ํ ์ํ์ด๊ณ , a๋ Animal ๋ฟ์๋๋ผ, Dog์ ๋ฉ๋ชจ๋ฆฌ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ฐ.
: dynamic_cast๋ ๋คํํ์์ ๋ง๋ค์ด์ผ๋ง ๊ฐ๋ฅํ๋ค.
-> virtual ํค์๋๊ฐ ์์ด์ ์ปดํ์ผ์๋ฌ๋ฅผ ๋ฐ์์ํค๊ณ ์๋ค.
: ์์ฑ์๋ก๋ถํฐ ๊ฐ์ ํฌ์ธํฐ๊ฐ ํ์์ ์ฐธ์กฐํด์ผ ํ๋๋ฐ, ๊ทธ๋ ์ง ๋ชปํ๋ฏ๋ก,
์คํจํ ์ํฉ์.
-> a ๋ Animal์ ๋ฉ๋ชจ๋ฆฌ ์ ๋ณด๋ง ๊ฐ์ง๊ณ ์์ง, ํ์๋ Dog์ ๋ฉ๋ชจ๋ฆฌ(int data) ๋ฅผ ๋ชจ๋ฅธ๋ค...
d ๋ 0์ด ๋์ด.
: ๋น์ฐํ ๊ฒฐ๊ณผ
-> a๋ Dog์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์์ง ๋ชปํจ.. ๊ทธ๋ฆฌ๊ณ ํฌ์ธํฐ๋ฅผ ์ ๋ฌํด์ผ ํจ.
-> dynamic_cast ์ ๋ฐํ๊ฐ์ด ์ฌ๋ฐ๋ฅด๊ฒ ๋์ค๋ ค๋ฉด, ์
์บ์คํ
๋ ํฌ์ธํฐ๋ฅผ ์ธ์๋ก ๋ฃ์.
: ์คํ์๊ฐ์ ํ์ ์ ์ ๋ณด๋ฅผ ์ป์ ๋ ์ฌ์ฉํ๋ ๊ธฐ์
: 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;
}
: int ํ ๋ณ์๋ฅผ ์ ์ธํ, typeid๋ฅผ ์ถ๋ ฅํด๋ณด์.
: ํ์ ์ ๋ํ ์ ๋ณด๋ฅผ ์ป์ ๋ ์ฌ์ฉํ๋ ์ฐ์ฐ์.
: ํ์ ์ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ ํด๋์ค
const type_info &t1 = typeid(int);
const type_info &t2 = typeid(5);
if(t1 == t2) ...
1) Animal๊ณผ dog ํด๋์ค๋ฅผ ๋ง๋ฆ. virtual ์์ฑํ์ง ๋ง๋ผ.
-> ์ด๋ฐ 2๋ฒ์งธ ์ถ๋ ฅ๋ฌธ์์ ์์น ์์ ๊ฒฐ๊ณผ๊ฐ ์ถ๋ ฅ๋จ..
๋น์ฐํ๊ฒ๋ virtual ์ํด์ Animal์ด ์ถ๋ ฅ๋๋ ๊ฒ์ด๊ณ ,
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
: ๊ธฐ๋ฐ ํด๋์ค ํฌ์ธํฐ๋ฅผ ํ์ ํด๋์ค ํ์
์ผ๋ก ์บ์คํ
ํ๋ ๊ฒ.
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๋ณด๋ค๋ ํจ์จ์ด ์ข์.
: Animal ์ ๊ธฐ๋ฐ์ผ๋ก ํ๊ณ , Dog๋ ํ์, Dog๋ Dog๋ง์ int data๋ฅผ ๋ฉค๋ฒ๋ก ๊ฐ์ง๊ณ ์์.
๊ฐ) ์ธ์๋ก ๊ทธ๋ฅ Animal ๊ฐ์ฒด, Dog ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ์.
-> Animal ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ ๊ฒฝ์ฐ, ๋ฌธ์ ๋ฐ์ํจ.
: ๊ทธ๋๋ก ์ ๊ทผํ๋ฉด ๋ถ๊ฐํจ์ ํ์ธํ ์ ์์.
์กฐ๊ฑด ์ฒ๋ฆฌ ์์ด, static_cast ํ ๊ฒฝ์ฐ, ๋ฌธ์ ์.
: Animal ๊ฐ์ฒด๋ dog ๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ฅผ ์ ์ ์๊ธฐ ๋๋ฌธ์.
๋) dynamic_cast๋ก ๋ณ๊ฒฝํด๋ณด์๋ผ.
๊ฒฐ๋ก
: dynamic_cast๋ virtual์ด ํ์ํจ.
- virtual์ ์๋ฏธ๋ ๋์ ๋ฐ์ธ๋ฉ ์ฒ๋ฆฌ๋ฅผ ํจ!
๋ค) virtual์ ์ถ๊ฐํ๋ผ
-> ์ฌ๊ธฐ์ ๋ฐ์ํ ์ค๋ฅ๋ ์ธ์์ธ obj์ Dog ๊ฐ์ฒด๊ฐ ์๋๊ธฐ ๋๋ฌธ์.
๋ผ) ๋ง๋ฌด๋ฆฌ ์ง์ด๋ผ.