ํด๋์ค์์ ์์์ ๋ณํ
์์์ ๋ณํ์ ๊ฐ์ด ํธํ๋๋ ์ ํ์ผ๋ก ๋ณต์ฌ๋ ๋ ์๋์ผ๋ก ์ํ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด:
short a=2000;
int b;
b=a;
์ฌ๊ธฐ์ ์ ๊ฐ์ ๋ช
์์ ์ฐ์ฐ์ ์์ด ์์ ๋ก a์น๊ฒฉ๋ฉ๋๋ค . ์ด๊ฒ์ ํ์ค ๋ณํ ์ด๋ผ๊ณ ํฉ๋๋ค. ํ์ค ๋ณํ์ ๊ธฐ๋ณธ ๋ฐ์ดํฐ ์ ํ์ ์ํฅ์ ๋ฏธ์น๋ฉฐ ์ซ์ ์ ํ( to , to , to ...), to ๋๋ from ๋ฐ ์ผ๋ถ ํฌ์ธํฐ ๋ณํ ๊ฐ์ ๋ณํ์ ํ์ฉํฉ๋๋ค. ๋ ์์ ์ ์ ์ ํ์์ ๋ก ๋๋ from์ผ๋ก ๋ณํ ํ๋ ๊ฒ์ ์น๊ฒฉ ์ด๋ผ๊ณ ํ๋ฉฐ ๋์ ์ ํ์์ ์ ํํ ๋์ผํ ๊ฐ์ ์์ฑํ๋๋ก ๋ณด์ฅ๋ฉ๋๋ค. ์ฐ์ ์ ํ ๊ฐ์ ๋ค๋ฅธ ๋ณํ์ด ํญ์ ๋์ผํ ๊ฐ์ ์ ํํ๊ฒ ๋ํ๋ผ ์ ์๋ ๊ฒ์ ์๋๋๋ค.shortintshortintintfloatdoubleintbool
intdoublefloat
- ์์ ์ ์ ๊ฐ์ด ๋ถํธ ์๋ ์ ํ์ผ๋ก ๋ณํ๋๋ฉด ๊ฒฐ๊ณผ ๊ฐ์ 2์ ๋ณด์ ๋นํธ ํํ์ ํด๋นํฉ๋๋ค(์ฆ, -1์ ํ์ผ๋ก ํํํ ์ ์๋ ๊ฐ์ฅ ํฐ ๊ฐ์ด ๋๊ณ -2๋ ๋ฒ์งธ๋ก ํฐ ๊ฐ์ด ...).
- 0 (์ซ์ ์ ํ์ ๊ฒฝ์ฐ) ๋ฐ ๋ ํฌ์ธํฐ (ํฌ์ธํฐ ์ ํ์ ๊ฒฝ์ฐ )์ ๋๋ฑ boolํ๋ค๊ณ ๊ฐ์ฃผ ํ๋ ๋ณํ ๋ ๋ค๋ฅธ ๋ชจ๋ ๊ฐ๊ณผ ๋์ผํ๋ฉฐ ์ ํด๋นํ๋ ๊ฐ์ผ๋ก ๋ณํ๋ฉ๋๋ค .falsetrue1
- ๋ถ๋ ์์์ ์ ํ์์ ์ ์ ์ ํ์ผ๋ก ๋ณํํ๋ ๊ฒฝ์ฐ ๊ฐ์ด ์๋ฆฝ๋๋ค(์์ ๋ถ๋ถ์ด ์ ๊ฑฐ๋จ). ๊ฒฐ๊ณผ๊ฐ ์ ํ๋ณ๋ก ํํํ ์ ์๋ ๊ฐ์ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ฉด ๋ณํ์ผ๋ก ์ธํด ์ ์๋์ง ์์ ๋์ ์ด ๋ฐ์ ํฉ๋๋ค.
- ๊ทธ๋ ์ง ์๊ณ ๋ณํ์ด ๊ฐ์ ์ข ๋ฅ์ ์ซ์ ์ ํ(์ ์์์ ์ ์๋ก ๋๋ ๋ถ๋์์ ๋ถ๋์ผ๋ก) ๊ฐ ๋ณํ์ธ ๊ฒฝ์ฐ ๋ณํ์ ์ ํจํ์ง๋ง ๊ฐ์ ๊ตฌํ์ ๋ฐ๋ผ ๋ค๋ฅด๋ฉฐ ์ด์ ๊ฐ๋ฅํ์ง ์์ ์ ์์ต๋๋ค.
์ด๋ฌํ ๋ณํ ์ค ์ผ๋ถ๋ ์ปดํ์ผ๋ฌ๊ฐ ๊ฒฝ๊ณ ์ ํจ๊ป ์ ํธ๋ฅผ ๋ณด๋ผ ์ ์๋ ์ ๋ฐ๋ ์์ค์ ์๋ฏธํ ์ ์์ต๋๋ค. ์ด ๊ฒฝ๊ณ ๋ ๋ช
์์ ๋ณํ์ผ๋ก ํผํ ์ ์์ต๋๋ค.
๊ธฐ๋ณธ์ด ์๋ ์ ํ์ ๊ฒฝ์ฐ ๋ฐฐ์ด ๋ฐ ํจ์๋ ์์์ ์ผ๋ก ํฌ์ธํฐ๋ก ๋ณํ๋๊ณ ํฌ์ธํฐ๋ ์ผ๋ฐ์ ์ผ๋ก ๋ค์ ๋ณํ์ ํ์ฉํฉ๋๋ค.
- ๋ ํฌ์ธํฐ ๋ ๋ชจ๋ ์ ํ์ ํฌ์ธํฐ๋ก ๋ณํ๋ ์ ์์ต๋๋ค.
- ๋ชจ๋ ์ ํ์ ๋ํ ํฌ์ธํฐ๋ voidํฌ์ธํฐ๋ก ๋ณํ๋ ์ ์์ต๋๋ค.
- ํฌ์ธํฐ ์ ์บ์คํธ : ํ์ ํด๋์ค์ ๋ํ ํฌ์ธํฐ๋ ํด๋น ๋๋ ์๊ฒฉ ์ ์์ ํ์ง ์๊ณ ์ก์ธ์ค ๊ฐ๋ฅ ํ๊ณ ๋ชจํธํ์ง ์์ ๊ธฐ๋ณธ ํด๋์ค ์ ํฌ์ธํฐ๋ก ๋ณํ๋ ์ ์์ต๋๋ค.constvolatile
ํด๋์ค๋ฅผ ์ฌ์ฉํ ์์์ ๋ณํ
ํด๋์ค์ ์ธ๊ณ์์ ์์์ ๋ณํ์ ์ธ ๊ฐ์ง ๋ฉค๋ฒ ํจ์๋ฅผ ํตํด ์ ์ดํ ์ ์์ต๋๋ค.
- ๋จ์ผ ์ธ์ ์์ฑ์: ํน์ ์ ํ์์ ์์์ ๋ณํ์ ํ์ฉํ์ฌ ๊ฐ์ฒด๋ฅผ ์ด๊ธฐํํฉ๋๋ค.
- ํ ๋น ์ฐ์ฐ์: ํ ๋น ์์ ํน์ ์ ํ์ ์์์ ๋ณํ์ ํ์ฉํฉ๋๋ค.
- ์ ํ ์บ์คํธ โโ์ฐ์ฐ์: ํน์ ์ ํ์ผ๋ก์ ์์์ ๋ณํ์ ํ์ฉํฉ๋๋ค.
์๋ฅผ ๋ค์ด:
// implicit conversion of classes:
#include <iostream>
using namespace std;
class A {};
class B {
public:
// conversion from A (constructor):
B (const A& x) {}
// conversion from A (assignment):
B& operator= (const A& x) {return *this;}
// conversion to A (type-cast operator)
operator A() {return A();}
};
int main ()
{
A foo;
B bar = foo; // calls constructor
bar = foo; // calls assignment
foo = bar; // calls type-cast operator
return 0;
}
type-cast ์ฐ์ฐ์๋ ํน์ ๊ตฌ๋ฌธ์ ์ฌ์ฉํฉ๋๋ค. operatorํค์๋ ๋ค์์ ๋์ ์ ํ๊ณผ ๋น ๊ดํธ ์ธํธ๊ฐ ์ค๋ ๊ฒ์ ์ฌ์ฉํฉ๋๋ค. ๋ฐํ ์ ํ์ ๋์ ์ ํ์ด๋ฏ๋ก operatorํค์๋ ์์ ์ง์ ๋์ง ์์ต๋๋ค.
๋ช ์์ ํ๋ณํ
ํจ์ ํธ์ถ์์ C++๋ ๊ฐ ์ธ์์ ๋ํด ํ๋์ ์์์ ๋ณํ์ด ๋ฐ์ํ๋๋ก ํ์ฉํฉ๋๋ค. ์ด๊ฒ์ ํญ์ ์๋ํ ๊ฒ์ด ์๋๊ธฐ ๋๋ฌธ์ ์์ ์์ ๋ค์ ๋ฌธ์ ๊ฐ ๋ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ง์ง๋ง ์์ ์ ๋ค์ ํจ์๋ฅผ ์ถ๊ฐํ๋ฉด:
void fn (B arg) {}
์ด ํจ์๋ type ์ ์ธ์๋ฅผ ์ทจํ์ง B๋ง type ์ ๊ฐ์ฒด๋ฅผ A์ธ์๋ก ์ฌ์ฉํ์ฌ ํธ์ถํ ์๋ ์์ต๋๋ค.
fn (foo);
์ด๊ฒ์ ์๋ํ ๊ฒ์ผ ์๋ ์๊ณ ์๋ ์๋ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ค ๊ฒฝ์ฐ์๋ ์ํฅ์ ๋ฐ๋ ์์ฑ์๋ฅผ explicitํค์๋๋ก ํ์ํ์ฌ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
// explicit:
#include <iostream>
using namespace std;
class A {};
class B {
public:
explicit B (const A& x) {}
B& operator= (const A& x) {return *this;}
operator A() {return A();}
};
void fn (B x) {}
int main ()
{
A foo;
B bar (foo);
bar = foo;
foo = bar;
// fn (foo); // not allowed for explicit ctor.
fn (bar);
return 0;
}
๋ํ ๋ก ํ์๋ ์์ฑ์ explicit๋ ํ ๋น๊ณผ ์ ์ฌํ ๊ตฌ๋ฌธ์ผ๋ก ํธ์ถํ ์ ์์ต๋๋ค. ์์ ์์์๋ ๋ค์ ์ ์ฌ์ฉํ์ฌ bar๊ตฌ์ฑํ ์ ์์ต๋๋ค.
B bar = foo;
์ ํ ์บ์คํธ โโ๋ฉค๋ฒ ํจ์(์ด์ ์น์ ์์ ์ค๋ช ํ ๊ฒ)๋ ๋ก ์ง์ ํ ์๋ ์์ต๋๋ค explicit. ์ด๊ฒ์ explicit-์ง์ ๋ ์์ฑ์๊ฐ ๋์ ์ ํ์ ๋ํด ์ํํ๋ ๊ฒ๊ณผ ๋์ผํ ๋ฐฉ์์ผ๋ก ์์์ ๋ณํ์ ๋ฐฉ์งํฉ๋๋ค.
๋ช ์์ ํ๋ณํ
C++๋ ๊ฐ๋ ฅํ ํ์์ ์ธ์ด์ ๋๋ค. ๋ง์ ๋ณํ, ํนํ ๊ฐ์ ๋ค๋ฅธ ํด์์ ์์ํ๋ ๋ณํ์๋ C++์์ type-casting ์ผ๋ก ์๋ ค์ง ๋ช ์์ ๋ณํ์ด ํ์ํฉ๋๋ค . ์ ๋ค๋ฆญ ํ์ ์บ์คํ ์ ์ํ ๋ ๊ฐ์ง ์ฃผ์ ๊ตฌ๋ฌธ์ด ์์ต๋๋ค: ๊ธฐ๋ฅ์ ๋ฐ c-like :
double x = 10.3;
int y;
y = int (x); // functional notation
y = (int) x; // c-like cast notation
์ด๋ฌํ ์ผ๋ฐ์ ์ธ ํ์ ์บ์คํ ์ ๊ธฐ๋ฅ์ ๊ธฐ๋ณธ ๋ฐ์ดํฐ ํ์์ ๋ํ ๋๋ถ๋ถ์ ์๊ตฌ ์ฌํญ์ ์ถฉ๋ถํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ฌํ ์ฐ์ฐ์๋ ํด๋์ค์ ํด๋์ค์ ๋ํ ํฌ์ธํฐ์ ๋ฌด์ฐจ๋ณ์ ์ผ๋ก ์ ์ฉ๋ ์ ์์ผ๋ฉฐ, ์ด๋ ๊ตฌ๋ฌธ์ ์ผ๋ก ์ ํํ์ง๋ง ๋ฐํ์ ์ค๋ฅ๋ฅผ ์ผ์ผํฌ ์ ์๋ ์ฝ๋๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ค์ ์ฝ๋๋ ์ค๋ฅ ์์ด ์ปดํ์ผ๋ฉ๋๋ค.
// class type-casting
#include <iostream>
using namespace std;
class Dummy {
double i,j;
};
class Addition {
int x,y;
public:
Addition (int a, int b) { x=a; y=b; }
int result() { return x+y;}
};
int main () {
Dummy d;
Addition * padd;
padd = (Addition*) &d;
cout << padd->result();
return 0;
}
ํ๋ก๊ทธ๋จ์ ์ ๋ํ ํฌ์ธํฐ๋ฅผ ์ ์ธ Additionํ์ง๋ง ๋ช ์์ ์ ํ ์บ์คํ ์ ์ฌ์ฉํ์ฌ ๊ด๋ จ๋์ง ์์ ๋ค๋ฅธ ์ ํ์ ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ๋ฅผ ํ ๋นํฉ๋๋ค.
padd = (Addition*) &d;
๋ฌด์ ํ ๋ช
์์ ์ ํ ์บ์คํ
์ ์ฌ์ฉํ๋ฉด ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ์ ํ๊ณผ ๊ด๊ณ์์ด ๋ชจ๋ ํฌ์ธํฐ๋ฅผ ๋ค๋ฅธ ํฌ์ธํฐ ์ ํ์ผ๋ก ๋ณํํ ์ ์์ต๋๋ค. ๋ฉค๋ฒ์ ๋ํ ํ์ ํธ์ถ result์ ๋ฐํ์ ์ค๋ฅ ๋๋ ๊ธฐํ ์์์น ๋ชปํ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํฉ๋๋ค.
ํด๋์ค ๊ฐ์ ์ด๋ฌํ ์ ํ์ ๋ณํ์ ์ ์ดํ๊ธฐ ์ํด dynamic_cast, reinterpret_cast๋ฐ . ํ์์ ๊บพ์ ๊ดํธ( )๋ก ๋ฌถ์ธ ์ ํ์์ ๋ฐ๋ฅด๊ณ ๋ฐ๋ก ๋ค์ ๊ดํธ๋ก ๋ณํํ ํํ์์ ๋ฐ๋ฆ
๋๋ค. ์ด๋ฌํ ํํ์์ ํด๋นํ๋ ๊ธฐ์กด ์ ํ ๋ณํ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ฐ๊ฐ ๊ณ ์ ํ ํน์ฑ์ด ์์ต๋๋ค.static_castconst_cast<>
dynamic_cast <new_type> (expression)
reinterpret_cast <new_type> (expression)
static_cast <new_type> (expression)
const_cast <new_type> (expression)
(new_type) expression
new_type (expression)
dynamic_cast
dynamic_castํด๋์ค์ ๋ํ ํฌ์ธํฐ ๋ฐ ์ฐธ์กฐ(๋๋ ์ ํจ๊ป void*)์๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ ๋ชฉ์ ์ ํ์ ๋ณํ์ ๊ฒฐ๊ณผ๊ฐ ๋์ ํฌ์ธํฐ ํ์์ ์ ํจํ ์์ ํ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ํ๋ ๊ฒ์
๋๋ค. ์ฌ๊ธฐ์๋ ์์์ ๋ณํ ๊ณผ ๋์ผํ ๋ฐฉ์์ผ๋ก ํฌ์ธํฐ ์
์บ์คํธ
(ํฌ์ธํฐ์์ ํ์์์ ํฌ์ธํฐ๋ก ๋ณํ)๊ฐ ์์ฐ์ค๋ฝ๊ฒ ํฌํจ๋ฉ๋๋ค . ๊ทธ๋ฌ๋ ์ง์ ๋ ๊ฐ์ฒด๊ฐ ๋์ ์ ํ์ ์ ํจํ ์์ ํ ๊ฐ์ฒด์ธ ๊ฒฝ์ฐ์๋ง (๊ฐ์ ๋ฉค๋ฒ๊ฐ ์๋) ๋คํ์ฑ ํด๋์ค๋ฅผ ๋ค์ด์บ์คํธ (๋ฒ ์ด์ค์ ๋ํ ํฌ์ธํฐ์์ ํ์๋ ํฌ์ธํฐ๋ก ๋ณํ) ํ ์๋ ์์ต๋๋ค . ์๋ฅผ ๋ค์ด:
// dynamic_cast
#include <iostream>
#include <exception>
using namespace std;
class Base { virtual void dummy() {} };
class Derived: public Base { int a; };
int main () {
try {
Base * pba = new Derived;
Base * pbb = new Base;
Derived * pd;
pd = dynamic_cast<Derived*>(pba);
if (pd==0) cout << "Null pointer on first type-cast.\n";
pd = dynamic_cast<Derived*>(pbb);
if (pd==0) cout << "Null pointer on second type-cast.\n";
} catch (exception& e) {cout << "Exception: " << e.what();}
return 0;
}
ํธํ์ฑ ์ฐธ๊ณ : ์ด ์ ํ ์ ๋์ ์ ํ์ ์ถ์ ํ๊ธฐ ์ํด RTTI(๋ฐํ์ ์ ํ ์ ๋ณด)dynamic_cast ๊ฐ ํ์ํฉ๋๋ค . ์ผ๋ถ ์ปดํ์ผ๋ฌ๋ ์ด ๊ธฐ๋ฅ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋นํ์ฑํ๋ ์ต์ ์ผ๋ก ์ง์ํฉ๋๋ค. ์ด๋ฌํ ์ ํ์์ ์ ๋๋ก ์๋ํ๋ ค๋ฉด ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐํ์ ์ ํ ๊ฒ์ฌ๋ฅผ ์ํด ํ์ฑํํด์ผ ํฉ๋๋ค .dynamic_cast
Base*์์ ์ฝ๋๋ ( pba๋ฐ pbb) ์ ํ์ ํฌ์ธํฐ ๊ฐ์ฒด์์ ์ ํ์ ํฌ์ธํฐ ๊ฐ์ฒด๋ก ๋ ๊ฐ์ ๋์ ์บ์คํธ๋ฅผ ์ํํ๋ ค๊ณ ์๋ Derived*ํ์ง๋ง ์ฒซ ๋ฒ์งธ ๊ฒ๋ง ์ฑ๊ณตํฉ๋๋ค. ๊ฐ๊ฐ์ ์ด๊ธฐํ๋ฅผ ํ์ธํ์ญ์์ค.
Base * pba = new Derived;
Base * pbb = new Base;
๋ ๋ค ํ์์ ํฌ์ธํฐ์ด์ง๋ง Base*์ค์ ๋ก pba๋ ํ์์ ๊ฐ์ฒด ๋ฅผ ๊ฐ๋ฆฌํค๋ Derived๋ฐ๋ฉด ํ์ pbb์ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํต๋๋ค Base. ๋ฐ๋ผ์ ๊ฐ๊ฐ์ ์ ํ ๋ณํ์ด ๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋ ๋ dynamic_cast๋ pbaclass ์ ์ ์ฒด ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ Derived๋ฐ๋ฉด pbb๋ class Base์ ๋ถ์์ ํ ๊ฐ์ฒด์ธ class ์ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํต๋๋ค Derived. ์ด์ ์์ ์ ๋ ๋ฒ์งธ ๋ณํ์์์ ๊ฐ์ด ํ์ ํด๋์ค์ ์์ ํ ๊ฐ์ฒด๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ํฌ์ธํฐ๋ฅผ ์บ์คํ
ํ ์ ์๋
๊ฒฝ์ฐ ์คํจ๋ฅผ ๋ํ๋ด๊ธฐ ์ํด null ํฌ์ธํฐ ๋ฅผ ๋ฐํํฉ๋๋ค. ์ฐธ์กฐ ํ์์ผ๋ก ๋ณํํ๋ ๋ฐ ์ฌ์ฉ๋๋ฉฐ ๋ณํ์ด ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ ํ์ ์์ธ๊ฐ ๋์ throw๋ฉ๋๋ค.dynamic_castdynamic_castbad_cast
dynamic_castํฌ์ธํฐ์์ ํ์ฉ๋๋ ๋ค๋ฅธ ์์์ ์บ์คํธ๋ ์ํํ ์ ์์ต๋๋ค void*.
static_cast
static_cast์ ์บ์คํธ (ํฌ์ธํฐ์์ ํ์์์ ๋ฒ ์ด์ค๋ก ํฌ์ธํฐ ๋ก)๋ฟ๋ง ์๋๋ผ ๋ค์ด์บ์คํธ (ํฌ์ธํฐ์์ ๋ฒ ์ด์ค์์ ํ์๋ ํฌ์ธํฐ๋ก) ๋ฟ ์๋๋ผ ๊ด๋ จ ํด๋์ค์ ๋ํ ํฌ์ธํฐ ๊ฐ์ ๋ณํ์ ์ํํ ์ ์์ต๋๋ค . ๋ณํ ์ค์ธ ๊ฐ์ฒด๊ฐ ์ค์ ๋ก ๋์ ์ ํ์ ์ ์ฒด ๊ฐ์ฒด์ธ์ง ํ์ธํ๊ธฐ ์ํด ๋ฐํ์ ์ค์ ๊ฒ์ฌ๊ฐ ์ํ๋์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ณํ์ด ์์ ํ์ง ํ์ธํ๋ ๊ฒ์ ํ๋ก๊ทธ๋๋จธ์๊ฒ ๋ฌ๋ ค ์์ต๋๋ค. ๋ฐ๋ฉด์ ์ ํ์ ์์ ์ฑ ๊ฒ์ฌ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค dynamic_cast.
class Base {};
class Derived: public Base {};
Base * a = new Base;
Derived * b = static_cast<Derived*>(a);
b์ด๊ฒ์ ํด๋์ค์ ๋ถ์์ ํ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์ญ์ฐธ์กฐ๋๋ ๊ฒฝ์ฐ ๋ฐํ์ ์ค๋ฅ๋ก ์ด์ด์ง ์ ์์ง๋ง ์ ํจํ ์ฝ๋ ์
๋๋ค.
๋ฐ๋ผ์ static_cast์์์ ์ผ๋ก ํ์ฉ๋๋ ๋ณํ๋ฟ๋ง ์๋๋ผ ๋ฐ๋ ๋ณํ๋ ํด๋์ค์ ๋ํ ํฌ์ธํฐ๋ก ์ํํ ์ ์์ต๋๋ค.
static_cast๋ํ ์์์ ์ผ๋ก ํ์ฉ๋๋ ๋ชจ๋ ๋ณํ(ํด๋์ค์ ๋ํ ํฌ์ธํฐ๊ฐ ์๋ ๋ณํ๋ฟ ์๋๋ผ)์ ์ํํ ์ ์์ผ๋ฉฐ ์ด์ ๋ฐ๋์ ์์
๋ ์ํํ ์ ์์ต๋๋ค. ๋ค์์ ์ํํ ์ ์์ต๋๋ค.
- void*์์ ์์์ ํฌ์ธํฐ ์ ํ์ผ๋ก ๋ณํ ํฉ๋๋ค. ์ด ๊ฒฝ์ฐ void*๋์ผํ ํฌ์ธํฐ ์ ํ์์ ๋ณํํ์ฌ ๊ฐ์ ์ป์ ๊ฒฝ์ฐ ๊ฒฐ๊ณผ ํฌ์ธํฐ ๊ฐ์ด ๋์ผํจ์ ๋ณด์ฅํฉ๋๋ค.
- ์ ์, ๋ถ๋ ์์์ ๊ฐ ๋ฐ ์ด๊ฑฐํ ์ ํ์ ์ด๊ฑฐํ ์ ํ์ผ๋ก ๋ณํํฉ๋๋ค.
๋ํ static_cast๋ค์์ ์ํํ ์๋ ์์ต๋๋ค.
- ๋จ์ผ ์ธ์ ์์ฑ์ ๋๋ ๋ณํ ์ฐ์ฐ์๋ฅผ ๋ช ์์ ์ผ๋ก ํธ์ถํฉ๋๋ค.
- rvalue ์ฐธ์กฐ ๋ก ๋ณํํฉ๋๋ค .
- enum class๊ฐ์ ์ ์ ๋๋ ๋ถ๋ ์์์ ๊ฐ์ผ๋ก ๋ณํ ํฉ๋๋ค.
- ๋ชจ๋ ์ ํ์ ๋ก ๋ณํ voidํ๊ณ ๊ฐ์ ํ๊ฐํ๊ณ ๋ฒ๋ฆฝ๋๋ค.
reinterpret_cast
reinterpret_cast๊ด๋ จ๋์ง ์์ ํด๋์ค๋ฅผ ํฌํจํ์ฌ ๋ชจ๋ ํฌ์ธํฐ ์ ํ์ ๋ค๋ฅธ ํฌ์ธํฐ ์ ํ์ผ๋ก ๋ณํํฉ๋๋ค. ์ฐ์ฐ ๊ฒฐ๊ณผ๋ ํ ํฌ์ธํฐ์์ ๋ค๋ฅธ ํฌ์ธํฐ๋ก ๊ฐ์ ๊ฐ๋จํ ์ด์ง ๋ณต์ฌ๋ณธ์
๋๋ค. ๋ชจ๋ ํฌ์ธํฐ ๋ณํ์ด ํ์ฉ๋ฉ๋๋ค. ๊ฐ๋ฆฌํค๋ ๋ด์ฉ์ด๋ ํฌ์ธํฐ ์ ํ ์์ฒด๊ฐ ๊ฒ์ฌ๋์ง ์์ต๋๋ค.
๋ํ ์ ์ ์ ํ์ผ๋ก ๋๋ ์ ์ ์ ํ์์ ํฌ์ธํฐ๋ฅผ ์บ์คํ
ํ ์ ์์ต๋๋ค. ์ด ์ ์ ๊ฐ์ด ํฌ์ธํฐ๋ฅผ ๋ํ๋ด๋ ํ์์ ํ๋ซํผ์ ๋ฐ๋ผ ๋ค๋ฆ
๋๋ค. ์ ์ผํ ๋ณด์ฅ์ ํฌ์ธํฐ๋ฅผ ์์ ํ ํฌํจํ๊ธฐ์ ์ถฉ๋ถํ ํฐ ์ ์ ์ ํ(์: intptr_t)์ผ๋ก ์บ์คํ
๋ ํฌ์ธํฐ๊ฐ ์ ํจํ ํฌ์ธํฐ๋ก ๋ค์ ์บ์คํ
๋ ์ ์๋ค๋ ๊ฒ์
๋๋ค.
์ํํ ์ ์์ง๋ง ์ํํ ์ ์๋ reinterpret_cast๋ณํstatic_cast์ ํ์ ์ด์ง ํํ์ ์ฌํด์ํ๋ ๊ฒ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ์ ์์ค ์์
์ผ๋ก, ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์์คํ
๊ณ ์ ์ ์ฝ๋๊ฐ ๋์ด ์ด์์ฑ์ด ์์ต๋๋ค. ์๋ฅผ ๋ค์ด:
class A { /* ... */ };
class B { /* ... */ };
A * a = new A;
B * b = reinterpret_cast<B*>(a);
b์ด ์ฝ๋ ๋ ์์ ํ ๊ด๋ จ์ด ์๊ณ ํธํ๋์ง ์์ ๊ฐ๋ฅ์ฑ์ด ์๋ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌ ํค๊ธฐ ๋๋ฌธ์ ๋ณ๋ก ์๋ฏธ๊ฐ ์์ง๋ง ์ปดํ์ผ๋ฉ๋๋ค . ์ญ์ฐธ์กฐ b๋ ์์ ํ์ง ์์ต๋๋ค.
const_cast
์ด ์ ํ์ ์บ์คํ ์ ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ์ฒด์ ์ผ๊ด์ฑ์ ์ค์ ํ๊ฑฐ๋ ์ ๊ฑฐํ๋๋ก ์กฐ์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, const๊ฐ ์๋ ์ธ์๋ฅผ ๊ธฐ๋ํ๋ ํจ์์ const ํฌ์ธํฐ๋ฅผ ์ ๋ฌํ๋ ค๋ฉด:
// const_cast
#include <iostream>
using namespace std;
void print (char * str)
{
cout << str << '\n';
}
int main () {
const char * c = "sample text";
print ( const_cast<char *> (c) );
return 0;
}
print์์ ์์ ๋ ํจ์ ๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ์ฒด์ ์ฐ์ง ์๊ธฐ ๋๋ฌธ์ ์๋์ด ๋ณด์ฅ๋ฉ๋๋ค . ๊ทธ๋ฌ๋ ์ค์ ๋ก ์ฐ๊ธฐ ์ํด ๋พฐ์กฑํ ๊ฐ์ฒด์ constness๋ฅผ ์ ๊ฑฐํ๋ฉด ์ ์๋์ง ์์ ๋์ ์ด ๋ฐ์ ํฉ๋๋ค.
typeid
typeidํํ์์ ์ ํ์ ํ์ธํ ์ ์์ต๋๋ค. ์ด ์ฐ์ฐ์๋ ํ์ค ํค๋์ ์ ์๋ ์ ํ์ ์์ ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ๋ฅผ ๋ฐํํฉ๋๋ค . ์์ ๋ฐํ๋ ๊ฐ์ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐํ๋ ๋ค๋ฅธ ๊ฐ๊ณผ ๋น๊ตํ ์ ์์ผ๋ฉฐ ๋๋ ํด๋น ๋ฉค๋ฒ ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ํ์ ๋๋ ํด๋์ค ์ด๋ฆ์ ๋ํ๋ด๋ null๋ก ๋๋๋ ๋ฌธ์ ์ํ์ค๋ฅผ ์ป๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค .
typeid (expression)
type_info<typeinfo>typeidtypeid==!=name()
// typeid
#include <iostream>
#include <typeinfo>
using namespace std;
int main () {
int * a,b;
a=0; b=0;
if (typeid(a) != typeid(b))
{
cout << "a and b are of different types:\n";
cout << "a is: " << typeid(a).name() << '\n';
cout << "b is: " << typeid(b).name() << '\n';
}
return 0;
}
typeid๊ฐ ํด๋์ค์ ์ ์ฉ๋ ๋ typeidRTTI๋ฅผ ์ฌ์ฉํ์ฌ ๋์ ๊ฐ์ฒด ์ ํ์ ์ถ์ ํฉ๋๋ค. ์ ํ์ด ๋คํ์ฑ ํด๋์ค์ธ ํํ์์ ๊ฐ ์ ์ฉ๋ ๋ typeid๊ฒฐ๊ณผ๋ ๊ฐ์ฅ ๋ง์ด ํ์๋ ์์ ํ ๊ฐ์ฒด์ ์ ํ์ ๋๋ค.
// typeid, polymorphic class
#include <iostream>
#include <typeinfo>
#include <exception>
using namespace std;
class Base { virtual void f(){} };
class Derived : public Base {};
int main () {
try {
Base* a = new Base;
Base* b = new Derived;
cout << "a is: " << typeid(a).name() << '\n';
cout << "b is: " << typeid(b).name() << '\n';
cout << "*a is: " << typeid(*a).name() << '\n';
cout << "*b is: " << typeid(*b).name() << '\n';
} catch (exception& e) { cout << "Exception: " << e.what() << '\n'; }
return 0;
}
a is: ํด๋์ค ๋ฒ ์ด์ค *
b๋: ํด๋์ค ๋ฒ ์ด์ค *
*a๋: ํด๋์ค ๋ฒ ์ด์ค
*b: ํ์๋ ํด๋์ค
์ฐธ๊ณ : ๋ฉค๋ฒ๊ฐ ๋ฐํํ๋ ๋ฌธ์์ด์ name์ปดํ์ผ๋ฌ type_info๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํน์ ๊ตฌํ์ ๋ฐ๋ผ ๋ค๋ฆ
๋๋ค. ์ด ์ถ๋ ฅ์ ์์ฑํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์ปดํ์ผ๋ฌ์์์ ๊ฐ์ด ๋ฐ๋์ ์ผ๋ฐ์ ์ธ ์ ํ ์ด๋ฆ์ ๊ฐ์ง ๋จ์ํ ๋ฌธ์์ด์ผ ํ์๋ ์์ต๋๋ค. ํฌ์ธํฐ์ ๋ํด ๊ณ ๋ คํ๋ ์ ํ์ด ์ด๋ป๊ฒ ํฌ์ธํฐ ์ ํ ์์ฒด
์ธ์ง ์ฃผ๋ชฉํ์ญ์์ค ( ๋ฐ ๋ ๋ค ์ ํ ์). ๊ทธ๋ฌ๋ ๊ฐ ๊ฐ์ฒด์ ์ ์ฉ๋๋ฉด( ๋ฐ ์ ๊ฐ์ ) ๋์ ์ ํ(์ฆ, ๊ฐ์ฅ ๋ง์ด ํ์๋ ์์ ํ ๊ฐ์ฒด์ ์ ํ)์ด ์์ฑ๋ฉ๋๋ค. ํ๊ฐ ๋๋ ํ์ ์ด ์ญ์ฐธ์กฐ ์ฐ์ฐ์( )๊ฐ ์์ ์ค๋ ํฌ์ธํฐ ์ด๊ณ ์ด ํฌ์ธํฐ์ null ๊ฐ์ด ์์ผ๋ฉด ์์ธ ๊ฐ ๋ฐ์ํฉ๋๋ค.typeidabclass Base *typeid*a*btypeid
typeid*typeidbad_typeid
'๐ Development Study > ๐จ๐พโ๐ป C++' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ ์ฒ๋ฆฌ๊ธฐ #define (1) | 2022.08.22 |
---|---|
exception (0) | 2022.08.22 |
๋คํ์ฑ (0) | 2022.08.22 |
์์ / ํ๋ ๋ (0) | 2022.08.22 |
์์ฑ์/์๋ฉธ์ (0) | 2022.08.22 |
๋๊ธ