• 1.5.1 지역 변수(Local variables)
  • 1.5.2 지역 변수로 보는 매개변수와 인자의 차이

1.5.1 지역 변수(Local variables)

변수가 생성되고 없어지는 것엔 영역이 존재한다. 메모리에 할당된 지역 변수는 할당이 이루어진 곳을 묶고 있는 중괄호가 끝나는 지점까지만 존재한다. 이러한 영역을 지역 영역(local scope)이라고 한다. 다음의 예제를 보자.

 

#include <iostream>

using namespace std;

int main()
{
	// 구분을 하기 위한 식별자인데 같으면 문제가 생김
	int x = 0;
	//int x = 1;

	cout << x << " " << &x << endl;
	{
		// 앞의 x와 다르다.
		// 다른 메모리에 대한 식별자 공간 자체가 다르다.
		//int x = 0;
		x = 1;
		cout << x << " " << &x << endl;
	}

	cout << x << " " << &x << endl;

	{
		int x = 2;
		cout << x << " " << &x << endl;
	}

	return 0;
}

 

우선 같은 중괄호에 같은 이름(같은 식별자)으로 생성된 지역 변수를 보자.

redefinition

같은 중괄호에 같은 식별자의 변수는 존재할 수 없다. 애초에 식별자가 식별을 위해 존재하는 것이기 때문에 다른 메모리에 같은 식별자로 두는 것은 허용되지 않는다.

 

다른 중괄호에 묶인 경우 같은 식별자의 변수를 사용할 수 있다. 이것이 가능한 이유가 지역 범위가 있기 때문이다. 

local variables and local scope

메모리 주소를 출력한 결과 전부 다르다는 것을 알 수 있다. 첫번째와 세번째 출력 결과가 같은 이유는 같은 지역 변수의 메모리 주소를 출력하기 때문이다.

 

이번에는 새로 지역 변수를 할당하는 것이 아닌 값만 바꾸는 행위를 하는 코드의 결과를 보자.

x 값 변경

첫 중괄호에서 새로운 지역 변수 x를 할당하는 것이 아닌 x를 1로 만들고서 메모리 주소를 출력하기만 했다. 메모리 주소는 변하지 않았고 기존의 x의 값만 바꾼 것을 알 수가 있다.

 

지역 변수는 영역을 벗어나면 사용할 수 없게 된다.
지역 변수가 차지하고 있던 메모리는 그 지역 변수가 영역을 벗어날 때 "스택(stack)" 메모리로 반납된다.
반납된 메모리는 다음 지역 변수가 사용할 수 있도록 대기한다.

1.5.2 지역 변수로 보는 매개변수와 인자의 차이

지역 변수 예제를 통해 매개변수와 인자의 차이를 알 수가 있다. 다음 코드의 결과를 살펴보자.

 

#include <iostream>

using namespace std;

void doSomething(int x)
{
	x = 123;
	cout << x << "\t" << &x << endl; // #2
}

int main()
{
	int x = 0;
	cout << x << "\t" << &x << endl; // #1

	doSomething(x);
	cout << x << "\t" << &x << endl; // #3

	return 0;
}

 

arguments and parameters

main 함수에서 생성한 x를 인자로 사용하는 doSometing 함수이다. 인자의 주소는 끝이 A54이지만 doSomething 함수에서 사용한 x의 메모리 주소는 A30으로 끝난다. 이를 통해 인자의 메모리 주소와 매개변수의 메모리 주소는 다르다는 것을 알 수 있다. 그렇기 때문에 x의 값을 123으로 변경했어도 main 함수에서 할당한 x의 값은 변하지 않음을 알 수 있다.

+ Recent posts