전역변수: DATA 영역에 할당. (초기화 여부, const 여부 등에 따라 .data, .bss, .rodata 등에 할당)
- 전역변수는 디버깅하기 어렵기 때문에 웬만하면 사용 지양.
지역변수: STACK 영역에 할당.
4. 호출 스택 (call stack)
#include <iostream>
using namespace std;
// 오늘의 주제: 호출 스택
// 디버거에서 call stack 확인 가능
// 함수 선언
// 나중에 함수 선언부만 별도의 파일로 관리하게 될 것임.
void Func1();
void Func2(int hp, int mp);
void Func3(float a);
void Func1()
{
cout << "Func1" << endl;
// push 2
// push 1
// call Func2
Func2(1, 2);
}
void Func2(int a, int b)
{
cout << "Func2" << endl;
Func3(10);
}
void Func3(float a)
{
cout << "Func3" << endl;
// Func1();
}
int main()
{
cout << "main" << endl;
Func1();
return 0;
}
5. 함수 마무리
#include <iostream>
using namespace std;
// 오늘의 주제: 함수 마무리
// 오버로딩 (중복 정의 : 함수 이름의 재사용)
// 매개변수 갯수가 다르거나
// 매개변수 타입이 다르거나 (순서가 다른걸 포함)
int Add(int a, int b)
{
int result = a + b;
return result;
}
float Add(float a, float b)
{
float result = a + b;
return result;
}
// 디폴트 매개변수 (Default Parameter) (기본 인자값)
// 길드는 없을수도 있는데 없으면 길드id가 0이라고 가정
void SetPlayerInfo(int hp, int mp, int attack, int guildid = 0)
{
}
//void SetPlayerInfo(int hp, int mp, int guildid = 0, int attack) // error 뒤쪽에 기본 인자값을 넣어야 함
//{
// // 이렇게 적어놓으면 어떻게 사용해야 할까?
// // 난해하다.
//}
// 스택 오버플로우 -> 스택이 너무 많이 쌓여서 터짐
// 재귀함수 (Recursive Function)
int Factorial(int n)
{
if (n <= 1)
return 1;
return n * Factorial(n - 1);
}
int main()
{
float result = Add(1.5f, 2.1f);
SetPlayerInfo(100, 100, 10, 0); // 매번 길드id를 0으로 초기화해야함? -> 너무 불편 -> 디폴트 매개변수 사용
SetPlayerInfo(100, 100, 10); // 길드id는 입력안해도 0으로 초기화 가능
//cout << result << endl;
int factorial = Factorial(5);
// int factorial = Factorial(100000); // -> 스택 오버플로우 발생
cout << factorial << endl;
return 0;
}