C# 개발 공부 - 7일차
오늘은 데이터가 들어오고 나가는 순서가 정해져 있는 자료구조인 스택(Stack)과 큐(Queue)에 대해 정리해 보겠습니다.
스택은 데이터를 차곡차곡 쌓아 올리는 형태로 가장 마지막에 들어온 데이터가 가장 먼저 나가는 LIFO(Last In First Out, 후입선출) 구조를 가집니다.
게임 개발에서의 사용 예시:
가장 대표적인 예시는 되돌리기입니다. 플레이어의 여러 행동을 스택으로 차곡차곡 쌓고 되돌리기를 진행하면 가장 마지막 행동부터 되돌리기 때문에 스택 사용을 필수적으로 합니다.
using System.Collections.Generic; // 필수
using UnityEngine;
public class StackExample : MonoBehaviour
{
void Start()
{
// 정수형 데이터를 담는 스택 선언
Stack<int> levelStack = new Stack<int>();
}
}
Push: 스택의 가장 윗부분에 데이터를 추가합니다.
Pop: 스택의 가장 위에 있는 데이터를 꺼내면서 제거합니다.
Peek: 스택의 가장 위에 있는 데이터를 제거하지 않고 확인만 합니다.
Count: 현재 스택에 쌓여 있는 데이터의 개수를 확인합니다.
Stack<string> uiStack = new Stack<string>();
// 데이터 추가 (Push)
uiStack.Push("메인 메뉴");
uiStack.Push("설정 창");
uiStack.Push("그래픽 옵션");
// 가장 위의 데이터 확인 (Peek)
string currentUI = uiStack.Peek(); // 결과: "그래픽 옵션" (제거 안 됨)
// 데이터 꺼내기 (Pop)
string closedUI = uiStack.Pop(); // 결과: "그래픽 옵션" (제거 됨)
string nextUI = uiStack.Peek(); // 결과: "설정 창"
큐는 양쪽이 뚫린 긴 터널이나 줄을 서서 기다리는 대기열과 같습니다. 먼저 들어온 데이터가 먼저 나가는 FIFO(First In First Out, 선입선출) 구조를 가집니다.
게임 개발에서의 사용 예시:
게임 서버의 대기열 시스템이나 스킬 예약 시스템에서 자주 사용됩니다. 예를 들어, 사용자가 스킬 버튼을 순서대로 눌렀을 때 입력된 순서대로 스킬이 발동되도록 관리하거나, 대기 중인 몬스터들을 순서대로 스폰시킬 때 큐가 적합합니다.
선언 및 생성 구조:
using System.Collections.Generic;
using UnityEngine;
public class QueueExample : MonoBehaviour
{
void Start()
{
// 문자열 데이터를 담는 큐 선언
Queue<string> messageQueue = new Queue<string>();
}
}
Enqueue: 큐의 맨 뒤에 데이터를 추가합니다. (줄 서기)
Dequeue: 큐의 맨 앞에 있는 데이터를 꺼내면서 제거합니다. (나오기)
Peek: 큐의 맨 앞에 있는 데이터를 제거하지 않고 확인만 합니다.
Queue<string> monsterQueue = new Queue<string>();
// 데이터 추가 (Enqueue)
monsterQueue.Enqueue("슬라임");
monsterQueue.Enqueue("고블린");
monsterQueue.Enqueue("오크");
// 가장 앞의 데이터 확인 (Peek)
string nextMonster = monsterQueue.Peek(); // 결과: "슬라임"
// 데이터 꺼내기 (Dequeue)
string spawnMonster = monsterQueue.Dequeue(); // 결과: "슬라임" (제거 됨)
string followingMonster = monsterQueue.Peek(); // 결과: "고블린"
오늘은 특수한 순서를 가진 자료구조인 스택과 큐에 대해 배웠습니다.
스택과 큐는 게임에서도 워낙 흔하게 볼 수 있는 시스템이다보니 예시를 통해서 더욱 이해하기 쉬웠습니다.
또한, 리스트와 함께 고려하였을 때, 리스트가 자유로운 접근과 수정을 제공한다면, 스택과 큐는 데이터의 출입 순서를 강제하여 로직의 실수를 줄여주는 역할을 한다는 점에서 게임의 특정 시스템을 설계할 때 어떤 자료구조가 데이터의 흐름에 가장 자연스러운지 고민하는 과정이 중요하다는 것을 깨달았습니다.