목표

  • 배열에 대한 사용법을 알아보자.

Arrays

  • 배열이란 연관된 데이터를 모아서 관리하기 위해 사용하는 데이터 타입을 말한다.
  • 예를들어 0 ~ 99까지의 데이터를 변수에 담아야 한다고 가정해보자.
  • 정수형 데이터를 사용한다면 아래와 같은 형태로 저장해야 할 것이다.
int number_0 = 0;
int number_1 = 1;
int number_2 = 2;
...

int number_99 = 99;
  • 위와 같은 데이터를 효과적으로 관리하가 위하여 배열을 사용한다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Numbers : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        // 자료형 [] 변수명 = new 자료형[크기]
        int[] number = new int[100];

        // 0 ~ 99까지 입력
        for(int i = 0; i < 100; i++)
        {
            number[i] = i;
        }

        // 배열의 모든 요소 출력
        for(int i = 0; i < number.Length; i++)
        {
            Debug.Log("number : " + number[i]);
        }
    } 
}
  • 위 예제에서 알 수 있듯 배열의 Index는 0으로 시작하며, Index를 사용하여 배열의 요소에 접근할 수 있다.
  • 배열에 데이터는 최초에 정한 Size만큼 저장할 수 있으며, 만약 배열의 크기보다 많은 데이터를 넣으려고 하면 에러가 발생한다.
int[] number = new int[100];
number[100] = 100; // Index Out Of Range Exception

배열의 구조

  • 배열은 번호와 번호에 대응하는 데이터들로 이루어져 있다.

다차원 배열

  • 배열은 위와 같은 1차원 배열 이외에도, 2차원 3차원 배열로 차원을 늘려 사용할 수 있다.
  • 특별한 경우를 제외하고 3차원 이상의 배열 자료구조는 사용하지 않는 것이 좋다.

게임이나 앱등 일반적인 프로그래밍에서 3차원 이상의 자료구조가 필요하다면, 무언가 잘못 되어가고 있다는 신호이다.

  • 다음은 4,4의 크기를 가지는 2차원 배열 사용에 대한 예제이다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Numbers : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        int x = 4;
        int y = 4;

        // 자료형 [1차원 크기, 2차원 크기] 자료형 = new 자료형 [1차원크기, 2차원크기]
        int[,] number = new int[x,y];

        for(int i = 0; i < x; i++)
        {
            for(int n = 0; n < y; n++)
            {
                number[i, n] = (i * x) + (i * (y-x)) + n;
            }
        }

        for (int i = 0; i < number.GetLength(0); i++)
        {
            for (int n = 0; n < number.GetLength(1); n++)
            {
                Debug.Log("number : " + number[i, n]);
            }
        }
    }

    // Update is called once per frame
    void Update()
    {

    }
}

배열의 사용 예제

  • 다음은 Tag가 "Tree"인 GameObject를 찾아, GameObject 타입을 저장하는 배열 tress에 FindGameObjectsWithTag 결괏값을 저장하고, 각 나무들의 번호와 이름을 출력하는 예제를 작성해 보았다.
using UnityEngine;
using System.Collections;

public class Arrays : MonoBehaviour
{
    public GameObject[] trees;

    void Start ()
    {
        trees = GameObject.FindGameObjectsWithTag("Tree");

        if (trees != null)
        {
            for(int i = 0; i < trees.Length; i++)
            {
                Debug.Log(i + " : " + trees[i].name);
            }
        }
    }
}

비고

  • 크기가 정해진 데이터를 사용할때는 배열을 사용한다.
  • 하지만 크기가 정해져 있지 않고, 배열의 요소를 동적으로 삽입 삭제 해야 하는 경우는 어떻게 해야 할까?
  • 이경우 Collection을 사용하게 된다. (개인적으로 게임을 구현할 때는 Collection을 많이 사용한다.)

그림 출처 : https://www.programiz.com/c-programming/c-multi-dimensional-arrays

+ Recent posts