Unity/자료구조

[3.29] Dynamic Array

ljw4104 2021. 3. 29. 15:53

배열이 꽉 찰때마다 크기가 2배로 늘어나는 배열

Add 연산

  1. count가 배열의 마지막 인덱스보다 같거나 큰지 확인.
  2. 더 크면 현재 배열의 크기의 2배의 새로운 임시배열을 생성. / 작으면 4번으로 바로 이동.
  3. 기존 배열의 원소를 복사 후 원래 배열이 참조하던것을 임시배열을 참조하게 함.
  4. 현재 count인덱스에 element를 넣은 후 count + 1.

Get 연산

  1. count가 배열의 길이보다 작은지 확인.
  2. 작으면 배열이 꽉차지 않았다는 것을 의미하므로 그 인덱스의 값을 리턴, 크면 배열의 인덱스를 벗어나므로 그 자료형의 기본을 리턴 후 함수 종료. ( 삼항 연산자를 사용하면 편함 )

Print 

  • 배열을 한번이라도 확장하였으면 배열을 꽉 채워서 데이터를 넣지않는 이상 무조건 뒷부분에 쓸모없는 값이 들어가 있다. 출력 때는 그것을 배재하고 출력하는 것이 좋으므로 count 변수를 이용해서 출력한다.

배열의 범용성을 높이기 위해 제너릭을 사용함. & 밖에서 접근을 쉽게 하기위해 인덱서를 사용함.

using System;

namespace Study00
{
    public class DynamicArray<T>
    {
        private T[] arr;
        private const int GROWTH_FACTOR = 2;
        private int count;

        public T this[int i]
        {
            get
            {
                return GetElement(i);
            }
            set
            {
                Add(value);
            }
        }

        public DynamicArray(int capacity = 3)
        {
            count = 0;
            arr = new T[capacity];
        }

        public void Add(T element)
        {
            if (count >= arr.Length - 1)
            {
                var temp = new T[arr.Length * GROWTH_FACTOR];
                for (int i = 0; i < arr.Length; i++)
                {
                    temp[i] = arr[i];
                }
                arr = temp;
            }

            arr[count++] = element;
        }

        public T GetElement(int index)
        {
            return count < arr.Length ? arr[index] : default(T);
        }

        public void Print()
        {
            for (int i = 0; i < count; i++)
            {
                Console.Write("arr[{0}]={1}\t", i, arr[i]);

                if ((i + 1) % 5 == 0)
                    Console.WriteLine();
            }
        }
    }
}
using System;

namespace Study00
{
    public class App
    {
        public App()
        {
            DynamicArray<int> arr = new DynamicArray<int>();
            for (int i = 0; i < 20; i++)
            {
                arr[i] = i;
            }


            arr.Print();
            Console.WriteLine();

            Console.WriteLine("arr[5] = {0}", arr[5]);
            Console.WriteLine("arr[21] = {0}", arr[21]);
        }
    }
}

5개가 출력될때마다 줄바꿈을 함. 인덱스를 벗어나는 값을 출력하는 경우 int형의 기본값인 0을 출력함.