[C# 자료구조] 동적 배열(List: C++vector와 유사함) 구현
Board 클래스 안에서 List를 써보고,
그 List의 동적 배열 로직을 직접 구현하는 코드
List
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Algorithm
{
class Board
{
public int[] _data = new int[25]; //배열
public List<int> _data2 = new List<int>(); //동적 배열
public LinkedList<int> _data3 = new LinkedList<int>(); //(이중)연결 리스트
public void Initialize()
{
_data2.Add(101);
_data2.Add(102);
_data2.Add(103);
_data2.Add(104);
_data2.Add(105);
int temp = _data2[2];
_data2.RemoveAt(2); //인덱스 2번째 데이터를 삭제하라.
}
}
}
구현한 동적 배열
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Algorithm
{
class MyList<T>
{
const int DEFAULT_SIZE = 1;
T[] _data = new T[DEFAULT_SIZE];
public int Count = 0; //실제로 사용중인 데이터 개수
public int Capacity { get { return _data.Length; } }
public void Add(T item)
{
//1. 먼저 공간이 충분히 남아 있는지 확인한다.
if(Count>= Capacity)
{
//공간을 다시 늘려서 확보한다.
T[] newArray = new T[Count * 2];
for (int i = 0; i < Count; i++)
newArray[i] = _data[i];
_data = newArray;
}
//2. 공간에 데이터를 넣어준다.
_data[Count] = item;
Count++;
}
public T this[int index]
{
get { return _data[index]; }
set { _data[index] = value; }
}
public void RemoveAt(int index)
{
for (int i = index; i < Count - 1; i++)
_data[i] = _data[i + 1];
_data[Count - 1] = default(T);
Count--;
}
}
class Board
{
public int[] _data = new int[25]; //배열
public MyList<int> _data2 = new MyList<int>(); //동적 배열
public LinkedList<int> _data3 = new LinkedList<int>(); //(이중)연결 리스트
public void Initialize()
{
_data2.Add(101);
_data2.Add(102);
_data2.Add(103);
_data2.Add(104);
_data2.Add(105);
int temp = _data2[2];
_data2.RemoveAt(2); //인덱스 2번째 데이터를 삭제하라.
}
}
}
class MyList<T>
{
const int DEFAULT_SIZE = 1;
T[] _data = new T[DEFAULT_SIZE];
public int Count = 0; //실제로 사용중인 데이터 개수
public int Capacity { get { return _data.Length; } } //Capacity는 2배씩 늘도록 설정
public void Add(T item)
{
//1. 먼저 공간이 충분히 남아 있는지 확인한다.
if(Count>= Capacity)
{
//공간을 다시 늘려서 확보한다.
T[] newArray = new T[Count * 2];
for (int i = 0; i < Count; i++)
newArray[i] = _data[i];
_data = newArray;
}
//2. 공간에 데이터를 넣어준다.
_data[Count] = item;
Count++;
}
public T this[int index]
{
get { return _data[index]; }
set { _data[index] = value; }
}
public void RemoveAt(int index)
{
for (int i = index; i < Count - 1; i++)
_data[i] = _data[i + 1];
_data[Count - 1] = default(T);
Count--;
}
}
Main(중요 x)
using System;
namespace Algorithm
{
class Program
{
static void Main(string[] args)
{
Board board = new Board();
board.Initialize();
Console.CursorVisible = false;
const int WAIT_TICK = 1000 / 30;
const char CIRCLE = '\u25cf';
int lastTick = 0;
while(true)
{
#region 프레임 관리
//만약에 경과한 시간이 1/30초 보다 작다면
int currentTick = System.Environment.TickCount;
if (currentTick - lastTick < WAIT_TICK) continue;
lastTick = currentTick;
#endregion
//입력
//로직
//렌더링
Console.SetCursorPosition(0, 0);
for(int i=0; i<25; i++)
{
for(int j=0; j<25; j++)
{
Console.ForegroundColor = ConsoleColor.Green;
Console.Write(CIRCLE);
}
Console.WriteLine();
}
}
}
}
}