본문 바로가기
C++/기초

C++ 기초 : 지역 변수 / 전역 변수

글: 시플마 2024. 3. 5.

변수의 종류는 여러 가지 있습니다.

 

1. 지역 변수

2. 전역 변수

3. 정적 변수(static) 

4. 외부 변수(extern)

 

 

변수가 할당되는 메모리 영역도 다양하죠.

 

1. 스택 영역

2. 데이터 영역

3. 읽기 전용(코드, ROM)

4. 힙 영역

 

 


 

 

 

지역 변수는 스택 영역에 존재합니다.

 

main 함수가 시작되면 main 함수 안에 있는 변수,

main 함수에서 A 함수를 호출하면 A 함수 안에 있는 변수 등

지역 변수는 함수와 함께 존재하기 때문에 스택 영역에 있으며

함수가 사라지면서 같이 소멸되는 특징이 있죠.

 

아래와 같은 코드가 있습니다.

void Test()
{
	int i = 0;
	++i;
}

int main()
{
	Test();
	Test();
	Test();

	return 0;
}

 

참고로 Test 함수 앞, void라는 키워드는 반환값이 없을 때 사용합니다.

Test 함수는 변수 i를 선언하고 i의 값을 1 올리는 동작을 수행합니다.

main 함수에서 Test 함수를 호출할 때마다 i의 값을 올리는 동작을 할 것입니다.

세 번 호출했으니 i의 값이 3일까요?

 

그렇지 않습니다.

 

변수 i는 Test 함수가 호출되면서 생성되지만

Test 함수가 소멸하면서 같이 소멸하기 때문에 

i의 값이 사라지고 다시 올리려고 하면 0부터 시작하겠죠.

(물론 Test 함수가 호출할 때마다 변수 i를 0으로 초기화하기 때문에

값이 0이 되는 것도 있지만, 이러한 초기화를 하지 않더라도

Test 함수가 종료된 이후 변수 i를 사용하려고 하면 

컴파일러는 변수 i가 없다고 인식합니다.)

 

 

그림을 통해 설명하면,

 

처음 Test 함수를 호출할 때 

변수 i가 0으로 선언됩니다. 이후 ++i를 만나 

값을 1 올려 i의 값은 1이 되죠.

 

 

 

그리고 Test 함수가 끝나서 소멸되고

main 함수로 가서 다음 코드인 Test 함수 호출을 진행하겠죠.

 

 

 

두 번째로 호출된 Test 함수도 똑같습니다.

 

첫 번째로 호출된 Test 함수로 선언된 변수 i는 

첫 번째로 호출된 Test 함수가 소멸하며 같이 소멸했기 때문에

두 번째로 호출된 Test 함수에서 변수 i는 다시 0부터 시작하죠.

 

그리고 값을 1 올리고 두 번째 Test 함수가 종료되며 소멸되고

값을 1 올린 변수 i도 함께 소멸될 것입니다.

이후 main 함수로 돌아가 세 번째 Test 함수를 호출하겠죠.

세 번째 Test 함수도 똑같이 변수 i는 다시 0부터 동작할 것입니다.

 

 


 

 

스택 영역에 존재하여 함수가 생성되면 생기고

함수가 종료하면 소멸하는 지역 변수와 다르게,

전역 변수는 데이터 영역에 존재하기 때문에

프로그램이 시작되자마자 생기고

프로그램이 다 끝나야 소멸합니다.

 

 

아래 코드를 보시면,

int g_i = 0;

void Test()
{
	++g_i;
}

int main()
{
	Test();
	Test();
	Test();

	return 0;
}

 

int형 전역 변수 g_i를 값을 0으로 선언하였습니다.

 

Test 함수는 전역 변수 g_i의 값을 1 올리는 

함수로 수정했습니다.

 

main 함수에서 Test 함수를 세 번 호출했기 때문에

변수 g_i의 값은 3이 될 것입니다.

 

 

 

아래 결과를 봅시다.

 

디버깅을 통해 g_i의 값을 확인해 보니

3인 것을 확인할 수 있습니다.

 

 

 

그림을 통해 이해해 보죠.

 

 

프로그램이 시작하면 데이터 영역에

int형 변수 g_i가 할당될 것입니다.

그리고 main 함수로 가 코드를 실행하는데 

Test 함수 호출 명령을 만나, Test 함수를 호출합니다.

Test 함수에서 데이터 영역에 있는 전역 변수

g_i의 값을 1 올리는 명령을 만나, 값을 1 올립니다.

 

 

 

그리고 첫 번째로 호출된 Test 함수는 종료되어

스택 메모리에서 사라지고 main 함수로 돌아가

 

두 번째 Test 함수를 호출하겠죠. 

 

이후 Test 함수 명령으로 인해

데이터 영역에 존재하는 변수 g_i의 값을 

1 올립니다. 첫 번째 Test 함수로 인해 g_i의 값은

1이었기 때문에 2로 올려주고 두 번째 Test 함수는 소멸될 것입니다.

 

 

 

그리고 다시 main 함수의 세 번째 Test 함수 호출을 

만나게 되고 위와 똑같이 동작할 것입니다.

두 번째 Test 함수로 인해 g_i의 값은

2가 되었기 때문에 3으로 올려주고 세 번째 Test 함수는 소멸될 것입니다.

 

이 시점, 데이터 영역에 존재하는 변수 g_i의 값은 3이 되었을 것입니다.

 

 

 

이후 main 함수도 종료되고

프로그램이 종료되면 전역 변수 g_i도 소멸될 것입니다.

 

 


 

 

정적 변수(static)와 외부 변수(extern)도 전역 변수와

마찬가지로 데이터 영역에 존재합니다.

 

 

 

 

강의 출처 : https://www.youtube.com/watch?v=PFc4g8mxOiI&list=PL4SIC1d_ab-aOxWPucn31NHkQvNPHK1D1&pp=iAQB

 


 

'C++ > 기초' 카테고리의 다른 글

C++ 기초 : 분할 구현의 문제점  (0) 2024.03.22
C++ 기초 : 분할 구현  (0) 2024.03.06
C++ 기초 : 구조체  (0) 2024.03.03
C++ 기초 : 배열  (0) 2024.03.02
C++ 기초 : 재귀 함수 (2)  (0) 2024.03.01