C에서 타입 캐스팅(또는 데이터 변환)은 한 데이터 타입의 값을 다른 데이터 타입으로 변환하는 과정입니다. 모든 C 프로그래머가 마스터해야 할 기본 개념입니다.
암시적 타입 캐스팅(Implicit Type Casting)
암시적(자동) 타입 캐스팅은 개발자 개입 없이 컴파일러가 한 데이터 타입을 다른 타입으로 자동 변환할 때 발생합니다. 이는 값의 의미가 보존되고 대상 타입이 소스 값을 표현할 수 있을 때만 일어납니다.
암시적 변환은 대입, 함수 호출, 산술 연산 시 자동 수행
두 피연산자 타입이 다를 때 더 작은 순위(rank) 피연산자가 더 높은 순위 타입으로 승격
다음 예제 참고:
#include<stdio.h>
int main() {
short a = 10; // short
int b; // int
b = a; // 암시적 캐스팅
printf("%d\n", a);
printf("%d\n", b);
return 0;
}
출력:
10
10
컴파일러가 short 값을 자동으로 int로 승격하여 정보 손실 없음.
문자에서 정수로 승격(Character to Integer Promotion)
char가 산술 표현식에 참여하면 컴파일러는 ASCII 코드를 사용하여 int로 승격:
#include <stdio.h>
int main() {
int number = 1;
char character = 'k'; /* ASCII 107 */
int sum = number + character;
printf("Value of sum : %d\n", sum);
return 0;
}
출력:
Value of sum : 108
산술 변환 계층(Arithmetic Conversion Hierarchy)
C 표준은 혼합 타입 산술에서 대상 타입을 결정하는 계층을 정의합니다. 문자 승격 후 피연산자 타입이 여전히 다르면 컴파일러는 다음 차트 최상위 타입으로 변환:
산술 변환 계층
예제:
#include <stdio.h>
int main() {
int num = 13;
char c = 'k'; /* 107 */
float sum = num + c;
printf("sum = %f\n", sum);
return 0;
}
출력:
sum = 120.000000
여기서 c가 먼저 int로 승격된 후 두 피연산자 모두 float가 되어 덧셈 수행.
암시적 변환 핵심 포인트
표준 변환이라고도 하며 캐스트 연산자 불필요
더 작은 타입을 더 큰 타입으로 승격하는 것을 타입 승격(type promotion)이라 함
호환되는 타입만 암시적 변환 가능; 아니면 컴파일러 경고/에러
정보 손실 동반 변환(예: double→float)은 피하거나 명시적 캐스팅 필요
명시적 타입 캐스팅(Explicit Type Casting)
명시적 캐스팅은 컴파일러가 자동으로 수행하지 않는 변환을 강제합니다. 소수부 절단이나 무관한 타입 간 변환 등 정확한 표현이 필요할 때 필수적.
문법은 간단:
(타입명) 표현식
그렇지 않으면 결과가 절단될 나눗셈에서 명시적 캐스팅 예:
#include <stdio.h>
int main() {
int var1 = 10, var2 = 3;
int result = var1 / var2; // 3, 소수부 손실
int result2 = (int)((float)var1 / var2); // 3.333… → int 캐스팅 → 3
printf("result = %d\n", result);
printf("result2 = %d\n", result2);
return 0;
}
명시적 캐스팅은 무관한 타입 간 변환에도 유용:
#include <stdio.h>
int main() {
float a = 1.2;
int b = (int)a + 1; // float를 int로 캐스팅
printf("Value of a is %f\n", a);
printf("Value of b is %d\n", b);
return 0;
}