배열의 크기는 선언시 정해져야 하며, 크기를 변경할 수 없다. 배열 인덱스는 0부터 시작한다.
(Python에서는 List라는 개념이 배열에 해당한다.)
데이터의 집합을 관리하거나 순차적으로 처리할 때 사용된다. 배열을 통해 데이터를 쉽게 정렬하거나 반복할 수 있다. 또한 배열은 다차원 데이터를 처리하는 데에도 유용하다. 픽셀 정보를 처리하는 이미지 처리, 행렬 연산을 수행하는 수치 해석, 다차원 데이터를 처리하는 데이터 분석 등에서는 2차원, 3차원 배열이 사용된다.
대용량의 데이터를 빠르게 처리하거나 검색해야 하는 경우에도 배열이 사용될 수 있다.
C#에서 배열을 선언하는 방법이다.
type[] arrayName; //type은 배열의 데이터 타입이며, arrayName은 배열의 이름이다.
int[] intArray; //정수형 배열이다.
배열을 선언한 후에는 [NEW]키워드를 사용하여 배열을 초기화하고 그 크기를 지정해야 한다.
myArray = new int[5];
이 코드는 myArray라는 이름의 배열을 초기화하고 그 크기를 5로 지정한다.
이 배열은 5개의 정수를 저장할 수 있다는 뜻이다.
int[] myArray = new int[5]; //배열을 선언하면서 동시에 초기화하는 것도 가능하다.
int[] myArray = {1, 3, 4, 5, 14} //배열에 초기 값을 제공하면서 선언하고 초기화할 수 있다.
배열의 인덱스는 0부터 시작하며, 배열의 마지막 원소의 인덱스는 배열의 길이에서 1을 뺀 값이다.
int firstElement = myArray[0];
myArray[0] = 10; //배열의 원소를 변경하려면 인덱스를 사용하여 접근하고 새 값을 할당한다.
2차원 정수 배열을 선언하고 초기화하는 예시
int[,] my2DArray = new int[3,4]; //3행 4열의 2차원 배열을 생성한다.
접근 방법
my2DArray[1,2] = 4; //1행 2열 원소에 4를 할당
public GameObject[] enemies; // 적 게임 오브젝트 배열
void Update() {
for (int i = 0; i < enemies.Length; i++) {
// 적 게임 오브젝트들을 순회하며 각각에 대해 작업 수행 (예: 움직임)
}
}
void GenerateMap(int width, int height) {
tileMap = new GameObject[width, height];
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
// 타일 생성 및 위치 설정 코드 (생략)
}
}
}
public Item[] inventory; // 아이템 배열로 인벤토리 구현
void AddItem(Item newItem) {
for (int i = 0; i < inventory.Length; i++) {
if (inventory[i] == null) {
inventory[i] = newItem; // 첫 번째 빈 슬롯에 아이템 추가
break;
}
}
}
public int[] stats = new int[5]; // 0:체력, 1:속도, 2:공격력, 3:방어력, 4:경험치
void IncreaseStat(int statIndex, float amount) {
stats[statIndex] += amount; // 지정된 능력치 증가
}
public int[] gameData; // 게임 데이터 배열
void SaveGameData() {
// 게임 데이터 저장 (예: 체력, 점수, 레벨 등)
for (int i = 0; i < gameData.Length; i++) {
PlayerPrefs.SetInt("GameData_" + i, gameData[i]);
}
}
게임 오브젝트를 미리 생성하고 필요할 때마다 재사용하는 오브젝트 풀링 기법은 메모리 사용을 최적화하는 데 도움이 된다. 게임 플레이 도중에 오브젝트를 계속 생성하고 파괴하는 것보다 메모리 사용이 훨씬 효율적이다.
public GameObject bulletPrefab;
public int poolSize = 100;
private GameObject[] bulletPool;
void Start() {
bulletPool = new GameObject[poolSize];
for (int i = 0; i < poolSize; i++) {
bulletPool[i] = Instantiate(bulletPrefab);
bulletPool[i].SetActive(false);
}
}
public GameObject GetBullet() {
for (int i = 0; i < poolSize; i++) {
if (!bulletPool[i].activeInHierarchy) {
return bulletPool[i];
}
}
return null;
}
클래스 대신 구조체를 사용하면 참조 대신 값에 의한 복사를 통해 데이터를 저장하므로, 불필요한 메모리 할당을 줄일 수 있다.
public struct GameData {
public int score;
public int health;
}
public GameData[] gameDataArray;
게임에 자주 사용되는 복잡한 계산의 결과를 미리 계산하고 배열에 저장해 두면, 런타임 성능을 향상시킬 수 있다.
private float[] precomputedSine;
//사인함수의 값을 미리 계산해 둔다.
void Start() {
precomputedSine = new float[360];
for (int i = 0; i < 360; i++) {
precomputedSine[i] = Mathf.Sin(Mathf.Deg2Rad * i);
}
}
public float GetSine(int degree) {
return precomputedSine[degree];
}
게임 레벨이 격자나 타일 형식으로 되어 있다면, 2차원 배열을 사용해 레벨 데이터를 표현하고 관리할 수 있다. 아래는 각 타일의 타입을 저장하는 2차원 배열을 사용했다.
public enum TileType { Empty, Wall, Floor }
public TileType[,] levelData;
void LoadLevel(int width, int height) {
levelData = new TileType[width, height];
}
경로 탐색 알고리즘에서는 종종 2차원 배열을 사용해 맵 데이터를 관리한다. 예를 들어, A* 알고리즘에서는 각 타일의 비용을 저장하는 데 배열을 사용할 수 있다.
public class Node {
public int cost;
public Node parent;
}
public Node[,] grid;
void GenerateGrid(int width, int height) {
grid = new Node[width, height];
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
grid[i, j] = new Node();
}
}
}
public Node GetNode(int x, int y) {
return grid[x, y];
}
여러 사운드 클립을 관리하기 위해 배열을 사용할 수 있다. 예를 들어, 플레이어의 달리기, 점프, 피격 사운드 등을 배열에 저장해 두면 필요할 때 쉽게 재생할 수 있다.
public AudioClip[] audioClips;
private AudioSource audioSource;
void Start() {
audioSource = GetComponent<AudioSource>();
}
public void PlaySound(int clipIndex) {
audioSource.clip = audioClips[clipIndex];
audioSource.Play();
}
애니메이터 컨트롤러의 상태를 관리하기 위해 배열을 사용할 수 있다. 예를 들어, 캐릭터의 서 있음, 달리기, 점프 등의 상태를 배열에 저장하면 상태 전환을 쉽게 처리할 수 있다.
public Animator animator;
public string[] animationStates; // 예: { "Idle", "Running", "Jumping" , "Dash" , "Falling" ... etc }
void ChangeAnimationState(int stateIndex) {
animator.Play(animationStates[stateIndex]);
}