인덱서(Indexer)

 · 2 mins read

인덱서(Indexer)

인덱서란 클래스를 배열(Array)과 같은 방식으로 원소에 접근할 수 있도록 해주는 기법입니다. C# 언어의 특징 중 하나로 인덱서를 이용하면 자료 구조를 배열처럼 간편하게 구현할 수 있습니다. 실제로도 List와 같은 기본 제공되는 자료구조는 인덱서를 구현했기 때문에 배열처럼 자료에 접근할 수 있습니다.

인덱서의 선언은 다음과 같은 형태로 합니다.

T this[int i]
{
    get { return array[i] }
    set { array[i] = value; }
}

프로퍼티와 형태가 매우 비슷한 것을 볼 수 있습니다. 인덱서도 private, internal, public 등의 한정자를 사용할 수 있고 반환하는 타입도 사용자가 정의한 타입이던 제네릭 패러미터던 어느 것을 사용해도 상관없습니다. 값을 찾는 색인 값도 배열처럼 int 정수형만 사용할 필요 없이 string이던 사용자 정의 클래스를 사용하든 상관없으며 두 개 이상을 사용해도 됩니다. 내부적으로 인덱서에 사용할 자료구조로 배열을 사용하든 List를 사용하든 상관없습니다. 심지어 그냥 상수를 반환해서 어떤 값으로 접근해도 같은 값을 반환하게 할 수도 있습니다. 사실상 이 정도면 인덱서는 this 키워드를 사용하는 프로퍼티라고 봐도 무방합니다. 프로퍼티를 잘 이해하고 있다면 인덱서에 대한 이해는 매우 쉽습니다.

using System;

class SampleCollection<T>
{
   // Declare an array to store the data elements.
   private T[] arr = new T[100];

   // Define the indexer to allow client code to use [] notation.
   public T this[int i]
   {
      get { return arr[i]; }
      set { arr[i] = value; }
   }
}

class Program
{
   static void Main()
   {
      var stringCollection = new SampleCollection<string>();
      stringCollection[0] = "Hello, World";
      Console.WriteLine(stringCollection[0]);
   }
}
// The example displays the following output:
//       Hello, World.

MSDN에서 가져온 예시는 인덱서의 사용법을 매우 간단하게 보여주고 있습니다. 제네릭 클래스에 인덱스를 적용하여 제네릭 패러미터인 T 클래스로 값을 반환하며. Main 루틴에서 string으로 타입을 선언하여 Hello World 문자열을 대입하는 것을 확인할 수 있습니다.

정리

  • 인덱서는 객체를 배열과 같은 방식으로 색인할 수 있도록 한다.
  • get 접근자는 값을 반환하고 set 접근자는 값을 할당한다.(프로퍼티와 동일)
  • this 키워드로 인덱스를 정의한다.
  • 인덱서는 정수로 색인될 필요없다. 필요하다면 특별한 메커니즘으로 색인할 수 있음.
  • 인덱서도 오버로드(Overload) 될 수 있다.
  • 인덱서는 하나 이상의 접근 패러미터를 가질 수 있다.

Reference

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/indexers/