C나 C++ 프로그래밍에서 인수 강제 변환(Argument Coercion)은 컴파일러가 함수 호출 시 전달된 인수를 한 자료형에서 다른 자료형으로 암묵적으로(자동으로) 변환하는 기법을 의미합니다. 이 과정은 자료형 승격 규칙(Type Promotion Rule)을 따릅니다.
인수 강제 변환의 기본 원리
핵심 규칙은 간단합니다. 표현 범위가 작은(lower) 자료형은 더 큰(higher) 자료형으로 변환될 수 있지만, 그 반대는 안전하게 허용되지 않습니다. 그 이유는 큰 자료형을 작은 자료형으로 변환하는 과정에서 데이터 손실(data loss)이 발생할 수 있기 때문입니다.
암묵적 형변환 계층 구조
아래 피라미드는 암묵적 형변환이 어떤 방향으로 일어나는지 보여줍니다. 아래쪽(작은) 자료형에서 위쪽(큰) 자료형으로의 변환만 자동으로 수행됩니다.

char → short → int → unsigned int → long → unsigned long → float → double → long double
예제 코드
#include<iostream>
using namespace std;
double myAdd(double a, double b){
return a + b;
}
int main() {
cout << "double data add: " << myAdd(5.3, 6.9) << endl;
cout << "integer data add: " << myAdd(6, 5) << endl;
}실행 결과
double data add: 12.2 integer data add: 11
코드 설명
myAdd() 함수는 두 개의 double형 매개변수를 받도록 선언되어 있습니다.
- 첫 번째 호출: 이미
double형인 5.3과 6.9를 전달했으므로 별도의 변환이 필요 없으며, 그대로 12.2가 출력됩니다. - 두 번째 호출: 정수 6과 5를 전달했습니다. 컴파일러는 승격 규칙에 따라 이 값들을 자동으로 6.0과 5.0으로 변환한 뒤 함수에 전달합니다. 결과적으로 11이 출력됩니다.
주의 사항
반대로 double 같은 큰 자료형의 값을 int처럼 작은 자료형의 매개변수에 전달하면 소수점 이하가 잘리는 등 데이터 손실이 발생할 수 있습니다. 이러한 축소 변환(narrowing conversion)은 자동 승격 대상이 아니므로, 필요하다면 명시적 캐스팅을 사용하고 그로 인한 손실 가능성을 항상 염두에 두어야 합니다.