Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

승쨩개발공부

[C++] 지역변수 / 전역변수 / 정적변수(static) 본문

C++

[C++] 지역변수 / 전역변수 / 정적변수(static)

Unknowns 2021. 12. 14. 21:28

지역 변수와 전역 변수

-> 함수를 구현할 떄 사용한 {} 괄호를 기준으로

-> 내부에 선언되어 있으면 지역 변수

-> 외부에 선언되어 있으면 전역 변수

 

 

지역 변수와 전역 변수의 차이점

-> 메모리에 상주하는 기간의 차이

-> 변수에 접근할 수 있는 범위

 

 

지역변수

-> 메모리에 상주하는 기간

-> 함수가 시작되고, 종료될 떄까지만 메모리에 상주한다.

 

-> 변수에 접근할 수 있는 범위

-> 해당 stack에 선언된 변수만 접근할 수 있다

-> 지역 변수와 매개 변수는 함수가 시작 되었을 떄 할당 시점에 들어가고,

-> 종료 되었을 떄 소멸 시점에 들어가게 되며

-> 후입 선출형 구조 LIFO(Last-in, First-Out)로 되어있다.

여기서 a와 b는 main함수의 stack 영역에 할당이 된다.

-> Result는 Add함수의 stack 영역에 할당이 된다.

-> 변수에 접근할 수 있는 범위로 인해

-> main함수에서는 Result의 존재를 모르며,

-> Add함수에서는 a와 b의 존재를 모르는 상황이다.

-> 컴퓨터는 하나의 Stack만 확인한다.

 

 

 

 

 

 

전역 변수

-> 어떠한 지역 내부에도 포함되어 있지 않다.

-> 어디서든 접근이 가능하다.

-> 프로그램이 시작되면 메모리에 등록, 종료되면 메모리에서 소멸된다.

-> Data 영역에 할당이 된다.

 

 

 

 

전역 변수와 지역 변수의 이름이 같을 경우

-> stack 영역을 우선적으로 확인

-> 변수가 있으면 지역 변수에 접근

-> 변수가 없으면 전역 변수에 접근

 

 

 

 

정적(static) 변수

-> 자료형 앞에 static 키워드를 명시하면 정적 변수가 된다.

-> 정적 변수는 지역적인 특성과 전역적인 특성을 동시에 가진다.

-> 지역적인 특성으로는 해당 지역에서만 접근이 가능하다.

-> 전역적인 특성으로는 Data영역에 메모리가 등록되므로,

-> 프로그램 시작 시 메모리에 등록되고, 프로그램 종료 시 메모리에서 소멸한다.

 

다음과 같이 변수를 만들어서 확인 해보자.

 

 

지역 변수

int Func()
{
	int a = 0;

	++a;

	return a;
}

void main()
{
	for (int i = 0; i < 5; ++i)
	{
		cout << Func() << endl;
	}
}

정적 변수

int Func()
{
	static int a = 0;

	++a;

	return a;
}

void main()
{
	for (int i = 0; i < 5; ++i)
	{
		cout << Func() << endl;
	}
}

지역 변수와 정적 변수를 놓고 보았을 떄 결과는 서로 다르다.

 

지역 변수

 

정적 변수

 

결과가 다른 이유

-> static을 통해 정적 변수가 되면 초기화 구분은 프로그램 실행 시 최초 1회만 적용이 되기 떄문이다.

'C++' 카테고리의 다른 글

[C++] CallbyValue, CallbyAdress, CallbyReference  (0) 2022.01.04
[C++] 난수(rand/srand)  (0) 2021.12.15
[C++] 진수  (0) 2021.12.14
[C++] 템플릿  (0) 2021.12.07
[C++] 함수 객체  (0) 2021.12.07