제로 초기화(Zero Initialization)는 C++에서 객체의 초기값을 0으로 설정하는 것을 의미합니다. 이는 프로그램 실행 전에 객체를 결정론적인(deterministic) 상태로 만들어, 초기화되지 않은 변수로 인한 예측 불가능한 동작을 방지하는 중요한 초기화 방식입니다.
문법
T{} ;
char array [n] = "";
제로 초기화가 수행되는 경우
정적(static) 또는 스레드 지역(thread-local) 저장 기간을 갖는 명명된(named) 변수가 0으로 초기화됩니다.
생성자가 없는 비클래스(non-class) 타입 값의 초기화와, 생성자가 없는 클래스 멤버의 초기화에 사용됩니다.
문자 배열에서 할당하려는 문자 수보다 배열의 길이가 더 클 때, 해당 문자 배열을 초기화하는 데 사용됩니다.
기억해야 할 핵심 사항
static 변수나 thread-local 변수처럼 일부 유형의 변수는 먼저 0으로 초기화된 후, 실제 호출 시점에 지정된 값으로 다시 초기화됩니다.
0으로 초기화된 포인터를 널 포인터(null pointer)라고 부릅니다.
예제
다음은 C++에서 제로 초기화가 어떻게 동작하는지 보여주는 프로그램입니다.
#include <iostream>
#include <string>
using namespace std;
struct zeroInitialization {
int x, y, z;
};
float f[3];
int* p;
string s;
int main(int argc, char* argv[]){
zeroInitialization obj = zeroInitialization();
cout<<"Zero initialized object variable :\t";
cout<<obj.x<<"\t"<<obj.y<<"\t"<<obj.z<<"\n";
cout<<"Zero initialized float value :\t";
cout<<f[0]<<"\t"<<f[1]<<"\t"<<f[2]<<"\n";
cout<<"Zero initialized pointer value :\t";
cout<<p<<"\n";
return 0;
}
실행 결과
Zero initialized object variable : 0 0 0 Zero initialized float value : 0 0 0 Zero initialized pointer value : 0
위 코드에서 구조체 객체 obj, 전역 float 배열 f, 전역 포인터 p는 모두 프로그램 시작 시 자동으로 0으로 초기화됩니다. 특히 포인터 p는 널 포인터로 초기화되므로 출력 결과가 0으로 표시됩니다. 이처럼 제로 초기화를 활용하면 별도의 명시적 초기화 없이도 안전하게 변수를 사용할 수 있습니다.