이 포스팅은 Object Oriented Programming 시리즈 23 편 중 4 번째 글 입니다.
목차
Local, Global Variables
Local Variables
- 함수 안에서만 동작하고 함수가 끝나면 메모리에서 삭제된다.
main함수안에서 계속 살아있는 녀석이 아니다!main함수도 함수 이기 때문에main함수 종료후main함수 안에서 선언된 변수는 사라진다.
Global Variables
- 함수가 실행되기 전에 선언되는 변수
- 프로그램의 주가 되는
main함수가 끝나기 전까지 항상 살아있는 변수이다.
Example #1
#include <iostream>
using namespace std;
int x = 10; // 전역변수
int makeDouble(int param){ // 4
int x; // 5 makeDouble 함수 안의 지역변수
cout << "02: " << x << '\n'; // 6
x = param; // 7
cout << "03: " << x << '\n'; // 8
return param * 2; // 9
} // 10
int main(){ // 1
cout << "01: " << x << '\n'; // 2
x = makeDouble( x ); // 3 // 11
cout << "04: " << x << '\n'; // 12
return 0; // 13
}
출력
// [Output]
// 01: 10
// 02: -1031346592 (Garbage)
// 03: 10
// 04: 20
함수안에 적어둔 숫자 순서대로 작동한다. 실행절차를 적어보자.
여기서 주의깊게 봐야하는 것은 값을 같다고 놨을 때, 복사 한다는 점. 그리고 전역 변수, 지역 변수 가 어떻게 돌아가는지에 대한 구조 이다.
main함수 안으로 들어간다.- 전역변수
x를 출력한다.01: 10
- 전역 변수
x의 10을makeDouble함수로 복사한다. - 그 값을
makeDouble함수의param으로 복사한다. makeDouble함수의 지역 변수x를 만든다. 값은 저장되지 않았다.- 이 값을 출력한다. 값을 할당하지 않았으므로 쓰레기값이 출력된다.
02: -1031346592 (Garbage)
makeDouble함수의x에 넘어온param값을 복사한다.- 복사된
x를 출력한다.03: 10
param * 2값을 반환한다.param은makeDouble함수가 아직 끝나지 않았으므로 살아있다.- 함수가 종료되고,
makeDouble의x,param은 사라지고param * 2만 임시 저장소에 저장된다. - 반환된
param * 2을main함수x에 넣는다.param * 2은 사라진다. main함수의x를 출력한다.04: 20
main함수가 끝나고 0 을 반환한다.- 프로그램이 종료된다.
Example #2
위의 예제를 이해했다면, 아래 코드의 결과값도 이해될 것이다.
#include <iostream>
void increment(int x){
std::cout << "함수 증가전, x = " << x << '\n';
x++;
std::cout << "함수 증가후, x = " << x << '\n';
}
int main(){
int x = 5;
std::cout << "증가전, x = " << x << '\n';
increment(x);
std::cout << "증가후, x = " << x << '\n';
}
출력
// 증가전, x = 5
// 함수 증가전, x = 5
// 함수 증가후, x = 6
// 증가후, x = 5
increment 함수 통과후 사용되었던 지역변수는 모두 사라졌기에, main 함수에서의 x 는 그대로 5 이다.
만약 main 함수에서 x 값을 변화시키고 싶다면, increment 함수에서 반환값을 만들어 x 에 대입하는 방향으로 코드를 썼어야 했다.