[ 최종 구현(C#) ]
using System;
using System.Collections.Generic;
namespace Test
{
    public class MyList<T>
    {
        private static int DEFAULT_SIZE = 1;
        private T[] Data = new T[DEFAULT_SIZE];
        public int Count { get; private set; } = 0;    // 현재 저장되어있는 개수
        public int Capacity // 최대로 저장 가능한 용량
        {
            get
            {
                return Data.Length;
            }
        }
        public void Add(T item)
        {
            // 공간이 없을 경우 공간을 확보한다 = 현재 공간 * 2
            if(Count >= Capacity)
            {
                T[] newData = new T[Capacity * 2];
                // 기존 데이터 이사
                for (int i = 0; i < Count; i++)
                    newData[i] = Data[i];
                Data = newData;
            }
            Data[Count++] = item;
        }
        public void RemoveAt(int index) // 해당 인덱스에 있는 데이터 제거
        {
            // 지우려는 인덱스를 기준으로 뒤의 데이터를 하나씩 땡겨온다.
            for (int i = index; i < Count-1; i++)
            {
                Data[i] = Data[i + 1];
            }
            Data[Count - 1] = default;  // 지운 데이터 초기화
            Count--;
        }
        public T this[int index]
        {
            get
            {
                return Data[index];
            }
            set
            {
                Data[index] = value;
            }
        }
    }
    class Program
    { 
        static void Main(string[] args)
        {
            MyList<int> data = new MyList<int>();
            data.Add(1);
            data.Add(2);
            data.Add(3);
            data.Add(4);
            data.Add(5);
            for(int i = 0; i < data.Count; i++)
                Console.WriteLine(data[i]);
            data.RemoveAt(3); // 4가 지워져야 한다.
            for (int i = 0; i < data.Count; i++)
                Console.WriteLine(data[i]);
            data.RemoveAt(2); // 3이 지워져야 한다.
            for (int i = 0; i < data.Count; i++)
                Console.WriteLine(data[i]);
        }
    }
}