반응형
 

형 변환 연산자 사용 방법

이 문서는 응용 소프트웨어 개발팀이 앞으로 개발할 때 지켜야될 코드 컨벤션 규칙들 중에서 형 변환에 대해서 언급하고 있습니다.

이전까지 코딩에서 형 변환이 필요할 때 대부분 다음과 같이 코딩했습니다.

int a = 65;
char c = (char)a; // ok

위와 같은 형 변환 수행은 C 언어에서 제공하는 형 변환으로서 C++ 언어에서도 적합하게 동작합니다.
그러나 앞으로의 개발은 C++ 언어이고 C++ 언어에서는 OOP 개념과 함께 그에 수반할 수 있는 다양한 형 변환 연산자를 제공합니다.

C++ 언어에서는 다음과 같은 새로운 형 변환 연산자를 제공합니다.

static_cast

static_cast 연산자는 묵시적(implicit)으로 변환될 수 있는 데이터 형으로 변환을 시도할 때 유효한 연산자입니다.

일반적으로 다음과 같은 표현은,

static_cast<type-name>(expression!)

type-name이 expression!이 가지는 데이터 형으로 묵시적으로 변환 될 수 있을 때에만 유효합니다. 그렇지 않은 경우에는 에러가 발생합니다.
<Example>

class A { ... };
class B : public A { ... };
class C { ... };

A a;
B b;

A *pa = static_cast<A *>(&b);    // ok
B *pb = static_cast<B *>(&a);    // ok
C *pc = static_cast<C *>(&b);    // error : C 클래스와 B 클래스는 관련이 없다

참고로 열거값은 데이터 형 변환이 없어도 정수 값으로 변환 할 수 있기 때문에, static_cast를 사용하여 정수 값을 열거 값으로 변환할 수 있습니다. 마찬가지로 static_cast를 사용하여 double 형을 int 형으로, float 형을 long 형으로, 그 밖의 다른 수치 변환들도 처리할 수 있습니다.


dynamic_cast

dynamic_cast 연산자는 가능하다면, 기초 클래스 형을 지시하는 포인터로부터 파생 클래스 형을 지시하는 포인터를 생성합니다. 만약 가능하지 않다면, 널 포인터인 0을 리턴합니다.

일반적으로 다음과 같은 표현은,

dynamic_cast<Type *>(pt)

포인터 pt에 의해 지시되는 객체(*pt)가 Type형이거나, Type형으로부터 직접 또는 간접적으로 파생된 객체일 경우에 포인터 pt를 Type 형의 포인터로 변환합니다. 그렇지 않을 경우에 이 표현은 널 포인터인 0으로 평가됩니다.

다음은 dynamic_cast의 몇 가지 예를 보여줍니다.
<Example 1>

class A { ... };
class B : public A { ... };
class C : public A { ... };
class D : public B, public C { ... };

void foo()
{
    D *pd = new D;
    A *pa = dynamic_cast<A *>(pd);    // error : ambiguous
    B *pb = dynamic_cast<B *>(pd);    // first cast to B
    A *pa2 = dynamic_cast<A *>(pb);    // ok : unambigurous
}

<Example 2>

class B { ... };
class D : public B { ... };

void f()
{
    B* pb = new D;                     // unclear but ok
    B* pb2 = new B;

    D* pd = dynamic_cast<D*>(pb);      // ok: pb actually points to a D
    ...
    D* pd2 = dynamic_cast<D*>(pb2);    //error: pb2 points to a B, not a D
                                       // pd2 == NULL
    ...
}

reinterpret_cast

reinterpret_cast 연산자는 어떠한 포인터 타입이라도 다른 어떠한 포인터 타입으로 형 변환 할 수 있습니다. 이 연산자는 Low-Level 프로그램에서 유용하게 사용할 수 있도록 제공하는 연산자입니다. 사용하기는 편하지만 그 만틈 안전성과 이식성을 보장하지 못합니다.

사용방법은 다음과 같습니다.

reinterpret_cast<Type *>(pt)

참고로 const, volatile 그리고 __unaligned 속성이 있는 데이터 타입에는 사용 할 수 없습니다. 만약 이러한 속성을 제거하기 위해서는 const_cast를 사용하세요.


const_cast

const_cast 연산자는 데이터 형의 const, volatile 그리고 __unaligned 속성을 일시적으로 제거합니다.

사용방법은 다음과 같습니다.

const_cast<Type *>(pt)

다음 예제는 const_cast 연산자의 특성을 보여줍니다.
#include <iostream>
using std::cout;

void change(const int *pt, int n);

int main(void)
{
    int pop1 = 38383;
    const int pop2 = 2000;

    cout << "pop1, pop2: " << pop1 << ", " << pop2 << 'n';
    change(&pop1, -1);
    change(&pop2, -1);
    cout << "pop1, pop2: " << pop1 << ", " << pop2 << 'n';

    return 0;
}

void change(const int *pt, int n)
{
    int *pc;
    if (n < 0)
    {
        pc = const_cast<int *>(pt);
        *pc = 100;
    }
}


위의 예제의 실행 결과는 다음과 같습니다.

pop1, pop2: 38383, 2000
pop1, pop2: 100, 2000
반응형
Posted by Real_G