인덱서(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 등 다른 타입을 인덱스로 사용할 수 있으며, 오버로딩도 가능합니다.
이처럼 인덱서를 활용하면 컬렉션을 감싼 클래스를 만들 때 내부 구현을 숨기면서도 배열과 같은 편리한 문법을 제공할 수 있습니다.