배열(Array)은 일련의 동일한 타입의 원소로 구성된 데이터 구조이다. 하지만 배열을 사용하면서 겪게 되는 몇 가지 한계와 제약 사항이 있다.
scores
배열은 크기가 10으로 고정되어 있다. using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ScoreManager : MonoBehaviour
{
public int[] scores = new int[10];
private int index = 0;
void Update()
{
if(Input.GetMouseButtonDown(0))
{
scores[index] = Random.Range(0, 100);
index++;
}
}
}
object[] mixedArray = new object[] { 1, "string", true }; // 다양한 타입을 저장
메모리 할당: 배열은 연속적인 메모리 공간에 할당되므로, 큰 크기의 배열을 생성할 때 메모리 부족 문제가 발생할 수 있다.
인덱스 오버플로우: 위의 샘플 코드에서 index
를 배열의 크기보다 큰 값으로 증가시키면 인덱스 오버플로우 문제가 발생한다. 이러한 문제는 런타임 에러를 유발하며, 디버깅이 어렵다.
이러한 한계와 제약 사항 때문에 배열은 정적인 데이터 구조로 사용되며, 동적인 요구사항에는 적합하지 않다.
리스트(List)는 동적 배열로, 배열의 한계를 극복한 데이터 구조이다. C#에서는 System.Collections.Generic
네임스페이스의 List<T>
클래스를 사용하여 리스트를 구현한다.
동적 크기: 리스트는 동적으로 크기를 조절할 수 있다. 즉, 원소를 추가하거나 제거하는 동작이 자유롭다.
타입 안정성: 제네릭 타입 T
를 사용하여 리스트를 선언하면, 해당 타입의 원소만 추가할 수 있다. 이로 인해 타입 안정성이 높아진다.
메서드 다양성: 리스트는 원소를 추가(Add
), 검색(Find
, IndexOf
), 정렬(Sort
), 제거(Remove
, RemoveAt
) 등 다양한 메서드를 제공한다.
아래는 Unity에서 C#으로 리스트를 사용하는 예시 코드이다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ScoreManager : MonoBehaviour
{
public List<int> scores = new List<int>();
void Update()
{
if(Input.GetMouseButtonDown(0))
{
int randomNumber = Random.Range(0, 100);
scores.Add(randomNumber);
}
}
}
randomNumber
를 리스트에 추가한다. 이 메서드를 통해 리스트의 크기는 동적으로 늘어난다.이러한 특성 덕분에 리스트는 동적인 요구사항에 적합하다.
리스트에서 원소를 제거하는 것은 게임 개발에서 자주 발생하는 시나리오 중 하나이다. 예를 들면, 아이템을 사용하거나 몬스터를 처치할 때 해당 아이템이나 몬스터를 게임에서 제거해야 할 수 있다. 리스트에서 원소를 제거하는 방법은 크게 두 가지가 있다.
인덱스를 이용한 제거: RemoveAt
메서드를 사용하여 특정 인덱스의 원소를 제거할 수 있다. 이 방법은 원소의 위치를 정확히 알고 있을 때 유용하다.
값을 이용한 제거: Remove
메서드를 사용하여 특정 값을 가진 첫 번째 원소를 제거할 수 있다. 이 방법은 원소의 위치를 모르지만, 값을 알고 있을 때 유용하다.
아래는 Unity에서 리스트의 원소를 제거하는 예제 코드이다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ScoreManager : MonoBehaviour
{
public List<int> scores = new List<int>();
void Start()
{
while(scores.Count > 0)
{
scores.RemoveAt(0);
}
}
}
이 예제에서는 Start
메서드에서 리스트 scores
의 모든 원소를 제거하는 작업을 수행한다. RemoveAt
메서드를 사용하여 인덱스 0의 원소를 계속 제거하고, scores.Count
로 리스트가 비어있는지 확인한다. 리스트가 비어있지 않다면 계속해서 첫 번째 원소를 제거한다.
배열의 한계와 제약사항: 배열은 고정된 크기와 유형을 가지며, 크기를 동적으로 변경할 수 없다는 제약이 있다.
리스트의 정의와 특성: 리스트는 동적 배열이며, 원소의 추가 및 삭제가 유연하다. 또한 제네릭을 이용해 다양한 유형을 저장할 수 있다.
리스트 사용의 장점: 리스트는 동적으로 크기가 변경되고, 다양한 메서드를 통해 데이터를 쉽게 관리할 수 있다.
리스트에서 원소 제거하기: Remove
와 RemoveAt
메서드를 사용하여 리스트의 원소를 특정 조건에 따라 제거할 수 있다.