타입 변환
타입 변환(type conversion)
C++에서 다른 타입끼리의 연산은 우선 피연산자들을 모두 같은 타입으로 만든 후에 수행됩니다.
이처럼 하나의 타입을 다른 타입으로 바꾸는 행위를 타입 변환(type conversion)이라고 합니다.
C++에서는 다음과 같은 경우에 자동으로 타입 변환을 수행합니다.
1. 다른 타입끼리의 대입, 산술 연산 시
2. 함수에 인수를 전달할 때
이때 표현 범위가 좁은 타입에서 표현 범위가 더욱 넓은 타입으로의 타입 변환은 큰 문제가 되지 않습니다.
하지만 반대의 경우처럼 표현 범위가 좁은 타입으로의 타입 변환은 데이터의 손실이 발생합니다.
타입 변환의 종류
C++에서 타입 변환은 크게 다음과 같이 두 가지 방식으로 나뉩니다.
1. 묵시적 타입 변환(자동 타입 변환)
2. 명시적 타입 변환(강제 타입 변환)
묵시적 타입 변환(자동 타입 변환)
묵시적 타입 변환은 대입 연산이나 산술 연산에서 컴파일러가 자동으로 수행해주는 타입 변환을 가리킵니다.
C++에서는 대입 연산 시 연산자의 오른쪽에 존재하는 데이터의 타입이 연산자의 왼쪽에 존재하는 데이터의 타입으로 묵시적 타입 변환이 진행됩니다.
산술 연산 시에는 데이터의 손실이 최소화되는 방향으로 묵시적 타입 변환이 진행됩니다.
다음 예제는 대입 연산에서 일어나는 묵시적 타입 변환을 보여줍니다.
예제
int num1 = 3.1415;
int num2 = 8.3E12;
double num3 = 5;
cout << "num1에 저장된 값은 " << num1 << "입니다." << endl;
cout << "num2에 저장된 값은 " << num2 << "입니다." << endl;
cout << "num3에 저장된 값은 " << num3 << "입니다.";
실행 결과
num1에 저장된 값은 3입니다.
num2에 저장된 값은 2147483647입니다.
num3에 저장된 값은 5입니다.
위의 예제에서 첫 번째 연산은 int형 변수에 실수를 대입하므로 소수 부분이 자동으로 삭제되어 데이터의 손실이 발생합니다.
두 번째 연산에서는 int형 변수가 저장할 수 있는 최대 범위를 초과한 데이터를 저장하므로 전혀 알 수 없는 결과가 출력됩니다.
하지만 세 번째 연산에서는 범위가 큰 double형 변수에 범위가 작은 int형 데이터를 대입하므로 전혀 문제가 되지 않습니다.
다음 예제는 산술 연산에서 일어나는 묵시적 타입 변환을 보여줍니다.
예제
double result1 = 5 + 3.14;
double result2 = 5.0f + 3.14;
cout << "result1에 저장된 값은 " << result1 << "입니다." << endl;
cout << "result2에 저장된 값은 " << result2 << "입니다.";
실행 결과
result1에 저장된 값은 8.14입니다.
result2에 저장된 값은 8.14입니다.
위의 예제에서 첫 번째 연산은 int형 데이터와 double형 데이터의 산술 연산입니다.
따라서 데이터의 손실이 최소화되도록 int형 데이터가 double형으로 자동 타입 변환됩니다.
두 번째 연산은 float형 데이터와 double형 데이터의 산술 연산입니다.
위와 마찬가지로 데이터의 손실이 최소화되도록 float형 데이터가 double형으로 자동 타입 변환됩니다.
이렇게 컴파일러가 자동으로 수행하는 타입 변환은 언제나 데이터의 손실이 최소화되는 방향으로 이루어집니다.
따라서 C++에서는 다음과 같은 방향으로 자동 타입 변환이 이루어집니다.
char형 → short형 → int형 → long형 → float형 → double형 → long double형
명시적 타입 변환(강제 타입 변환)
명시적 타입 변환은 사용자가 타입 캐스트(cast) 연산자를 사용하여 강제적으로 수행하는 타입 변환을 가리킵니다.
C++에서는 다음 두 가지 방식으로 명시적 타입 변환을 수행할 수 있습니다.
문법
1. (변환할타입) 변환할데이터 // C언어와 C++ 둘 다 사용 가능함.
2. 변환할타입 (변환할데이터) // C++에서만 사용 가능함.
변환시키고자 하는 데이터나 변수의 앞과 뒤에 괄호(())를 붙이고, 그 괄호 안에 변환할 타입을 적으면 됩니다.
C++에서는 이 괄호를 타입 캐스트(type cast) 연산자라고 합니다.
다음 예제는 명시적 타입 변환을 보여주는 예제입니다.
예제
int num1 = 1;
int num2 = 4;
double result1 = num1 / num2;
double result2 = (double) num1 / num2;
double result3 = double (num1) / num2;
cout << "result1에 저장된 값은 " << result1 << "입니다." << endl;
cout << "result2에 저장된 값은 " << result2 << "입니다." << endl;
cout << "result3에 저장된 값은 " << result3 << "입니다.";
실행 결과
result1에 저장된 값은 0입니다.
result2에 저장된 값은 0.25입니다.
result3에 저장된 값은 0.25입니다.
위의 예제에서 첫 번째 연산의 결괏값은 0으로 출력됩니다.
그 이유는 산술 연산에 대한 결괏값의 타입은 언제나 피연산자의 타입과 일치하기 때문입니다.
즉, int형 데이터끼리의 산술 연산에 대한 결괏값은 언제나 int형 데이터로 나오게 됩니다.
따라서 두 번째 연산에서처럼 하나의 피연산자를 명시적으로 double형으로 변환해야만 정확한 결괏값을 얻을 수 있습니다.
세 번째 연산은 C++에서만 사용할 수 있는 명시적 타입 변환 스타일의 사용법을 보여주고 있습니다.