개발 Study

#11. 지역변수, 전역변수 및 메모리구조 (2)

HYuk 2021. 4. 7. 22:05
728x90

# 지역변수, 전역변수

#10. 함수 및 메모리 구조 (tistory.com)

 

#10. 함수 및 메모리 구조

# 함수 ( y=f(x) ) -> 재사용성이 좋기 때문에 자주 사용한다. 함수는 1. input O output O ex) y=f(x) 2. input O output X ex) srand(seed) 3. input X output O ex) rand() 4. input X output X ex) main() 네..

hyukee.tistory.com

1. 지역변수

앞에 링크에서 볼 수 있듯이, 지역변수, 매개변수는 메모리의 STACK이라는곳에 저장되며, 함수가 끝날때 그 변수는 소멸한다.

따라서 그 변수를 함수에서 선언하여도 main함수에서는 그 변수를 불러오지 못한다.

 

2. 전역변수

그에 반해 전역변수는 아래의 그림에서 Data라는곳에 저장이 된다.

전역변수는 어떠한 중괄호 내부에도 포함되지 않으며, 프로그램 실행 시 메모리에 등록되고, 프로그램이 종료될때까지 남아있다.

따라서, 어떠한 STACK영역에 있든 해당 전역변수에 접근할 수 있다.

 

이때, 지역변수와 전역변수가 같은 변수의 이름을 쓰고 그 변수를 불러오는 코드를 작성하면,

우선적으로 지역변수에 그 이름을 가진 변수가 있는지 확인하고, 없으면 전역변수에서 가져온다.

다음 코드의 출력을 보고 확인 할 수 있다.

 

#include <iostream>

using namespace std;

int ia = 2; // 전역변수 ia = 2

void output()
{
	cout << "전역변수ia 출력 : " << ia << endl;
    // 해당 STACK에는 ia라는 변수가 없어 전역변수ia를 출력
}

void main()
{
	int ia = 1; // 지역변수 ia = 1
    
	cout << "지역변수ia 출력 : "<< ia << endl;
    // 지역변수ia와 전역변수 ia중 지역변수에ia가 있기 때문에 지역변수에 접근
    
	output(); // output 함수를 불러옴
}

 

출력은 다음과 같다

 

3. STATIC 변수

Data에 저장되는 변수 중에는 static 변수도 있다.

정적변수라고도 하는 이 static 변수는

지역변수의 해당 지역내에서만 접근이 가능의 특성

전역변수의 Data영역에 저장되어 함수가 끝나도 값이 버려지지 않는다는 특성

두가지의 특성을 모두 가지고 있다.

 

#include <iostream>

using namespace std;

int a()
{
	static int		ia = 0;
	return ++ia;
}

void main()
{
	for (int i = 0; i < 5; ++i)
	{
		cout << a() << endl; // a함수를 5번 출력
	}
}

위와 같은 함수를 출력해보면 다음과 같이 나온다

위와 같이 메인함수의 for에서 i=0 일때 a함수를 한번출력하고, i=1일때 a함수를 다시 출력할때,

a함수를 지역변수로 썼다면 다시 1이 출력 됐을 것이다.

하지만 static 변수를 씀으로, 변수값이 버려지지 않고 있다.

 

static은 지역변수의 특성 또한 가지고 있어서, main 함수에서 직접 ia에 접근하려고 하면 error 가 발생한다.

728x90

'개발 Study' 카테고리의 다른 글

#13. 포인터  (1) 2021.04.08
#12. 함수 오버로딩 및 디폴트 매개변수  (0) 2021.04.07
#10. 함수 및 메모리 구조  (0) 2021.04.06
#9. do while문, for문 (반복문)  (0) 2021.04.05
#8 Switch문, While문 그리고 난수  (0) 2021.04.03