C나 C++에서 변수를 선언만 하고 초기화하지 않으면, 그 변수는 과연 어떤 값을 가지고 있을까요? 많은 개발자가 컴파일러가 자동으로 int에는 0을, float에는 0.0을 할당해 준다고 생각합니다. 그렇다면 char 타입은 어떨까요? 이번 글에서는 실제 코드를 여러 컴파일 환경에서 실행하며 그 결과를 직접 확인해 보겠습니다.
예제 코드 (C++)
다음 예제는 char, float, int, double, long 다섯 가지 기본 데이터 타입 변수를 선언한 뒤 초기화 없이 바로 출력하는 코드입니다.
#include <iostream>
using namespace std;
int main() {
char char_var;
float float_var;
int int_var;
double double_var;
long long_var;
cout << char_var << endl;
cout << float_var << endl;
cout << int_var << endl;
cout << double_var << endl;
cout << long_var << endl;
}
실행 결과 비교
Cpp.sh 온라인 컴파일러 결과
0 0 0 0
Online GDB 결과
5.88054e-39 0 6.95297e-310 0
로컬 시스템 결과
9.73438e-039 4309744 1.15685e-306 -53505136
흥미롭게도 실행 환경마다 결과가 완전히 다르게 나타납니다. 어떤 환경에서는 0이 출력되기도 하지만, 다른 환경에서는 예측할 수 없는 쓰레기 값(garbage value)이 출력됩니다.
왜 컴파일러는 기본값을 할당하지 않을까?
그렇다면 C/C++ 컴파일러는 왜 변수에 기본값을 자동으로 할당하지 않을까요? 답은 간단합니다. 스택에 생성되는 지역 변수를 매번 초기화하는 작업은 상당한 오버헤드를 유발하며, 프로그램 실행 속도를 저하시키기 때문입니다. 따라서 초기화되지 않은 지역 변수는 불특정(indeterminate) 값을 가질 수 있습니다.
결론적으로, 초기화되지 않은 변수의 값은 컴파일러와 실행 환경에 따라 달라지므로 절대 예측해서는 안 됩니다. 따라서 기본 데이터 타입 변수는 선언과 동시에 반드시 명시적으로 초기화한 후 사용하는 것이 좋은 코딩 습관입니다.