C/C++에서 전역 변수(Global Variable)에 대해 설명하고, 이를 이해하기 위한 다양한 방식을 설명하겠습니다.
전역 변수는 프로그램의 모든 함수와 블록에서 접근할 수 있는 변수입니다. 전역 변수는 함수나 블록 외부에 선언되며, 프로그램이 실행되는 동안 메모리에 상주합니다. 전역 변수는 프로그램 전체에서 공유되므로, 어떤 함수에서든 값을 읽고 쓸 수 있습니다.
#include <stdio.h>
// 전역 변수 선언
int globalVar = 10;
void function() {
printf("globalVar inside function: %d\n", globalVar);
globalVar = 20; // 전역 변수 값 변경
}
int main() {
printf("globalVar inside main: %d\n", globalVar);
function();
printf("globalVar after function call: %d\n", globalVar);
return 0;
}
#include <iostream>
// 전역 변수 선언
int globalVar = 10;
void function() {
std::cout << "globalVar inside function: " << globalVar << std::endl;
globalVar = 20; // 전역 변수 값 변경
}
int main() {
std::cout << "globalVar inside main: " << globalVar << std::endl;
function();
std::cout << "globalVar after function call: " << globalVar << std::endl;
return 0;
}
전역 변수는 데이터 세그먼트(또는 BSS 세그먼트)에 할당됩니다. 데이터 세그먼트는 프로그램이 시작될 때 할당되며, 프로그램이 종료될 때까지 유지됩니다.
메모리 구조:
+------------------+
| 코드 세그먼트 |
+------------------+
| 데이터 세그먼트 |
| (전역 변수) |
+------------------+
| BSS 세그먼트 |
| (초기화되지 않은 전역 변수) |
+------------------+
| 힙 세그먼트 |
+------------------+
| 스택 세그먼트 |
+------------------+
전역 변수는 프로그램의 모든 함수와 블록에서 접근할 수 있습니다. 이는 전역 변수가 모든 함수와 블록에서 동일한 메모리 주소를 가지기 때문입니다. 전역 변수는 프로그램이 시작될 때 초기화되며, 프로그램이 종료될 때까지 유지됩니다.
전역 변수는 함수 호출 시 재할당되지 않으므로, 스택 메모리를 절약할 수 있습니다. 그러나 전역 변수는 프로그램 전체에서 접근할 수 있으므로, 의도치 않은 값 변경이 발생할 수 있습니다. 따라서 전역 변수의 사용은 최소화하는 것이 좋습니다.
전역 변수의 메모리 구조와 접근 방식을 이해하기 쉽게 그림과 표로 표현하였습니다.
전역 변수 선언:
int globalVar = 10;
메모리 구조:
+------------------+
| 코드 세그먼트 |
+------------------+
| 데이터 세그먼트 |
| (전역 변수) |
+------------------+
| BSS 세그먼트 |
| (초기화되지 않은 전역 변수) |
+------------------+
| 힙 세그먼트 |
+------------------+
| 스택 세그먼트 |
+------------------+
다양한 상황에서 전역 변수를 사용하는 예제를 추가로 제공합니다.
#include <iostream>
// 전역 변수 선언
int globalCounter = 0;
void increment() {
globalCounter++;
}
void decrement() {
globalCounter--;
}
int main() {
std::cout << "Initial globalCounter: " << globalCounter << std::endl;
increment();
std::cout << "globalCounter after increment: " << globalCounter << std::endl;
decrement();
std::cout << "globalCounter after decrement: " << globalCounter << std::endl;
return 0;
}
#include <iostream>
// 전역 변수 선언
int value = 100;
void function() {
int value = 50; // 지역 변수 선언
std::cout << "Local value inside function: " << value << std::endl;
std::cout << "Global value inside function: " << ::value << std::endl; // 전역 변수 접근
}
int main() {
std::cout << "Global value inside main: " << value << std::endl;
function();
return 0;
}
전역 변수는 프로그램의 모든 함수와 블록에서 접근할 수 있는 변수로, 프로그램 시작 시 데이터 세그먼트에 할당되고 프로그램 종료 시까지 유지됩니다. 전역 변수는 메모리 사용 측면에서 효율적일 수 있지만, 프로그램 전체에서 접근할 수 있기 때문에 의도치 않은 값 변경의 위험이 있습니다. 따라서 전역 변수의 사용은 최소화하고, 필요할 경우 신중하게 사용해야 합니다. 운영체제는 전역 변수가 저장되는 메모리의 할당과 해제를 관리하여 프로그램이 효율적으로 전역 변수를 사용할 수 있도록 돕습니다.
이와 같은 내용을 통해 C/C++의 전역 변수에 대해 더 깊이 이해할 수 있을 것입니다. 추가로 궁금한 사항이 있으면 알려주세요!