본문 바로가기

ETC Programmings

C#으로 ArrayList 구현 ^^

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

문법도 익히고 C#도 손에 익힐수 있었던 시간.. 뭐 List 에 대한 자료구조는 이해하고 있었기 때문에 만드는데 그렇게 오래 걸리지는 않았다 ^^ 큭큭;;

using System;
using System.Collections.Generic;
using System.Text;

namespace List
{
    class ArrayList<T> : ListInterface<T>
    {
        private T[] dataSet;

        private int length;

        private int initSize;

        public ArrayList()
        {
            reset();
        }
        public ArrayList(int size)
        {
            this.initSize = size;
            this.dataSet = new T[initSize];
            this.length = 0;
        }

        public void add(T entry)
        {
            if (!isFull())
            {
                dataSet[length] = entry;
                length++;
            }
            else{
                expandArray();
                add(entry);
            }
        }

        private void expandArray()
        {
            this.initSize *= 2;
            T[] tempDataset = dataSet;
            dataSet = new T[initSize];
            tempDataset.CopyTo(dataSet, 0);
        }

        public void add(T entry, int index)
        {
            if (!isFull())
            {
                T tempData = dataSet[index];
                if (index < length)
                {
                    replace(entry, index);
                    index++;
                    add(tempData, index);
                }
                else
                    add(entry);
            }
        }

        public void remove(int index)
        {
            for (int i = index; i < length - 1; i++)
            {
                dataSet[i] = dataSet[i + 1];
            }
            length--;
        }
        public void replace(T newEntry, int index)
        {
            dataSet[index] = newEntry;
        }
        public T get(int index)
        {
            if (index <= length)
                return dataSet[index];
            else
                throw new Exception("리스트의 길이를 초과합니다.");
        }
        public bool isContains(T entry)
        {
            bool isContained = false;

            for (int i = 0; i < length; i++)
                if (dataSet[i].Equals(entry))
                    isContained = true;

            return isContained;
        }
        public void reset()
        {
            this.initSize = 100;
            this.dataSet = new T[initSize];
            this.length = 0;
        }
        public bool isFull()
        {
            return length == initSize;
        }
        public bool isEmpty()
        {
            return length == 0;
        }
        public int getLength()
        {
            return length;
        }
        public override string ToString()
        {
            StringBuilder sb = new StringBuilder();
           
            for(int i = 0 ; i < length ; i++)
                sb.Append("["+ dataSet[i] + "] ");
            return sb.ToString();
        }
    }
}

오버라이드를 하기 위해서 자바에서 어노테이션을 써줬던것 처럼 override라고 선언을 해줘야 한다는 점과 String 값 끼리는 연산이 되지 않는다는 점을 배웠다 'ㅅ';; 더불어 null 값은 안드로메다이다 ㅠㅠ

특히 값을 넣을때에 add 메소드에 주목할 필요가 있다.

        public void add(T entry)
        {
            if (!isFull())
            {
                dataSet[length] = entry;
                length++;
            }
            else{
                expandArray();
                add(entry);
            }
        }

        private void expandArray()
        {
            this.initSize *= 2;
            T[] tempDataset = dataSet;
            dataSet = new T[initSize];
            tempDataset.CopyTo(dataSet, 0);
        }

보통 ArrayList는 배열의 크기가 정해져 있어 일정한 갯수가 초과하면 삽입을 더이상 할수 없지만 확장 ArrayList의 개념을 써서 배열의 메모리가 넘치면 알아서 더 큰 배열을 만들어서 사용하도록 했다. 뭐 ArrayList의 단점이 여실히 들어가기는 하나 나름 잘 돌아간다.