본문 바로가기

Programming Languages/C++

자료형의 변환

서로 다른 자료형에 해당되는 값들을 하나의 수식에 함께 사용하는 경우가 있다. 엄밀히 말해 컴퓨터에서는 자료형이 같지 않으면 계산을 하거나 올바르게 값을 전달할 수 없다. 그래서 서로 다른 자료형의 값들이 섞인 수식이 있다면 반드시 같은 형으로 자료형을 변환해 주어야 한다. 이러한 형 변환은 묵시적으로 이루어지거나 프로그래머가 의도적으로 형 변환을 지시한다. 자료형을 변환하면 원래의 값이 그래로 유지되지 못하는 경우가 있으므로 주의해야 한다.

묵시적 형 변환 ▶ 자료형에는 형 변환 관련 순위가 있다. 정수형 자료형의 변환 순위는 다음과 같이 정의된다(signed와 unsigned 형은 순위가 동일함).

bool < char < short int < int < long int < long long int

실수형에서는 표현할 수 있는 데이터의 범위가 넓은 순서에 따라 우선순위가 높다.

float < double < long double

어떠한 수식에 여러 자료형의 값들이 포함되어 있을 경우 가능한 변환이 자동적으로 적용되는데, 이를 묵시적 형 변환(implicit type conversion)이라고 한다. 묵시적 형 변환을 할 때에는 순위가 낮은 자료형의 값이 순위가 높은 자료형의 값으로 변환된다. 이때 수식의 모든 값들이 그 수식에 포함된 가장 높은 순위의 자료형으로 변환된 후 연산을 하는 것이 아니라 연산자 단위로 필요한 변환이 이루어진다. 순위가 높은 자료형은 낮은 순위의 자료형에 비해 표현할 수 있는 값의 범위가 넓기 때문에 큰 문제가 없다. 다만 long을 float으로 변환하거나 long long을 float이나 double로 변환할 때는 유효 자릿수의 차이로 인하여 오차가 발생할 수 있다.

변수의 값을 대입할 때에는 값을 받는 변수의 형으로 형 변환이 일어난다. 순위가 높은 자료형의 값을 낮은 순위 자료형의 변수에 넣는 경우에는 주의를 해야 한다. 만일 저장할 값이 그 값을 넣을 변수의 자료형으로 표현할 수 있는 값의 한계를 넘어서면 큰 오류가 발생하기 때문이다. 또한 유효자릿수가 적은 자료형의 변수에 더 긴 유효자리를 표현할 수 있는 자료형의 값을 넣는 경우 이에 따른 오차가 발생할 수도 있다.

명시적 형 변환 ▶ 명시적 형 변환(explicit type conversion)은 프로그래머가 면시적으로 자료형 변환을 지정하여 주는 것을 말한다. C에서는 변환하고자 하는 수식 앞에 '(자료형)'을 붙여 형 변환을 지정한다. C++에서도 이 방법이 계속 유효하지만, C++에서는 이와는 별개로 dynamic_cast, static_cast, reinterpret_cast, const_cast라는 형 변환 연산자를 제공한다. 각각의 형 변환 연산자의 용도는 다음과 같다.

  • static_cast : 실행 중에 형 검사를 하지 않으며, 컴파일할 때 지정된 자료형으로 변환한다.
  • dynamic_cast : 기초 클래스와 파생 클래스 간의 포인터 또는 참조의 형 변환이 프로그램이 실행되는 동안 일어나도록 지시하는 연산자이다.
  • reinterpret_cast : 주어진 값의 내용과는 관계없이 bit 수준에서 형 변환을 한다. static_cast를 통해 할 수 없는 변환도 허용할 수 있도록 하며, 이러한 변환이 불가피한 특수한 상황에서 활용한다. 특히 장치 관리 프로그램 등 시스템 프로그램을 작성할 때 이러한 변환이 필요할 때가 있다.
  • const_cast : const로 선언된 객체의 const 한정어를 해제한다.

이와 같이 명시적 형 변환 연산자를 구분하여 놓은 것은 형 변환을 보다 엄격히 통제함으로써 이에 따른 오류를 방지하는 역활을 할 수 있다.

형 변환 연산자를 사용하는 형식은 다음과 같다.

형변환_연산자<자료형>(수식)

예를 들어 다음 문장은 int형 수식 n의 값을 float형 값으로 변환한다.

int n = 10, m = 3;

float ans = (static_cast <float>(n) / m) * 2;

위의 문장에서 static_cast <float>(n)은 int형인 n의 값을 float형으로 변환한다. 이에 따라 int형인 m도 묵시적으로 float형으로 변환되어 float형 수식으로 계산되며, 전체적으로 ans에는 6.666... 이 저장된다. 만일 static_cast를 사용하지 않는다면 수식의 계산은 int형으로 이루어지므로 나눗셈 결과의 소수 부분이 잘리며, ans에는 6.0이 저장될 것이다.

 

'Programming Languages > C++' 카테고리의 다른 글

구조체  (0) 2020.04.23
흐름제어 구문  (0) 2020.04.20
연산자  (0) 2020.04.16
기본 자료형 및 상수와 변수  (0) 2020.04.15
키워드와 식별자  (0) 2020.04.14