[Unity 입문 강좌 - 9] 유니티 배열과 반복문

유니티에서 게임 개발을 하면서 다양한 데이터를 관리하고 조작하는 일은 필수적입니다. 이때 배열을 사용하게 되는데, 이는 여러 데이터를 효율적으로 저장하고 관리할 수 있도록 도와줍니다.

 


1. Array

 

배열은 동일한 타입의 여러 요소를 순서대로 저장합니다. 배열의 크기는 생성 시 정해지며, 변경할 수 없습니다. 따라서 배열을 사용할 때는 저장하려는 데이터의 개수를 미리 알고 있어야 합니다. 배열 첫 번째 요소의 인덱스는 0, 두 번째 요소의 인덱스는 1, 세 번째 요소의 인덱스는 2, ...이러한 순서로 부여됩니다.

 

 

배열의 구조는 아래와 같습니다.

 

  • 타입 : 배열에 저장할 데이터의 타입입니다. (ex : int, float, string, GameObject..)
  • 배열 이름 : 배열의 이름입니다. 변수 이름 규칙을 따릅니다.
  • 배열 크기 : 배열에 저장할 수 있는 요소의 총 개수입니다. 배열의 크기는 선언 시에 정해지며, 나중에 변경할 수 없습니다.

 

타입[] 배열이름 = new 타입[배열크기];

 

아래는 배열에 대한 예시 코드로 int[] array = new int[5];는 크기가 5인 정수형 배열을 선언하고 초기화하는 과정입니다. 이 배열은 array[0]에서 array[4]까지, 총 5개의 정수를 저장할 수 있습니다. 배열의 각 위치에는 array[index] = value; 형태로 특정 값을 할당할 수 있습니다. 배열의 크기 보다 큰 index에 value를 할당하면 오류가 납니다. 그렇기 때문에 꼭 배열의 크기에 맞게 값을 할당해야합니다.

 

// 배열 선언과 초기화
int[] array = new int[5];
array[0] = 1;
array[1] = 2;
array[2] = 3;
array[3] = 4;
array[4] = 5;

 

for 반복문을 사용한 순회 방식에서는 배열의 길이(array.Length)를 이용하여 각 요소에 접근합니다. foreach 문을 사용하면 배열의 각 요소에 보다 간결하게 접근할 수 있습니다. 이 방식은 배열의 길이를 직접 관리할 필요가 없어 코드가 더욱 간단하고 가독성이 높아집니다. 

 

// 배열 순회
for (int i = 0; i < array.Length; i++) {
    Debug.Log(array[i]);
}

foreach (int item in array) {
    Debug.Log(item); 
}

 

배열은 고정된 크기를 가지고 있기 때문에, 일단 생성되면 실행 중에 크기를 변경하는 것이 불가능합니다. 따라서 배열에 직접적으로 요소를 추가하거나 제거하는 작업은 지원되지 않습니다. 만약 배열로 꼭 요소를 추가하거나, 제거하려면 다음과 같은 방법을 사용할 수 있습니다. 그러나, 이 방법은 효율적이지 않습니다.

 

 

요소 추가하기 : 새로운 배열을 생성하고, 기존 배열의 모든 요소를 새 배열로 복사한 다음, 새 요소를 마지막 위치에 추가합니다.

// 기존 배열
int[] array = new int[5] { 1, 2, 3, 4, 5 };
// 새로운 요소
int newElement = 6;
// 새 배열 생성: 기존 배열 길이 + 1
int[] newArray = new int[array.Length + 1];
// 기존 배열 요소를 새 배열로 복사
for (int i = 0; i < array.Length; i++) {
    newArray[i] = array[i];
}
// 새 요소 추가
newArray[newArray.Length - 1] = newElement;

 

요소 제거하기 : 새로운 배열을 생성하고, 제거하고 싶지 않은 요소만을 새 배열에 복사합니다.

// 기존 배열
int[] array = new int[5] { 1, 2, 3, 4, 5 };
// 제거할 요소의 인덱스 (예: 첫 번째 요소)
int removeIndex = 0;
// 새 배열 생성: 기존 배열 길이 - 1
int[] newArray = new int[array.Length - 1];
// 새 배열에 복사할 때 제거할 인덱스를 건너뛰기
for (int i = 0, j = 0; i < array.Length; i++) {
    if (i != removeIndex) {
        newArray[j++] = array[i];
    }
}

 


1.1 다차원 배열

 

다차원 배열은 데이터를 행렬이나 그 이상의 다차원 구조로 저장하고 관리할 수 있게 해줍니다. 유니티에서도 다차원 배열을 사용하여 더 복잡한 데이터 구조를 표현할 수 있습니다. 다차원 배열은 주로 2차원 배열과 3차원 배열을 사용합니다. 

 


1.2 2차원 배열

 

2차원 배열은 데이터를 행과 열의 형태로 구성하여 관리합니다. 예를 들어 게임 맵의 그리드나 스프레드시트 데이터를 저장할 때 사용할 수 있습니다.

 

 

  • 타입 : 배열에 저장할 데이터의 타입입니다.
  • 배열이름 : 배열의 이름입니다.
  • 행의수, 열의수 : 배열의 행과 열의 개수입니다.

 

타입[,] 배열이름 = new 타입[행의수, 열의수];

 

아래 예제에서 배열은 2행 3열의 정수를 저장할 수 있도록 했습니다.  배열의 각 위치에는 array[index, index] = value; 형태로 특정 값을 할당할 수 있습니다. 다차원 배열을 사용할 때는 반복문을 중첩하여 각 차원을 순회할 수 있습니다.

 

int[,] matrix = new int[2, 3];

matrix[0, 0] = 1; // 첫 번째 행, 첫 번째 열
matrix[0, 1] = 2; // 첫 번째 행, 두 번째 열
// 나머지 요소에도 값을 할당할 수 있습니다.

for(int i = 0; i < matrix.GetLength(0); i++) // 행을 순회
{
    for(int j = 0; j < matrix.GetLength(1); j++) // 열을 순회
    {
        Debug.Log(matrix[i, j]);
    }
}

 


1.3 3차원 배열 

 

3차원 이상의 다차원 배열도 비슷한 방식으로 선언하고 사용할 수 있습니다. 이러한 배열은 더 복잡한 데이터 구조를 표현할 때 사용됩니다. 예를 들어 3D 게임의 공간 데이터를 저장하는데 사용될 수 있습니다.

 

타입[,,] 배열이름 = new 타입[깊이, 행의수, 열의수];

 

이 배열은 2개의 깊이, 각 깊이에 3행 4열의 정수를 저장할 수 있습니다.

// 3차원 배열을 선언합니다. 예를 들어, 2x3x4 크기의 배열
int[,,] matrix3D = new int[2, 3, 4];

// 배열에 값을 할당합니다.
// 예를 들어, 첫 번째 "깊이"에 값을 할당합니다.
matrix3D[0, 0, 0] = 1;
matrix3D[0, 0, 1] = 2;
matrix3D[0, 0, 2] = 3;
matrix3D[0, 0, 3] = 4;

matrix3D[0, 1, 0] = 5;
matrix3D[0, 1, 1] = 6;
matrix3D[0, 1, 2] = 7;
matrix3D[0, 1, 3] = 8;

matrix3D[0, 2, 0] = 9;
matrix3D[0, 2, 1] = 10;
matrix3D[0, 2, 2] = 11;
matrix3D[0, 2, 3] = 12;

// 다른 "깊이"에도 유사하게 값을 할당할 수 있습니다.
// 예를 들어, 두 번째 "깊이"
// 이를 위해 반복문을 사용하는 것이 효율적입니다.

// 모든 요소를 순회하여 값을 출력합니다.
for (int i = 0; i < matrix3D.GetLength(0); i++) // 첫 번째 차원 (2)
{
    for (int j = 0; j < matrix3D.GetLength(1); j++) // 두 번째 차원 (3)
    {
        for (int k = 0; k < matrix3D.GetLength(2); k++) // 세 번째 차원 (4)
        {
            Debug.Log($"Value at ({i}, {j}, {k}) = {matrix3D[i, j, k]}");
        }
    }
}