Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ 지역 변수와 전역 변수는 기본적으로 어떻게 초기화될까?

C++에서 지역 변수와 전역 변수 모두 기본 초기화 과정은 동일한 원리로 적용됩니다. 변수를 선언할 때 별도의 초기화 방식을 지정하지 않으면, 컴파일러는 해당 변수의 기본 생성자(default constructor)를 호출합니다.

기본 타입(int, float 등)의 초기화 동작

포인터, int, float, bool과 같은 언어 기본 타입(primitive type)의 경우, "기본 생성자"는 사실상 아무 작업도 수행하지 않습니다. 메모리를 선언된 상태 그대로 두기만 합니다. 해당 메모리에 이전에 어떤 값이 들어 있었는지, 심지어 그 메모리가 어디에서 할당된 것인지조차 알 수 없기 때문에 변수의 초기값은 예측 불가능한 임의의 값이 됩니다. 이것이 바로 지역 변수를 사용하기 전에 반드시 명시적으로 초기화해야 하는 이유입니다.

클래스와 컴파일러가 자동 생성하는 생성자

생성자가 하나도 정의되어 있지 않은 클래스를 만들면, 컴파일러가 자동으로 기본 생성자를 만들어 줍니다. 이렇게 암묵적으로 생성된 생성자는 클래스의 각 멤버 변수들의 생성자를 단순히 호출하는 역할을 합니다.

반대로 인자가 있는 생성자만 정의하고 인자 없는 생성자는 정의하지 않으면, 컴파일러는 "일치하는 생성자를 찾을 수 없다(matching constructor not found)"는 오류를 발생시킵니다. 인자 없이는 객체를 생성할 수 없기 때문입니다. 이런 경우 필요하다면 기본 생성자를 직접 정의하거나, C++11 이상에서는 = default 문법을 사용해 컴파일러에게 기본 생성자 생성을 요청할 수 있습니다.

참고: 전역 변수와 지역 변수의 실제 차이

한 가지 덧붙이자면, 실제 프로그램 실행 환경에서는 전역 변수처럼 정적 저장 기간(static storage duration)을 가진 변수가 프로그램 시작 시 0으로 영 초기화(zero-initialization)되는 반면, 함수 내부의 지역 변수는 별도의 초기화 없이 스택 메모리에 남아 있던 쓰레기 값을 그대로 가질 수 있습니다. 따라서 안전하고 예측 가능한 코드를 작성하려면 변수를 선언하는 즉시 초기화하는 습관이 매우 중요합니다.