본문 바로가기

개인공부/C#

[C#] 인덱서(Indexer), IEnumerable, IEnumerator

 

■ 인덱서(Indexer) :

인덱서(Indexer)는 인덱스(Index)를 사용하여 배열과 유사한 방식으로 개체에 접근할 수 있습니다.

 

 

■ Example

class IndexerSample<T>
{
    private T[] arr = new T[3];

    public T this[int idx]
    {
        get { return arr[idx]; }
        set { arr[idx] = value; }
    }

    public int Length
    {
        get { return arr.Length; }
    }
}

class Program
{
    static void Main(string[] args)
    {
        var idxString = new IndexerSample<string>();
        idxString[0] = "AA";
        idxString[1] = "BB";
        idxString[2] = "CC";
        for (int i = 0; i< idxString.Length; i++)
            Console.WriteLine($"idxString[{i}] = {idxString[i]}");
        Console.WriteLine();

        var idxInt = new IndexerSample<int>();
        for (int i = 0; i < idxInt.Length; i++)
            idxInt[i] = i*10;

        for (int i = 0; i < idxInt.Length; i++)
            Console.WriteLine($"idxInt[{i}] = {idxInt[i]}");
    }
}

 

Example 결과

 

 

■ IEnumerable :

IEnumerable은 인터페이스로 컬렉션(List, Stack , Queue 등)의 반복이 필요한 경우 사용, 컬렉션은 기본적으로 IEnumerable을 상속받고 있기 때문에 반복문(foreach)을 사용할 수 있습니다.

 - IEnumerator 객체를 반환하는 메서드 GeEnumerator()를 가지고 있습니다.

using System.Runtime.InteropServices;

namespace System.Collections
{
    public interface IEnumerable
    {
        IEnumerator GetEnumerator();
    }
}

 

■ IEnumerator :

컬렉션을 반복할 수 있도록 지원하는 인터페이스

 - Current, MoveNext, Reset 3가지 메서드를 가지고 있습니다.

  · Current : 현재 위치의 데이터

  · MoveNext : 다음 이동 할 위치에 데이터가 있으면 true, 없으면 false

  · Reset : index를 초기 위치로 이동, 보통 -1로 설정

using System.Runtime.InteropServices;

namespace System.Collections
{
    public interface IEnumerator
    {
        object Current { get; }

        bool MoveNext();
        void Reset();
    }
}

 

■ Example

class IndexerSample:IEnumerable, IEnumerator
{
    private int[] arr = new int[3];
    int position = -1;

    public int this[int idx]
    {
        get { return arr[idx]; }
        set 
        {
            if (idx >= arr.Length)
            {
                Array.Resize<int>(ref arr, idx + 1);
                Console.WriteLine($"[INFO] Array Resize : {idx}");
            }

            arr[idx] = value;
        }
    }

    public int Length
    {
        get { return arr.Length; }
    }

    public object Current   // IEnumerator 상속, 현재 위치 요소 반환
    {
        get{ return arr[position]; }
    }

    public IEnumerator GetEnumerator()  // IEnumerable 상속
    {
        for (int i = 0; i < arr.Length; i++)
            yield return arr[i];
    }

    public bool MoveNext()  // IEnumerator 상속, 다음 위치의 요소로 이동
    {
        if(position == arr.Length - 1)
        {
            Reset();
            return false;
        }

        position++;
        return (position < arr.Length);
    }

    public void Reset() // 첫 번째 요소 위치 앞으로 이동
    {
        position = -1;
    }
}

class Program
{
    static void Main(string[] args)
    {
        IndexerSample sample = new IndexerSample();
        for (int i = 0; i < 5; i++)
            sample[i] = i;

        foreach(var item in sample)
            Console.WriteLine($"[sample]: {item}");
    }
}

 

Example 결과

 

 

'개인공부 > C#' 카테고리의 다른 글

[C#] 예외(Exception)  (0) 2022.10.07
[C#] 일반화(Generalization)  (0) 2022.09.26
[C#] 컬렉션(Collection)  (0) 2022.09.23
[C#] 배열(Array)  (0) 2022.09.22
[C#] 프로퍼티(Property)  (0) 2022.09.21