Local / Global Scope
◆ 지역 범위
● 블록 { } 내의 범위
● 함수의 매개변수는 함수 본체 내에서만 존재함
● 따라서 함수의 (복사된) 인자 및 지역 변수들은 함수의 실행 중에만 존재함
◆ static 지역 변수
● static 한정어를 사용해 예외 변수 지정 가능함
● 초기화가 필요하다
◆ 전역 범위
● 함수 밖에 정의된 변수는 어디서나 접근 가능
● 전역 변수는 사용하지 않는 것이 좋음
● 전역 상수는 OK
◆ static 지역 변수
● static 한정어를 사용해 예외 변수 지정 가능함
● 초기화 필요
#include <iostream>
using namespace std;
void static_local_increment();
int main()
{
static_local_increment(); // 1 2
static_local_increment(); // 2 3
static_local_increment(); // 3 4
}
void static_local_increment()
{
static int num = 1;
cout << "num : " << num << endl;
num++;
cout << "num : " << num << endl;
}
static_local_increment() 함수 첫번째 호출
&num -> 01
static_local_increment() 함수 첫번째에 num ++
&num -> 02
static_local_increment() 함수 첫번째 호출
&num -> 02 값이 저장되어 있다.
static_local_increment() 함수 첫번째에 num ++
&num -> 03
static 을 선언할 경우 function()이 끝난 다음에도
&num 의 메모리값이 바뀌지 않는다.
static 은 전역변수이다.
Function Calls
◆ 함수의 호출의 동작 방식
● Function call stack
● LIFO (Last in first out)
● Stack Frame (Activation Record)
√ 함수의 호출이 발생할 때 마다 구분선이 생성됨
√ 함수의 지역 변수와 매개변수는 그 구분선 내에 생성됨
√ 함수의 호출이 끝나면 구분선 내의 메모리가 자동으로 해제됨
● 스택은 유한하고, stack overflow 가 발생할 수 있다.
● 스택 메모리
참고 자료 링크 : https://www.tcpschool.com/c/c_memory_structure
코딩교육 티씨피스쿨
4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등
tcpschool.com
#include <iostream>
using namespace std;
int func2(int, int, int);
int func1(int, int);
int main()
{
int x = 10; // Main 함수 지역 변수
int y = 20; // Main 함수 지역 변수
int z; // Main 함수 지역 변수
z = func1(x, y);
cout << z << endl;
return 0;
}
int func2(int x, int y, int z)
{
x += y + z;
return x;
}
int func1(int a, int b)
{
int result;
result = a + b;
result = func2(result, a, b);
return result;
}
결과는 60 으로 나온다.
하지만 이번 공부는 결과 값 보다는
이 코드를 실행할때 진행되는 순서를 알아야한다.
기억해 둘 것은
지역 변수 들을 위한 공간이 확보가 된다.
F11 을 눌러 func1(int, int) 함수로 들어간다.
디버그가 result = a + b ; 로 이동하면
int result 의 메모리 값에는 20으로 변한다.
func1()과 똑같이 시작된다.
Func2() 함수가 끝나고 지역 변수에 있던 메모리는 없어지고
반환값인 result 로 복사된다.
함수가 끝나 메모리 할당이 끝나면 구분선도 없어진다.
메모리 호출점도 돌아온다.
main 함수가 마무리가 되었기에
main 함수 구분선 사라지고
메모리도 기본 상태로 돌아온다.
정리하면
함수를 호출할때마다
함수 구분선이 생기며
함수에 사용되는 변수들은 구분선 위 쪽에 메모리가 확보되어
메모리가 채워진다.
함수가 끝나면 메모리 확보된(할당된) 항목(변수) 지우고
구분선도 자동으로 없어진다.
스택 메모리와 함수 호출 방식이다.
디버깅을 하며 함수의 구분선을 알 수 있다.
호출 스택에서
Func2()
Func1()
main()
함수의 구분선을 확인 할 수 있다.
호출 스택에서 func1 더블 클릭하면
func1() 로컬 변수들을 확인 할 수 있다.
앞서 PPT 내용처럼 메모리에는 함수 구분선을 기준으로
변수 값들이 할당 되다가 해제된다.
main() 함수도 더블클릭하면main() 함수에 있는 지역 변수들의 값을 확인 할 수 있다.
z는 현재 쓰레기 값을 가지고 있다.
시점에 따른 메모리 상태를 보고 싶을 경우
호출 스택에 있는 구분선을 클릭하여
지역 변수의 메모리 상태를 확인 하며 된다.
F10 을 눌러 func2()을 넘긴 경우
호출 스택은 호출되고 끝났기에 func2()는 구분선이 사라졌으나
F11 을 눌러 func2() 함수에 들어간 경우
호출 스택에서 func2()는 구분선이 생긴것을 확인 할 수 있다.
또한 x,y,z 가 쓰레기 값이였다가 값 복사가 된 것을 확인할 수 있다.
Point 를 이해할때 동적할당 참조에 대한 이해할때이번 내용을 이해했다면 혼돈을 막을 수 있다.
함수를 호출하면 구분선이 생긴다.지역변수 매개변수가 구분선 위쪽으로 할당이 된다.함수 호출이 끝나면 구분선의 메모리가 자동으로 해지된다.
메모리를 자동으로 해지하는게 스택(stack) 메모리이며,힙(Heap) 메모리는 직접 해제해주어야한다.
해당 내용을 보고 공부하며 작성하였다.
https://www.youtube.com/watch?v=JlmPIGiFrLs&list=PLMcUoebWMS1nzhlx-NbD4KBGEP1UCUDF_&index=18
'C++ > C++ : Study' 카테고리의 다른 글
C++ inline function & Recursive Function (0) | 2024.09.15 |
---|---|
c++ 배열의 전달과 pass-by-reference (0) | 2024.09.11 |
C++ Overloading 오버로딩 (1) | 2024.09.09 |
C++ 함수 Pass-by-Value (0) | 2024.09.08 |
Continue 와 Break (0) | 2024.09.07 |