인덱서(C# 프로그래밍 가이드)Indexers (C# Programming Guide)

인덱서에서는 클래스나 구조체의 인스턴스를 배열처럼 인덱싱할 수 있습니다.Indexers allow instances of a class or struct to be indexed just like arrays. 인덱싱 값은 형식이나 인스턴스 멤버를 명시적으로 지정하지 않고도 설정하거나 검색할 수 있습니다.The indexed value can be set or retrieved without explicitly specifying a type or instance member. 인덱서는 해당 접근자가 매개 변수를 사용한다는 점을 제외하면 속성과 유사합니다.Indexers resemble properties except that their accessors take parameters.

다음 예제에서는 간단한 getset 접근자 메서드를 사용해서 값을 할당하거나 검색하는 제네릭 클래스를 정의합니다.The following example defines a generic class with simple get and set accessor methods to assign and retrieve values. Program 클래스는 이 클래스의 인스턴스를 만들어 문자열을 저장합니다.The Program class creates an instance of this class for storing strings.

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.

참고

추가 예제는 관련 섹션을 참조하세요.For more examples, see Related Sections.

식 본문 정의Expression Body Definitions

인덱서의 get 또는 set 접근자는 값을 반환하거나 설정하는 단일 문으로 구성되는 것이 일반적입니다.It is common for an indexer's get or set accessor to consist of a single statement that either returns or sets a value. 식 본문이 있는 멤버는 이 시나리오를 지원하기 위해 간단한 구문을 제공합니다.Expression-bodied members provide a simplified syntax to support this scenario. C# 6부터 읽기 전용 인덱서는 다음 예제와 같이 식 본문이 있는 멤버로 구현할 수 있습니다.Starting with C# 6, a read-only indexer can be implemented as an expression-bodied member, as the following example shows.

using System;

class SampleCollection<T>
{
   // Declare an array to store the data elements.
   private T[] arr = new T[100];
   int nextIndex = 0;
   
   // Define the indexer to allow client code to use [] notation.
   public T this[int i] => arr[i];
   
   public void Add(T value)
   {
      if (nextIndex >= arr.Length) 
         throw new IndexOutOfRangeException($"The collection can hold only {arr.Length} elements.");
      arr[nextIndex++] = value;
   }
}

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

=>에서 식 본문을 도입하며 get 키워드는 사용되지 않습니다.Note that => introduces the expression body, and that the get keyword is not used.

C# 7.0부터 get 및 set 접근자 모두를 식 본문 멤버로 구현할 수 있습니다.Starting with C# 7.0, both the get and set accessor can be an implemented as expression-bodied members. 이 경우 getset 키워드를 둘 다 사용해야 합니다.In this case, both get and set keywords must be used. 예:For example:

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 => 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.

인덱서 개요Indexers Overview

  • 인덱서를 사용하면 배열과 유사한 방식으로 개체를 인덱싱할 수 있습니다.Indexers enable objects to be indexed in a similar manner to arrays.

  • get 접근자는 값을 반환합니다.A get accessor returns a value. set 접근자는 값을 할당합니다.A set accessor assigns a value.

  • this 키워드는 인덱서를 정의하는 데 사용됩니다.The this keyword is used to define the indexer.

  • value 키워드는 set 인덱서에서 할당하는 값을 정의하는 데 사용됩니다.The value keyword is used to define the value being assigned by the set indexer.

  • 인덱서는 정수 값으로 인덱싱될 필요가 없으며, 특정 조회 메커니즘을 정의하는 방법을 결정해야 합니다.Indexers do not have to be indexed by an integer value; it is up to you how to define the specific look-up mechanism.

  • 인덱서는 오버로드될 수 있습니다.Indexers can be overloaded.

  • 예를 들어 인덱서는 2차원 배열에 액세스하는 경우 둘 이상의 정식 매개 변수를 사용할 수 있습니다.Indexers can have more than one formal parameter, for example, when accessing a two-dimensional array.

관련 섹션Related Sections

C# 언어 사양C# Language Specification

자세한 내용은 C# 언어 사양인덱서를 참조하세요.For more information, see Indexers in the C# Language Specification. 언어 사양은 C# 구문 및 사용법에 대 한 신뢰할 수 있는 소스 됩니다.The language specification is the definitive source for C# syntax and usage.

참고 항목See also