지역 변수와 전역 변수
-> 함수를 구현할 때 사용한 {} 를 기준으로
-> 내부에 선언되어 있으면 지역 변수
-> 외부에 선언되어 있으면 전역 변수
지역 변수와 전역 변수의 차이점
-> 메모리에 상주하는 기간의 차이
-> 변수에 접근할 수 있는 범위
#1. 지역 변수
-> 메모리에 상주하는 기간
-> 함수가 시작되고, 종료될 때까지만 메모리에 상주한다.
-> 변수에 접근할 수 있는 범위
-> 해당 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회만 적용이 되기 때문이다.
'Programming > C++ Basic' 카테고리의 다른 글
C++ 함수 오버로딩, 디폴트 매개 변수 (0) | 2020.08.25 |
---|---|
C++ 함수의 선언부, 정의부 (0) | 2020.08.25 |
C++ 함수란? (0) | 2020.08.24 |
C++ 난수(rand, srand) (0) | 2020.08.20 |
C++ 반복문(for, while, do ~ while), goto 문 (0) | 2020.08.19 |