SW/C++

C++11 : 형변환에 대해 알아볼까요?

얇은생각 2018. 12. 26. 12:30
반응형

배열의 포인터 변환

배열을 포인터로 변환해 주소 이동만 가지고 효율적으로 배열의 값들을 읽거나 수정할 수 있습니다. ptr 포인터 변수에 arr배열을 대이배 자동으로 포인터 형으로 변환합니다. 다음으로 배열의 두번째 요소 값을 출력하는데, 포인터 변수 ptr의 주소를 한 칸 옮긴 값과 일치함을 알 수 있습니다. 배열의 원리가 기본적으로 포인터와 같으므로 자동으로 형변환이 되는 것입니다.


#include <iostream>
using namespace std;
 
int main()
{
    int i; int arr[10];
    for (i = 0; i < 10; i++)
    {
        arr[i] = i * 2;
    }
 
    int* ptr = arr;
 
    cout << arr[1<< endl;
    cout << *(ptr + 1<< endl;
}
cs



명시적 형변환

Cast 문법을 사용해 명시적으로 자료형을 변환할 수 있습니다. 


Cast-name <type> (expression)

type : 변환될 형

expression : 변환할 값

Cast-name static_cast, const_cast,dynamic_cast,reinterpret_cast


Static_cast 형변환

흔히 산술 연산으로 인해 자동으로 형변환되는 경우를 방지하기 위해 명시적으로 자료형을 강제하는 경우와 void 포인터와 함께 쓰여 특정 자료형으로 변환이 필요할 때 많이 쓰입니다.


int main()
{
    float i = 100.12345double j = 200.12345;
    float count = static_cast<float>(j / i);
}
cs


앞의 예제는 개발자의 실수로 정밀도가 변경되는 것을 static_cast로 방지합니다. 연산결과에 따라 자동으로 형이 변환될 것을 고려하여 float 형으로 강제하였습니다.


int main()
{
    double d = 1212;
    void* p = &d;
    double* dp = static_cast<double*><p>;
}
cs

 

위의 예제는 void형 포인터 변수 p에 대해 컴파일러가 자료형을 모르기 때문에 static_cast를 이용해 명시적으로 형을 변환해 주었습니다.



const_cast 형변환

const_cast는 const 한정자로 지정한 변수에서 값을 수정할 수 있는 일반 변수로 형변환하는 문법입니다.

단 한정 속성만 변경하는 것이지 자료형 자체를 변환하는 것이 아님을 기억해야합니다.


 

int main()
{
    const char *cp;
    char *= static_cast<char*>(cp);
    const_cast<string>(cp);
}
cs


한정자로 선언한 cp 문자열 변수를 일반 문자열 변수 q로 형변환합니다. 하지만 const_cast를 이용해 한정 속성 뿐 아니라 자료형 자체를 변환하려고 시도해 오류가 발생합니다. 


dynamic_cast와 reinterpret_cast 방식을 활용하면 디버깅이 어렵습니다. 또 실제로 자주 활용하지 않으므로 기회가 되면 나중에 다루도록 하겠습니다.

반응형