Unity/자료구조
[3.29] Dynamic Array
ljw4104
2021. 3. 29. 15:53
배열이 꽉 찰때마다 크기가 2배로 늘어나는 배열
Add 연산
- count가 배열의 마지막 인덱스보다 같거나 큰지 확인.
- 더 크면 현재 배열의 크기의 2배의 새로운 임시배열을 생성. / 작으면 4번으로 바로 이동.
- 기존 배열의 원소를 복사 후 원래 배열이 참조하던것을 임시배열을 참조하게 함.
- 현재 count인덱스에 element를 넣은 후 count + 1.
Get 연산
- count가 배열의 길이보다 작은지 확인.
- 작으면 배열이 꽉차지 않았다는 것을 의미하므로 그 인덱스의 값을 리턴, 크면 배열의 인덱스를 벗어나므로 그 자료형의 기본을 리턴 후 함수 종료. ( 삼항 연산자를 사용하면 편함 )
- 배열을 한번이라도 확장하였으면 배열을 꽉 채워서 데이터를 넣지않는 이상 무조건 뒷부분에 쓸모없는 값이 들어가 있다. 출력 때는 그것을 배재하고 출력하는 것이 좋으므로 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]);
}
}
}