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

C# 인덱서(Indexer)란 무엇인가? 개념과 사용법 완벽 정리

인덱서(Indexer)는 객체를 마치 배열처럼 인덱스를 통해 접근할 수 있도록 해주는 C#의 강력한 기능입니다. 인덱서를 사용하면 클래스나 구조체의 내부 데이터를 배열 요소에 접근하는 것과 동일한 방식으로 읽고 쓸 수 있어 코드가 훨씬 직관적이고 깔끔해집니다.

C# 인덱서의 기본 문법

인덱서는 this 키워드를 사용하여 정의하며, get 접근자와 set 접근자를 포함합니다. 기본 문법은 다음과 같습니다.

element-type this[int index] {
    // get 접근자: 지정된 인덱스의 값을 반환
    get {
        // index에 해당하는 값 반환
    }
    // set 접근자: 지정된 인덱스에 값을 설정
    set {
        // index에 해당하는 위치에 값 저장
    }
}

C# 인덱서 구현 예제

다음은 문자열 배열을 인덱서로 감싸서 객체를 배열처럼 다루는 전체 예제입니다.

using System;
namespace Demo {
    class Program {
        private string[] namelist = new string[size];
        static public int size = 10;
        public Program() {
            for (int i = 0; i < size; i++)
            namelist[i] = "N. A.";
        }
        public string this[int index] {
            get {
                string tmp;
                if( index >= 0 && index <= size-1 ) {
                    tmp = namelist[index];
                } else {
                    tmp = "";
                }
                return ( tmp );
            }
            set {
                if( index >= 0 && index <= size-1 ) {
                    namelist[index] = value;
                }
            }
        }
        static void Main(string[] args) {
            Program names = new Program();
            names[0] = "Tom";
            names[1] = "Jacob";
            names[2] = "Jack";
            names[3] = "Amy";
            names[4] = "Katy";
            names[5] = "Taylor";
            names[6] = "Brad";
            names[7] = "Scarlett";
            names[8] = "James";
            for ( int i = 0; i < Program.size; i++ ) {
                Console.WriteLine(names[i]);
            }
            Console.ReadKey();
        }
    }
}

실행 결과

위 프로그램을 실행하면 각 인덱스에 저장된 이름이 순서대로 출력됩니다. 인덱서 덕분에 names[i] 형태로 배열처럼 자연스럽게 접근할 수 있습니다.

Tom
Jacob
Jack
Amy
Katy
Taylor
Brad
Scarlett
James
N. A.

인덱서의 핵심 포인트

  • this 키워드 사용: 인덱서는 this 키워드로 선언되며, 매개변수 타입은 반드시 하나 이상 지정해야 합니다.
  • get/set 접근자: 속성(Property)과 유사하게 get으로 값을 읽고 set으로 값을 씁니다.
  • 유효성 검사 가능: 위 예제처럼 get/set 내부에서 인덱스 범위를 검사하여 잘못된 접근을 안전하게 처리할 수 있습니다.
  • 다양한 인덱스 타입: int 외에도 string 등 다른 타입을 인덱스로 사용할 수 있으며, 오버로딩도 가능합니다.

이처럼 인덱서를 활용하면 컬렉션을 감싼 클래스를 만들 때 내부 구현을 숨기면서도 배열과 같은 편리한 문법을 제공할 수 있습니다.