Computer Science/C & C++

[C++] Type Cast Operator | 데이터형 변환 연산자

lww7438 2020. 8. 1. 17:27

Type Cast Operator

데이터형 변환 연산자

- dynamic_cast
- const_cast
- static_cast
- reinterpret_cast

- 일반적인 데이터형 변환 메커니즘보다 더 안전하고, 더 쉽게 상황을 파악할 수 있게하는 데이터 형 변환 메커니즘을 제공하는 연산자들이다.
- 일반적인 명시적 형변환 대신, 위와 같은 데이터형 변환 연산자를 통해 프로그래머가 원하는 바를 철저히 검사하면서 형변환을 수행하는 것이 바람직하다.
- 특정 목적에 맞는 데이터형 변환 연산자를 이용함으로써 데이터형 변환의 이유를 재고하고, 컴파일러에게 형변환 내용을 검사할 기회를 제공한다.


dynamic_cast 연산자

dynamic_cast <type-name> (expression)
// expression을 type-name형으로 변환하여 리턴한다.
// (expression)가 type-name형이거나, type-name형으로부터 직/간접적으로 파생된 객체이면, expression를 type-name형으로 변환을 허용한다.
// 변환할 수 없다면, 0을 리턴한다.


if (pt1 = dynamic_cast<exClass *>(pt2))
    pt1->exMethod();
// pt2 포인터를 exClass * 형으로 변환 가능하다면,
// 변환하여 pt1에 대입하고,
// pt1객체의 exMethod() 메서드를 실행한다.

- Is-A 관계에 있는 클래스 계층 내에서 Upcast를 허용하고, 다른 데이터형 변환은 허용하지 않는다.
- 기초 클래스형을 지시하는 포인터로부터 파생 클래스형을 지시하는 포인터를 생성하며, 이것이 불가능한 경우엔 0을 리턴한다.
- 포인터가 지시하는 객체형을 알려주지는 않는 대신, 해당 객체의 주소를 특정형의 포인터에 대입 가능한지에 대한 여부를 알려 준다.


const_cast 연산자

const_cast <type-name> (expression)
// expression을 type-name형으로 변환한다.

High bar;
const High* pbar = &bar;

...

High* pb = const_cast<High*> (pbar);            // 옳은 문법
const Low* pl = const_cast<const Low*> (pbar)   // 틀린 문법 (데이터형은 서로 같아야 한다.)

- 어떤 값을 const나 volatile로, 또는 그 반대로 변경하는 Casting을 수행하는 연산자이다.
- const, volatile 여부 이외의 내용이 변경되면 에러를 발생시킨다.
- type-name과 expression은 const, volatile 여부를 제외하고, 동일한 데이터 형이어야 한다.
- const_cast 연산자는 보통 상수로 존재하지만, 이따금 값이 수정되어야 하는 객체에 사용하기 적합한 연산자이다.
- 일반적 데이터형 변환으로도 const, volatile 여부를 바꿀 수 있지만, 데이터형 또한 동시에 바꿀 수 있기 때문에 단순히 const, volatile 여부만 바꾸는 경우에는 const_cast 연산자를 사용하는 것이 바람직하다.


static_cast 연산자

static_cast <type-name> (expression)
// type-name형이 expression의 데이터형으로 암시적 형변환이 가능하면,
// expression의 데이터형을 type-name형으로 변환하여 리턴한다.


High bar;
Low blow;   // Low는 High 클래스를 상속받는 파생 클래스이다.
			// Pond는 High, Low 클래스와 전혀 무관한 클래스라 가정하자.
...

High* pb = static_cast<High *> (&blow);      // 유효한 Upcast는 허용한다.
Low* pl = static_cast<Low *> (&bar);         // 유효한 Downcast는 허용한다.
Pond* pmer = static_cast<Pond *> (&blow);    // 완전히 무관한 데이터형으로의 변환은 허용하지 않는다.

 


reinterpret_cast 연산자

reinterpret_cast <type-name> (expression)


struct dat { short a; short b;};
long value = 0xA224B118;
dat* pd = reinterpret_cast<dat *> (&value);
cout << hex << pd->a;   // value값의 처음 2Bytes만 출력된다.

- reinterpret_cast 연산자는 시스템에 의존적인 다소 편법적인 데이터형 변환시에 사용된다.
- 일반적으로 시스템 의존적인 저수준 프로그래밍에서 사용되는 연산자이다.
- 프로그램 이식성을 저해한다.
- 포인터형을 보다 작은 정수형이나, 부동소수점형으로의 변환을 허용하지 않는다.
- 함수 포인터를 데이터 포인터로 변환하거나, 그 반대 경우의 변환도 허용하지 않는다.