Unreal 게임 개발 과정 TIL

Today's I Learning

본캠프 TIL

04.27 Unreal 본캠프) 배열, 함수 / FPS 완성

Sunlight__ 2026. 4. 27. 21:45

 

오늘은 C언어 강의 마지막 날이었다.

마지막 날인 만큼 빠르게 설명하며 넘어갔기 때문에 조금 더 자세히 교재를 보며 공부하였다.

 

5. 배열

 

 1) 1차원 배열

 

 - 배열의 필요성

 : 지금까지 배운 내용을 바탕으로 투표 프로그램을 만든다고 가정했을 때, 어떤 사람이 몇 번 후보를 뽑았는지 저장하는 것이 가장 중요하다.

저장하기 위해선 5110만개(인구수)의 변수를 아래와 같이 선언한다.

ex) int Vote 1, int Vote 2, int Vote 3, ...

그러나 이번에 배울 배열을 사용한다면 아주 손쉽게 5110만개의 그릇을 만들 수 있다.

ex) int Vote[51100000];

그리고는 scanf() 함수와 반복문으로 투표를 시작한다.

 

- 배열(Array)

 : 자료구조 중 가장 기초가 되는 자료구조.

사용할 메모리 크기를 고정해서 선언하는 것이 특징이다.

선언된 후에는 그 크기를 변경 불가하다.

그래서 정적인 자료구조라고도 한다. 선언된 메모리는 연속적으로 할당된다.

 

- 배열 호텔

 : 배열을 호텔에 비유해보자. 단, 이 호텔에는 규칙이 있다. (여기어때 평점 1점)

1. 사용할 객실 개수를 사용 전에 예약해야 한다. (예약된 개수는 변경 불가)

2. 연속된 객실로 배정받게 된다.

3. 객실의 번호는 0번부터 시작한다. 객실의 번호를 index라고 부른다.

// 선언 방법
자료형 배열명[배열크기];
          // 자료형 변수명;

// 선언과 동시게 초기화 방법
자료형 배열명[배열크기] = { 값0, 값1, ... , 값(배열크기 -1) };
// 자료형 호텔명[객실개수] = { 사람 0, 사람1, ... , 사람(객실개수 -1) };
          // 자료형 변수명 = 값;

 

 

Ex050101) 배열 1 [중요 샘플 코드]

 

 - 다음의 소스코드를 “천천히 읽기”로 출력 결과를 예측해봅시다.
예측 결과와 실행 결과와 비교해봅시다.

// Main.c

#include <stdio.h>

int main(void)
{
	int i;
	int Array[4] = { 1, 2, 3, 4 };

	for (i = 0; i < 4; ++i)
	{
		printf("%d ", Array[i]);
	}

	return 0;
}

 

 - 자료형 변수명 i 선언.

 - 자료형 배열명 Array 선언 [배열크기 4 선언] 에 값 1, 2, 3, 4 대입

 - 변수명 i 에 0 대입, 변수명 i 0은 4보다 작기 때문에 참

 - 배열명 Array 0에 해당하는 index 값 1을 %d 형식으로 출력

 - i 값을 1 증가

 - 변수명 i 에 1 대입, 병수명 i 1은 4보다 작기 때문에 참.

 - 배열명 Array 1에 해당하는 값 index2를 %d 형식으로 출력

 - i 값을 1 증가

 - 변수명 i 에 2 대입, 병수명 i 2는 4보다 작기 때문에 참.

 - 배열명 Array 2에 해당하는 index 값 3을 %d 형식으로 출력

 - i 값을 1 증가

 - 변수명 i 에 3 대입, 병수명 i 3은 4보다 작기 때문에 참.

 - 배열명 Array 1에 해당하는 index 값 4를 %d 형식으로 출력

 - i 값을 1 증가

 - 변수명 i 에 4 대입, 병수명 i 4는 4보다 작지 않기 때문에 거짓.

 - return 반환값 0을 대입하여 메인 함수 종료.

 - 따라서 출력값은 1 2 3 4 가 나올 것이다.

 

출력값 1 2 3 4 가 나온 모습

 

 - 배열 관련 고찰

 : 배열의 index는 항상 0부터 시작한다.

 

Ex050102) 배열 2

 

 - 다음의 소스코드와 입력1을 참고하여 “천천히 읽기”로 출력1을 예측해봅시다. 예측 결과와 실행 결과와 비교해봅시다.

 

//입력1
1 3 2 4
// Main.c

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

int main(void)
{
	int i, Answer;
	int Array[4] = { 0, };

	for (i = 0; i < 4; ++i)
	{
		scanf("%d", &Answer);
		Array[i] = Answer;
	}

	for (i = 0; i < 4; ++i)
	{
		printf("%d ", Array[i]);
	}

	return 0;
}

 

 - 자료형 변수명 i 와 Answer 선언.

 - 자료형 배열명 Array 선언 [배열크기 4 선언] 에 0 대입.

 - 자료형 변수 i 에 0을 대입.

 - 자료형 변수 i 0 은 4보다 작기 때문에 참.

 - 자료형 변수 Answer 에다가 입력 값을 대입.

 - 자료형 배열명 Array 0 에 Answer 입력 값을 대입.

 - i 값을 1 증가시킨다. 

 - 자료형 변수 i 에 1을 대입.

 - 자로형 변수 i 1 은 4보다 작기 때문에 참.

 - 자료형 변수 Answer 에다가 입력 값을 대입.

 - 자료형 배열명 Array 1 에 Answer 입력 값을 대입.

 - i 값을 1 증가시킨다. 

 - 자료형 변수 i 에 2 를 대입.

 - 자료형 변수 i 2는 4보다 작기 때문에 참.

 - 자료형 변수 Answer 에다가 입력 값을 대입.

 - 자료형 배열명 Array 2 에 Answer 입력 값을 대입.

 - i 값을 1 증가시킨다. 

 - 자료형 변수 i 에 3을 대입.

 - 자료형 변수 i 3 은 4보다 작기 때문에 참.

 - 자료형 변수 Answer 에다가 입력 값을 대입.

 - 자료형 배열명 Array 3 에 Answer 입력 값을 대입.

 - i 값을 1 증가시킨다. 

 - 자료형 변수 i 에 4를 대입.

 - 자료형 변수 i 4 은 4보다 작지 않기 때문에 거짓.

 - 다음 for문으로 넘어간다.

 - 자료형 변수 i 에 0 대입.

 - 자료형 변수 i 0은 4보다 작기 때문에 참.

 - 자료형 배열명 Array 0 입력 값 index %d 형식으로 출력.

 - i값을 증가 시킨다.

 - 자료형 변수 i 에 1 대입.

 - 자료형 변수 i 1은 4보다 작기 때문에 참.

 - 자료형 배열명 Array 1 입력 값 index를 %d 형식으로 출력.

 - i값을 증가 시킨다.

 - 자료형 변수 i 에 2 대입.

 - 자료형 변수 i 2는 4보다 작기 때문에 참.

 - 자료형 배열명 Array 2 입력 값 index를 %d 형식으로 출력.

 - i값을 증가 시킨다.

 - 자료형 변수 i 에 3 대입.

 - 자료형 변수 i 3은 4보다 작기 때문에 참.

 - 자료형 배열명 Array 3 입력 값 index를 %d 형식으로 출력.

 - i값을 증가 시킨다.

 - 자료형 변수 i 에 4 대입.

 - 자료형 변수 i 4는 4보다 작지 않기 때문에 거짓.

 - 반환값 retrurn에 0을 대입 후 메인 함수 종료.

 - 따라서 출력 값은 1 3 2 4 가 나올 것이다.

출력값이 1 3 2 4 가 나온 모습

 

 2) 2차원 배열

 

 - 2차원 배열 

 : 이해 할 때는 1차원 배열을 쌓아올린 형태로 이해하면 된다.

 실제 메모리 상으로는 1차원 배열이 나열되어 있지만 2차원인 척을 해주는 것이다.

// 선언 방법
자료형 배열명[배열크기1][배열크기2];

// 선언과 동시에 초기화 방법
자료형 배열명[줄개수][칸개수] = { { 값00, 값01, ... , 값0(칸개수 -1) },
                                                   { 값(줄개수 -1)0, 값(줄개수 -1)1, ... , 값(줄개수 -1)(칸개수 -1) } };

 

Ex050201) 2차원 배열 1 [중요 샘플 코드]

 

 - 아래 소스 코드를 이중 반복문 꿀팁으로 출력 결과를 예측해봅시다. 예측한 결과와 출력을 비교해봅시다.

// Main.c

#include <stdio.h>

int main(void)
{
	int i, j;
	int Array2D[4][3] = { { 1,  2,  3, },
						  { 4,  5,  6, },
						  { 7,  8,  9, },
						  {10, 11, 12, } };

	for (i = 0; i < 4; ++i)
	{
		for (j = 0; j < 3; ++j)
		{
			printf("%2d ", Array2D[i][j]);
		}
		printf("\\n");
	}

	return 0;
}

 

 - 자료형 변수명 i, j 선언

 - 자료형 2차원 배열명 선언[배열크기4][배열크기5] 선언, 값 1, 2, 3, / 4, 5, 6, / 7, 8, 9, / 10, 11, 12 대입.

 - for문 자료형 변수명 i 에 값 0 대입, i 0 은 4보다 작기에 참. 아래 for 문으로

 - for문 자료형 변수명 j 에 값 0 대입, j 0 은 3보다 작기에 참. 아래 출력식으로

 - 자료형 2차원 배열명 Array2D [0][0] 의 index값을  %2d 형식으로 출력.

 - j 값 1 증가

 - for문 자료형 변수명 j 값 1 대입. j 1은 3보다 작기에 참. 아래 출력식으로

 - 자료형 2차원 배열명 Array2D [0][1] 의 index 값을 %2d 형식으로 출력.

 - j 값 1 증가

 - for문 자료형 변수명 j 값 2 대입. j 2은 3보다 작기에 참. 아래 출력식으로

 - 자료형 2차원 배열명 Array2D [0][2] 의 index 값을 %2d 형식으로 출력.

 - j 값 1 증가

 - for문 자료형 변수명 j 값 3 대입. j 3은 3보다 작지 않기에 중괄호 밖 출력식으로

 - 개행하라

 - i값 1 증가

 - for문 자료형 변수명 i 값 1 대입. i 1은 4보다 작기에 참. 아래 출력식으로

 - for문 자료형 변수명 j 값 0 대입. j 0는 3보다 작기에 참. 아래 출력식으로

 - 자료형 2차원 배열명 Array2D [1][0] 의 index 값을 %2d 형식으로 출력.

 - j 값 1 증가

 - for문 자료형 변수명 j 값 0 대입. j 0는 3보다 작기에 참. 아래 출력식으로

 - 자료형 2차원 배열명 Array2D [1][1] 의 index 값을 %2d 형식으로 출력.

 - j 값 1 증가

 - for문 자료형 변수명 j 값 0 대입. j 0는 3보다 작기에 참. 아래 출력식으로

 - 자료형 2차원 배열명 Array2D [1][2] 의 index 값을 %2d 형식으로 출력.

 - j 값 1 증가

 - for문 자료형 변수명 j 값 3 대입. j 3은 3보다 작지 않기에 중괄호 밖 출력식으로

 - 개행하라

 - i값 1 증가

 - for문 자료형 변수명 i 값 2 대입. i 2는 4보다 작기에 참. 아래 출력식으로

 - for문 자료형 변수명 j 값 0 대입. j 0는 3보다 작기에 참. 아래 출력식으로

 - 자료형 2차원 배열명 Array2D [2][0] 의 index 값을 %2d 형식으로 출력.

 - j 값 1 증가

 - for문 자료형 변수명 j 값 0 대입. j 0는 3보다 작기에 참. 아래 출력식으로

 - 자료형 2차원 배열명 Array2D [2][1] 의 index 값을 %2d 형식으로 출력.

 - j 값 1 증가

 - for문 자료형 변수명 j 값 0 대입. j 0는 3보다 작기에 참. 아래 출력식으로

 - 자료형 2차원 배열명 Array2D [2][2] 의 index 값을 %2d 형식으로 출력.

 - j 값 1 증가

 - for문 자료형 변수명 j 값 3 대입. j 3은 3보다 작지 않기에 중괄호 밖 출력식으로

 - 개행하라

 - i값 1 증가

 - for문 자료형 변수명 i 값 3 대입. i 3은 4보다 작기에 참. 아래 출력식으로

 - for문 자료형 변수명 j 값 0 대입. j 0는 3보다 작기에 참. 아래 출력식으로

 - 자료형 2차원 배열명 Array2D [3][0] 의 index 값을 %2d 형식으로 출력.

 - j 값 1 증가

 - for문 자료형 변수명 j 값 0 대입. j 0는 3보다 작기에 참. 아래 출력식으로

 - 자료형 2차원 배열명 Array2D [3][1] 의 index 값을 %2d 형식으로 출력.

 - j 값 1 증가

 - for문 자료형 변수명 j 값 0 대입. j 0는 3보다 작기에 참. 아래 출력식으로

 - 자료형 2차원 배열명 Array2D [3][3] 의 index 값을 %2d 형식으로 출력.

 - j 값 1 증가

 - for문 자료형 변수명 j 값 3 대입. j 3은 3보다 작지 않기에 중괄호 밖 출력식으로

 - 개행하라

 - i값 1 증가

 - for문 자료형 변수명 i 값 4 대입. i 4는 4보다 작지 않기에 거짓.

 - 반환값 return에 0 대입 후 메인 함수 종료.

 - 따라서 결과값은 

  1   2   3

  4   5   6

  7   8   9

10 11 12

이렇게 나올 것이다.

 

 

Ex050202) 2차원 배열 2

 

 - 아래와 같은 입력을 받고 똑같은 출력을 하게끔 소스코드로 작성해봅시다.

//입력1
1 2 3 4 5 6 7 8 9 10 11 12
//출력1
 1  2  3
 4  5  6
 7  8  9
10 11 12

 

 - 방금 했던 것과 같이 코드를 작성해보자.

 

 

 - Array2D의 값을 먼저 입력해 준 뒤 출력한다.

 

 

6. 함수

 

1) 함수 개론

 

 - 함수(Function)

 : 프로그래밍 언어에서 함수란, 코드 뭉치.

 반복되는 코드 뭉치가 있다면 해당 코드 뭉치를 함수로 만들어서 재사용성을 높일 수 있다.

 입력 혹은 출력이 있는 경우 대부분 다 함수라고 봐도 된다.

 

 - printf() 도 함수, main() 도 함수

 : 입력으로 문자열을 받아서 화면에 출력해주는 printf() 도 함수이다.

 프로그램의 시작점 역할을 하는 main()도 함수이다.

 

 - 함수 작성 방법 [중요 샘플 코드]

반환자료형 함수명 = (매개변수자료형 매개변수명)     // 함수 선언(Declaration)이자, 정의(Definition)
{

return 반환값;
}

int main(void)
{
   int num = 10;      // 자료형 변수명 = 값;

함수명(인자값);       // 함수 호출(Call)

   return 0;
}

 

Ex060101) main() 함수

 

 - 암기 후에 main() 함수를 보면, 함수 암기 내용과 동일하다는 것을 알 수 있습니다. main() 함수의 반환자료형, 함수명, 매개자료형 매개변수명, 반환값이 뭔지 짚어봅시다.

 

주석에 설명을 적어놓았다.

 

 - 함수의 정의를 알고나니 main() 함수의 구조도 파악이 되었다. 단순 암기로 외우던 main() 함수가 이러한 구조를 가지고 있었다는 것을 알고나니 조금 더 함수와 친해진 느낌이었다.

 

 

Ex060102) PrintOneStar() 함수

 

 - 별 하나를 출력하는 함수 PrintOneStar()를 선언 및 정의하고 호출하는 소스코드를 작성해보자. 실행 결과도 확인해보자.

 

 - 잘라서 먼저 해석해보자

// 별 하나를 출력

// 함수 PrintOneStar() 선언 및 정의

// 호출

문제가 어려워도 한 문장씩 끊어서 읽으면 좀 더 쉬워진다.

 

 

Ex060103) Add() 함수 1

 

 - 두 수를 전달 받아서 그 합을 출력하는 함수 Add()를 선언 및 정의하고 호출하는 소스코드를 작성. 실행 결과도 확인해보자.

 

 - 똑같이 잘라서 해석해보자.

// 두 수를 전달받는다

// 그 합을 출력하는 함수 Add() 선언 및 정의

// 호출

 

 

Ex060104) Add() 함수 2

 

 - 두 수를 전달 받아서 그 합을 반환하는 함수 Add()를 선언 및 정의하고 호출하는 코드를 작성.

 main() 함수에서는 반환 받은 값을 int형 변수에 저장했다가 출력하는 소스코드를 작성해보자.

 실행 결과도 확인해보자.

 

// 두 수를 전달받아서

// 그 힘을 반환하는

// 함수 Add() 선언 및 정의

// 호출

// 반환 받은 값을 int형 변수에 저장

// 출력

 

오늘 C언어 강의는 여기까지이다.

 

그리고 FPS 게임을 완성하였다.

 - 따로 HP가 다 닳았을 때 게임 오버가 나오게도 구현하였다.

 - 플레이 영상

https://youtu.be/m3Jwr2QeYeA

 

 - 오늘로써 Unreal 본캠프의 CH1이 끝났다. 고작 일주일이지만 제법 많은 것을 배웠고 성장해나가는 나의 모습이 더욱 뿌듯하기만 하다. 더 많은 것을 배우고 싶다.