전역 변수는 프로그램 어디에서나 접근할 수 있는 변수입니다.
.data, .bss, .rodata)에 저장됨 #include <iostream>
using namespace std;
// 전역 변수: 어디에서나 접근 가능 (메모리 데이터 영역에 저장)
int globalValue = 0;
void Test() {
cout << "전역 변수의 값은 : " << globalValue << endl;
globalValue++; // 전역 변수 값을 증가
}
int main() {
cout << "전역 변수의 값은 : " << globalValue << endl;
globalValue++; // 전역 변수 값 변경
Test(); // 함수 호출 → 전역 변수 값 변경
return 0;
}
전역 변수의 값은 : 0
전역 변수의 값은 : 1
| 메모리 영역 | 저장되는 데이터 |
|---|---|
.rodata | 상수(const) 데이터 |
.data | 초기화된 전역 변수 |
.bss | 초기화되지 않은 전역 변수 |
지역 변수는 함수 내에서 선언되며 해당 함수에서만 접근 가능한 변수입니다.
함수 스코프를 가짐) #include <iostream>
using namespace std;
void Test() {
int localValue = 10; // 지역 변수 (스택에 저장됨)
cout << "Test 함수 내부의 지역 변수 값: " << localValue << endl;
}
int main() {
int localValue = 5; // main 함수 내부의 지역 변수 (다른 변수)
cout << "main 함수 내부의 지역 변수 값: " << localValue << endl;
Test(); // 다른 함수 호출 → Test 함수의 지역 변수는 main과 다름
return 0;
}
main 함수 내부의 지역 변수 값: 5
Test 함수 내부의 지역 변수 값: 10
| 메모리 영역 | 저장되는 데이터 |
|---|---|
| Stack | 지역 변수, 함수 호출 스택 프레임 |
지역 변수는 함수가 종료되면 사라지므로, 함수 밖에서 사용할 수 없습니다! 🚨
함수에 변수를 전달하는 방식 중 하나로, 값을 복사하여 전달하는 방식입니다.
#include <iostream>
using namespace std;
// 매개변수 hp에 전달된 값은 '복사본' (원본 영향 없음)
void IncreaseHp(int hp) {
hp = hp + 1; // 증가한 값은 원본이 아니라 복사본에 적용됨
}
int main() {
int hp = 1; // 원본 변수
cout << "Increase 호출 전 : " << hp << endl;
IncreaseHp(hp); // hp의 값을 IncreaseHp 함수에 전달 (복사됨)
cout << "Increase 호출 후 : " << hp << endl; // 여전히 1
return 0;
}
Increase 호출 전 : 1
Increase 호출 후 : 1
💡 원본
hp변수는 값이 변하지 않음! → 왜냐하면IncreaseHp(int hp)함수가 받은hp는 복사본이기 때문.
지역 변수와 매개변수가 함수 호출될 때 어떻게 스택에 저장되는지 확인해보겠습니다.
[매개변수 (복사본 hp=1)]
[리턴 주소]
[지역 변수] <- 스택에 저장됨
main() 함수에서 hp = 1 선언 (스택에 저장됨)IncreaseHp(hp) 호출 → hp 값을 복사하여 IncreaseHp() 함수의 스택 프레임에 저장 IncreaseHp()에서 hp = 2로 변경되지만, 이 값은 복사본이므로 원본 hp에는 영향 없음 IncreaseHp() 함수가 종료되면, 스택에서 해당 스택 프레임이 해제됨 main() 함수에서 hp 값을 출력하면 여전히 1 📌 매개변수의 값이 변경되어도 원본 변수는 영향을 받지 않음! (복사된 값만 변경됨)
| 특징 | 전역 변수(Global Variable) | 지역 변수(Local Variable) |
|---|---|---|
| 선언 위치 | 함수 외부 | 함수 내부 |
| 메모리 위치 | 데이터 영역 (.data, .bss) | 스택(Stack) 영역 |
| 사용 범위 | 프로그램 전체 | 선언된 함수 내에서만 사용 가능 |
| 수명 | 프로그램 종료 시까지 유지 | 함수가 끝나면 제거됨 |
| 초기화 여부 | 명시적 초기화 필요 | 초기화 없이 사용 가능 (쓰레기값 주의) |
| 데이터 공유 | 여러 함수에서 공유 가능 | 함수 내에서만 유지됨 |
✅ 전역 변수(Global Variable)
✅ 지역 변수(Local Variable)
✅ 값 전달(Value Passing)