C 프로그래밍: 타입 캐스팅과 변환 마스터하기
한 데이터 타입을 다른 타입으로 변환하는 것을 타입 캐스팅 또는 타입 변환이라고 합니다. 예를 들어, 'long' 값을 일반 정수에 저장하려면 'long'을 'int'로 타입 캐스팅할 수 있습니다. 캐스트 연산자를 사용하여 한 타입의 값을 다른 타입으로 명시적으로 변환할 수 있습니다.
(타입_이름) 표현식
캐스트 연산자가 한 정수 변수를 다른 정수 변수로 나누는 연산을 부동소수점 연산으로 수행하게 하는 다음 예제를 살펴보세요.
Live Demo
#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 값이 나온다는 점에 유의하세요.
타입 변환은 컴파일러가 자동으로 수행하는 암시적 변환이거나, 캐스트 연산자를 통해 명시적으로 지정할 수 있습니다. 타입 변환이 필요할 때마다 캐스트 연산자를 사용하는 것이 좋은 프로그래밍 관행으로 간주됩니다.
정수 승격
정수 승격은 int 또는 unsigned int보다 "작은" 정수 타입의 값이 int 또는 unsigned int로 변환되는 과정입니다. 문자와 정수를 더하는 예제를 살펴보세요.
Live Demo
#include <stdio.h>
main() {
int i = 17;
char c = 'c'; /* 아스키 값은 99 */
int sum;
sum = i + c;
printf("Value of sum : %d\n", sum);
}
위 코드를 컴파일하고 실행하면 다음과 같은 결과가 나옵니다.
Value of sum : 116
컴파일러가 정수 승격을 수행하여 실제 덧셈 연산 전에 'c'의 값을 아스키 코드로 변환하기 때문에 sum의 값은 116이 됩니다.
일반적인 산술 변환
일반적인 산술 변환은 피연산자의 값을 공통 타입으로 암시적으로 캐스팅하기 위해 수행됩니다. 컴파일러는 먼저 정수 승격을 수행하고, 피연산자의 타입이 여전히 다르면 다음 계층 구조에서 가장 높은 타입으로 변환합니다.
일반적인 산술 변환은 대입 연산자나 논리 연산자(&&, ||)에는 수행되지 않습니다. 다음 예제로 개념을 이해해 보세요.
Live Demo
#include <stdio.h>
main() {
int i = 17;
char c = 'c'; /* 아스키 값은 99 */
float sum;
sum = i + c;
printf("Value of sum : %f\n", sum);
}
위 코드를 컴파일하고 실행하면 다음과 같은 결과가 나옵니다.
Value of sum : 116.000000
먼저 c가 정수로 변환되지만, 최종 결과가 double이므로 일반적인 산술 변환이 적용되어 컴파일러가 i와 c를 'float'로 변환하여 더하고 'float' 결과를 얻습니다.