Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C#에서 [] 연산자(인덱서)를 오버로드하는 방법

C#에서 대괄호 [] 연산자는 인덱서(Indexer)라고 부릅니다.

인덱서를 사용하면 객체를 배열처럼 인덱싱할 수 있습니다. 클래스에 인덱서를 정의하면 해당 클래스는 마치 가상 배열처럼 동작하며, 배열 접근 연산자([])를 이용해 클래스의 인스턴스에 직접 접근할 수 있습니다.

인덱서는 오버로드가 가능합니다. 또한 여러 개의 매개변수를 사용해 선언할 수 있으며, 각 매개변수는 서로 다른 타입을 가질 수도 있습니다. 즉, 인덱스가 반드시 정수(integer)일 필요는 없습니다.

예제 1: 기본적인 인덱서 구현

아래 예제에서는 this[int i] 형태로 인덱서를 정의하여, 객체를 일반 배열처럼 다루고 있습니다.

static void Main(string[] args){
    IndexerClass Team = new IndexerClass();
    Team[0] = "A";
    Team[1] = "B";
    Team[2] = "C";
    Team[3] = "D";
    Team[4] = "E";
    Team[5] = "F";
    Team[6] = "G";
    Team[7] = "H";
    Team[8] = "I";
    Team[9] = "J";
    for (int i = 0; i < 10; i++){
        Console.WriteLine(Team[i]);
    }
    Console.ReadLine();
}
class IndexerClass{
    private string[] names = new string[10];
    public string this[int i]{
        get{
            return names[i];
        } set {
            names[i] = value;
        }
    }
}

출력 결과

A
B
C
D
E
F
G
H
I
J

get 접근자는 지정된 인덱스의 값을 반환하고, set 접근자는 value 키워드를 통해 전달된 값을 해당 인덱스에 저장합니다.

예제 2: 문자열 타입으로 [] 연산자 오버로드하기

인덱서는 매개변수의 타입이 다르면 오버로드할 수 있습니다. 아래 예제에서는 정수형 인덱서에 더해, 문자열을 매개변수로 받는 인덱서를 추가로 정의했습니다. 이 문자열 인덱서는 LINQ의 WhereFirstOrDefault를 사용해 이름 목록에서 일치하는 값을 찾아 반환합니다.

static class Program{
    static void Main(string[] args){
        IndexerClass Team = new IndexerClass();
        Team[0] = "A";
        Team[1] = "B";
        Team[2] = "C";
        for (int i = 0; i < 10; i++){
            Console.WriteLine(Team[i]);
        }
        System.Console.WriteLine(Team["C"]);
        Console.ReadLine();
    }
}
class IndexerClass{
    private string[] names = new string[10];
    public string this[int i]{
        get{
            return names[i];
        }
        set{
            names[i] = value;
        }
    }
    public string this[string i]{
        get{
            return names.Where(x => x == i).FirstOrDefault();
        }
    }
}

출력 결과

A
B
C
C

위 실행 결과에서 마지막 줄의 CTeam["C"], 즉 문자열 인덱서를 통해 조회된 값입니다. 이처럼 매개변수 타입만 다르게 하면 하나의 클래스에 여러 인덱서를 자유롭게 오버로드할 수 있으며, 덕분에 객체를 훨씬 유연하고 직관적으로 다룰 수 있습니다.