형 변환(Type Casting)이란?
형 변환(Type Casting)은 변수를 한 데이터 타입에서 다른 데이터 타입으로 변환하는 방법입니다. 예를 들어, long 값을 일반 int 변수에 저장하고 싶다면 long을 int로 형 변환하면 됩니다.
C/C++에서는 캐스트 연산자(cast operator)를 사용해 값을 명시적으로 다른 타입으로 변환할 수 있으며, 기본 문법은 다음과 같습니다.
(type_name) expression
캐스트 연산자 예제
다음 예제는 캐스트 연산자를 사용해 정수 나눗셈을 부동소수점 연산으로 수행하는 경우입니다.
#include <stdio.h>
main() {
int sum = 17, count = 5;
double mean;
mean = (double) sum / count;
printf("Value of mean : %f\n", mean );
}위 코드를 컴파일하고 실행하면 다음과 같은 결과가 출력됩니다.
Value of mean : 3.400000
여기서 주목할 점은 캐스트 연산자가 나눗셈 연산보다 우선순위가 높다는 것입니다. 따라서 sum의 값이 먼저 double 타입으로 변환된 후 count로 나뉘며, 최종 결과는 double 값이 됩니다. 만약 캐스트 연산자가 없었다면 정수 나눗셈이 수행되어 결과는 3이 되었을 것입니다.
형 변환은 컴파일러가 자동으로 수행하는 암시적(implicit) 변환과, 프로그래머가 캐스트 연산자를 통해 지정하는 명시적(explicit) 변환 두 가지로 나눌 수 있습니다. 일반적으로 형 변환이 필요한 상황에서는 캐스트 연산자를 명시적으로 사용하는 것이 좋은 프로그래밍 습관으로 여겨집니다. 이는 코드의 의도를 명확히 하고, 예상치 못한 자동 변환으로 인한 버그를 방지하는 데 도움이 됩니다.
정수 승격(Integer Promotion)
정수 승격(Integer Promotion)은 int 또는 unsigned int보다 "작은" 정수 타입의 값을 int 또는 unsigned int로 변환하는 과정입니다. C 언어에서는 표현식을 평가할 때 이러한 승격이 자동으로 일어납니다.
다음은 문자와 정수를 더하는 예제입니다.
#include <stdio.h>
main() {
int i = 17;
char c = 'c'; /* ascii 값은 99 */
int sum;
sum = i + c;
printf("Value of sum : %d\n", sum );
}위 코드를 컴파일하고 실행하면 다음과 같은 결과가 출력됩니다.
Value of sum : 116
여기서 sum의 값이 116이 되는 이유는, 컴파일러가 실제 덧셈 연산을 수행하기 전에 정수 승격을 통해 문자 'c'의 값을 ASCII 코드 값인 99로 변환하기 때문입니다. 즉, 17 + 99 = 116이 계산되는 것입니다.
일반 산술 변환(Usual Arithmetic Conversion)
일반 산술 변환(usual arithmetic conversions)은 서로 다른 타입의 피연산자들을 공통 타입으로 맞추기 위해 암시적으로 수행됩니다. 컴파일러는 먼저 정수 승격을 수행하고, 그 후에도 피연산자들의 타입이 서로 다르면 다음 계층 구조에서 더 위에 있는 타입으로 변환합니다.

계층 구조는 일반적으로 long double → double → float → unsigned long long → long long → unsigned long → long → unsigned int → int 순으로, 더 큰 표현 범위를 가진 타입이 우선됩니다.
단, 일반 산술 변환은 대입 연산자(=)나 논리 연산자(&&, ||)에는 적용되지 않습니다. 다음 예제를 통해 이 개념을 살펴보겠습니다.
예제
#include <stdio.h>
main() {
int i = 17;
char c = 'c'; /* ascii 값은 99 */
float sum;
sum = i + c;
printf("Value of sum : %f\n", sum );
}실행 결과
Value of sum : 116.000000
여기서는 먼저 문자 c가 정수로 변환되어 덧셈이 수행되는 것까지는 앞선 예제와 같습니다. 하지만 최종 저장 대상인 변수 sum이 float 타입이므로, 일반 산술 변환에 따라 컴파일러가 i와 c를 float 타입으로 변환하여 더하고, 그 결과로 float 값 116.000000이 출력되는 것입니다.
마무리
형 변환은 C/C++ 프로그래밍에서 매우 중요한 개념입니다. 캐스트 연산자를 활용한 명시적 변환, 컴파일러에 의한 정수 승격, 그리고 일반 산술 변환 규칙을 정확히 이해하면 연산 결과의 타입을 예측할 수 있고, 데이터 손실이나 오버플로 같은 잠재적인 오류를 사전에 방지할 수 있습니다.