인덱서(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/