๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“ Development Study/๐Ÿ‘จ๐Ÿพ‍๐Ÿ’ป C++

ํ˜•๋ณ€ํ™˜

by eazuooz 2022. 8. 22.

ํด๋ž˜์Šค์—์„œ ์•”์‹œ์  ๋ณ€ํ™˜

์•”์‹œ์  ๋ณ€ํ™˜์€ ๊ฐ’์ด ํ˜ธํ™˜๋˜๋Š” ์œ ํ˜•์œผ๋กœ ๋ณต์‚ฌ๋  ๋•Œ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

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

๋Œ“๊ธ€