C# 프로그래밍

[C#] 인덱서

같은편 2023. 2. 24. 15:39

C# 인덱서(Indexer)는 객체의 인스턴스 변수에 대한 배열 형태의 접근 방법을 제공합니다. 인덱서를 사용하면 객체의 내부 변수에 대해 배열과 같은 방식으로 접근할 수 있습니다.

 

인덱서는 다음과 같은 형식으로 정의됩니다.

public returnType this[parameters]
{
    get { /* 인덱서를 읽을 때 수행되는 코드 */ }
    set { /* 인덱서에 쓸 때 수행되는 코드 */ }
}

위 코드에서 returnType은 인덱서가 반환하는 값의 자료형이며, parameters는 인덱서의 매개변수입니다. get 블록은 인덱서를 읽을 때 호출되며, set 블록은 인덱서에 값을 할당할 때 호출됩니다.


예를 들어, 다음은 인덱서를 사용한 클래스의 예입니다.

class MyArray
{
    private int[] array = new int[10];

    public int this[int index]
    {
        get
        {
            return array[index];
        }
        set
        {
            array[index] = value;
        }
    }
}

위 클래스는 10개의 정수를 저장하는 배열을 인덱서를 이용해 접근할 수 있도록 구현한 예입니다. MyArray 클래스의 인스턴스 변수에 접근할 때 다음과 같은 방식으로 인덱서를 사용할 수 있습니다.

MyArray arr = new MyArray();
arr[0] = 1;
int val = arr[0];

위 코드에서 arr[0]은 인덱서를 호출하는 코드입니다. 이 코드는 내부적으로 MyArray 클래스의 인덱서를 호출하여, 배열의 0번째 인덱스에 값을 할당하거나 값을 반환합니다.

 

인덱서를 사용하면 객체의 내부 변수에 대한 접근을 배열과 같은 방식으로 편리하게 할 수 있습니다. 이를 이용해 다양한 데이터 구조를 구현할 수 있습니다.

 


추가로, 인덱서를 통해 데이터를 저장하고자 할 때, 지정한 인덱서보다 배열의 크기가 작을 때 인덱스에 맞춰 배열의 크기를 재조정하는 코드입니다.

class MyArray
{
    private int[] array;
    
    public MyArray() // 생성자
    {
        array = new int[3];
    }
    
    public int this[int index]
    {
        get
        {
            return array[index];
        }
        set
        {
            if( index >= array.Length )
            {
                //Array 클래스 안에 일반화 메소드인 Resize 메소드를 이용해서
                //매개변수로 array 배열을 pass by reference를 하고
                //array 배열 사이즈를 index + 1 만큼 변경하는 코드
                Array.Resize<int>(ref array, index + 1);
        }
    }
}