DynamicArray

최승원·2024년 2월 3일

DynamicArray.cs

IEnumerable 인터페이스를 상속받는 동적배열 클래스입니다.
public IEnumerator GetEnumerator()는 IEnumerable 인터페이스의 멤버입니다.

using System;
using System.Collections;

namespace Collections
{
    public class DynamicArray : IEnumerable
    {
        private static int DEFAULT_SIZE = 1;

        public int Length => _length; // get 접근자와 동일한 기능을 한다.

        public int Capacity => _items.Length; // items의 전체 길이

        private object[] _items = new object[DEFAULT_SIZE];
        private int _length; // _items의 아이템 개수


        // 삽입 알고리즘
        public void Add(object item)
        {
            if (_length == _items.Length) // 배열 공간이 부족할 시, 더 큰 배열을 만들고 아이템 복제.
            {
                object[] tmpItems = new object[_length * 2];
                Array.Copy(_items, 0, tmpItems, 0, _length);
                _items = tmpItems;
            }

            _items[_length++] = item;
        }

        // 탐색 알고리즘
        public int IndexOf(object item)
        {
            // Comparer.Default : 해당 타입의 default 비교 연산자를 가지고 비교해서 결과를 반환하는 기능을 가진 객체.
            Comparer comparer = Comparer.Default; // object 타입은 Comparer를 통해서 비교를 한다.
            for (int i = 0; i < _length; i++)
            {
                if (comparer.Compare(_items[i], item) == 0)
                {
                    return i;
                }
            }

            return -1;
        }

        // 삭제 알고리즘
        public bool Remove(object item)
        {
            int index = IndexOf(item);

            if (index < 0)
            {
                return false;
            }

            for (int i = index; i < _length - 1; i++)
            {
                _items[i] = _items[i + 1];
            }

            _length--;
            return true;
        }

        public IEnumerator GetEnumerator() // MoveNext()를 써서 그 다음 yield로 넘길 수 있는 기능을 가진 객체를 반환하는 함수,
        {
            // 아래 struct Enum과 같은 기능. yield 키워드는 결국 switch case문의 한 케이스를 줄인 것.
            // yield return 1;                // 원래라면 이 GetEnumerator() 메소드에는 아래 struct Enum을 써야하는데, yield 키워드로 줄인 것이다.
            // yield return 2;
            // yield return 3;

            for (int i = 0; i < _length; i++)
            {
                yield return _items[i];
            }
        }
    }
}
profile
안녕하세요. 최승원입니다.

0개의 댓글