프로그래밍에서 하나의 데이터 타입을 다른 데이터 타입으로 바꾸는 과정을 형 변환(Type Conversion)이라고 합니다. C 언어에서 형 변환은 크게 두 가지 방식으로 나뉩니다.
- 암시적 형 변환(Implicit Type Conversion)
- 명시적 형 변환(Explicit Type Conversion)
암시적 형 변환(Implicit Type Conversion)
- 연산에 참여하는 피연산자들의 데이터 타입이 서로 다를 때, 컴파일러가 자동으로 수행하는 형 변환입니다.
- 개발자가 별도로 지시하지 않아도 컴파일러가 작은 데이터 타입을 더 큰 데이터 타입으로 자동 변환합니다.
int i,x; float f; double d; long int l;
위와 같은 변수들이 하나의 표현식에서 함께 연산될 경우, 최종 결과값은 표현식 내에서 가장 큰 데이터 타입인 'double'로 평가됩니다.
예제 코드
다음은 암시적 형 변환의 대표적인 예입니다.
int x;
for(x=97; x<=122; x++){
printf("%c", x); /* int에서 char로 암시적 캐스팅 (%c) */
}printf 함수의 서식 지정자 %c는 문자를 출력하지만, x는 int형 변수입니다. 이 경우 컴파일러가 자동으로 int 값을 char로 변환하여 아스키 코드 97~122에 해당하는 알파벳 소문자 a~z를 출력합니다.
명시적 형 변환(Explicit Type Conversion)
- 개발자가 (type) 연산자(캐스트 연산자)를 직접 사용하여 수행하는 형 변환입니다.
- 변환이 수행되기 전에 런타임 검사를 통해 목적지 타입이 소스 값을 담을 수 있는지 확인합니다.
int a,c; float b; c = (int) a + b
위 코드에서 'a + b'의 연산 결과는 (int) 연산자를 통해 명시적으로 int형으로 변환된 후 변수 c에 할당됩니다.
예제 코드
다음은 명시적 형 변환의 예입니다.
int x;
for(x=97; x<=122; x++){
printf("%c", (char)x); /* int에서 char로 명시적 캐스팅 */
}앞선 암시적 변환 예제와 달리, 이번에는 (char) 연산자를 사용해 개발자가 직접 int 값을 char로 변환하고 있음을 코드상으로 명확히 드러냅니다.
두 형 변환 방식의 차이 비교
두 변환 방식의 차이를 실제 예제를 통해 살펴보겠습니다.
예제 1: 암시적 형 변환
#include<stdio.h>
main(){
int i=40;
float a;
//암시적 형 변환
a=i;
printf("implicit value:%f\n",a);
}실행 결과
Implicit value:40.000000
int형 값 40이 float형 변수 a에 대입되면서 컴파일러가 자동으로 변환하여 40.000000으로 출력됩니다. 작은 타입(int)에서 큰 타입(float)으로의 변환은 데이터 손실 없이 안전하게 이루어집니다.
예제 2: 명시적 형 변환
#include<stdio.h>
main(){
int i=40;
short a;
//명시적 형 변환
a=(short)i;
printf("explicit value:%d\n",a);
}실행 결과
Explicit value:40
(short) 캐스트 연산자를 사용해 int형 값 40을 short형으로 명시적으로 변환한 후 출력합니다. 이처럼 명시적 형 변환은 개발자의 의도를 코드에 분명하게 표현할 수 있다는 장점이 있습니다.
정리
| 구분 | 암시적 형 변환 | 명시적 형 변환 |
|---|---|---|
| 수행 주체 | 컴파일러가 자동 수행 | 개발자가 (type) 연산자로 직접 수행 |
| 변환 방향 | 작은 타입 → 큰 타입 | 타입 간 자유로운 변환 가능 |
| 안전성 | 데이터 손실 위험 낮음 | 변환 시 주의 필요 |
C 언어에서 형 변환은 메모리 효율과 연산 정확성에 직결되는 중요한 개념입니다. 컴파일러의 자동 변환 규칙을 이해하고, 필요할 때는 명시적 캐스팅으로 의도를 명확히 드러내는 것이 좋은 코딩 습관입니다.