새소식

인기 검색어

게임 개발/언리얼 강의 (클라-서버)

[언리얼 MMORPG pt1] 함수

  • -

1. 함수 기초

생략

2. 스택 프레임

스택 프레임

스택은 높은 메모리주소에서 -> 낮은 메모리 주소로 진행

프로그램이 실행될 때 스택 메모리 크기를 지정함

만약 함수를 무한정 호출하면 스택오버플로우 발생 가능 (재귀함수 등)

3. 지역 변수와 값 전달

  • 전역변수: 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;

}
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.