C와 C++은 문법이 매우 비슷해 보이지만, 변수를 다시 선언(재선언)하는 상황에서는 서로 다르게 동작합니다. 이 글에서는 다음 네 가지 경우를 실제 코드와 실행 결과를 통해 비교해 보겠습니다.
- 전역 변수를 초기화 없이 재선언하는 경우
- 지역 변수를 초기화 없이 재선언하는 경우
- 전역 변수를 초기화하면서 재선언하는 경우
- 지역 변수를 초기화하면서 재선언하는 경우
각 사례마다 C 컴파일러와 C++ 컴파일러가 어떻게 반응하는지 하나씩 확인해 보세요.
1-A. C 프로그램: 초기화 없이 전역 변수 재선언하기
#include <stdio.h>
int var;
int var;
int main() {
printf("Var = %d", var);
return 0;
}
실행 결과
Var = 0
1-B. C++ 프로그램: 초기화 없이 전역 변수 재선언하기
#include <iostream>
using namespace std;
int var;
int var;
int main() {
cout << "Var = " << var;
return 0;
}
실행 결과
컴파일 오류: 'int var'가 이전에 이미 선언되었습니다
결과 분석: C는 초기화 없는 전역 변수의 재선언을 허용하며, 값은 기본값인 0으로 유지됩니다. 반면 C++은 같은 이름의 변수가 중복 선언되었다고 판단해 컴파일 오류를 발생시킵니다.
2-A. C 프로그램: 초기화 없이 지역 변수 재선언하기
#include <stdio.h>
int main() {
int var;
int var;
printf("Var = %d", var);
return 0;
}
실행 결과
오류: 'var'의 재선언 (no linkage)
2-B. C++ 프로그램: 초기화 없이 지역 변수 재선언하기
#include <iostream>
using namespace std;
int main() {
int var;
int var;
cout << "Var = " << var;
return 0;
}
실행 결과
오류: 'int var'의 재선언
결과 분석: C와 C++ 모두 같은 스코프 안에서 지역 변수를 재선언하는 것을 허용하지 않습니다. 두 프로그램 모두 컴파일 단계에서 실패합니다.
3-A. C 프로그램: 초기화하면서 전역 변수 재선언하기
#include <stdio.h>
int var;
int var = 10;
int main() {
printf("Var = %d", var);
return 0;
}
실행 결과
Var = 10
3-B. C++ 프로그램: 초기화하면서 전역 변수 재선언하기
#include <iostream>
using namespace std;
int var;
int var = 10;
int main() {
cout << "Var = " << var;
return 0;
}
실행 결과
main.cpp:7:9: 오류: 'int var'의 재선언
결과 분석: C는 전역 변수를 초기화하면서 재선언해도 컴파일이 정상적으로 진행되며, 초기화된 값이 그대로 출력됩니다. 하지만 C++은 역시 컴파일 오류로 처리합니다.
4-A. C 프로그램: 초기화하면서 지역 변수 재선언하기
#include <stdio.h>
int main() {
int var;
int var = 10;
printf("Var = %d", var);
return 0;
}
실행 결과
오류: 'var'의 재선언 (no linkage)
4-B. C++ 프로그램: 초기화하면서 지역 변수 재선언하기
#include <iostream>
using namespace std;
int main() {
int var;
int var = 10;
cout << "Var = " << var;
return 0;
}
실행 결과
오류: 'int var'의 재선언
결과 분석: 지역 변수는 초기화 여부와 무관하게 C와 C++ 모두 재선언을 허용하지 않습니다. 두 언어 모두 컴파일에 실패합니다.
전체 결과 요약
| 구분 | C | C++ |
|---|---|---|
| 전역 변수 재선언 (초기화 없음) | 허용 (값은 0) | 컴파일 오류 |
| 지역 변수 재선언 (초기화 없음) | 컴파일 오류 | 컴파일 오류 |
| 전역 변수 재선언 (초기화 있음) | 허용 | 컴파일 오류 |
| 지역 변수 재선언 (초기화 있음) | 컴파일 오류 | 컴파일 오류 |
마무리
핵심 차이는 파일 범위(전역 영역)에 있습니다. C는 초기화 식이 없는 전역 선언을 '잠정적 정의(tentative definition)'로 취급하여 여러 번 등장하는 것을 허용하고 이를 하나의 정의로 통합합니다. 반면 C++은 하나의 이름에 대해 프로그램 전체에서 단 하나의 선언만 허용하기 때문에 재선언 자체가 불가능합니다.
반면 함수 내부의 지역 변수는 같은 스코프에서 두 번 선언될 수 없다는 점에서 C와 C++의 동작이 동일합니다. 따라서 실무에서는 같은 이름의 변수를 반복 선언하지 않도록 항상 주의하는 것이 좋습니다.