Indexer 는 객체를 배열처럼 사용할 수 있게 한다
객체가 배열이나 해쉬 테이블 처럼 복수의 값을 가지는 멤버를 가지고 있다면 이 멤버에 대한
액세스를 인덱스로 정의하면 내부 멤버를 숨긴채 배열과 유사하게 액세스 시킬 수 있다.
또한 인덱스는 오버로딩이 가능하기 때문에 서로 다른 멤버에 대한 동일한 방식의 액세스를 가능케 해 준다
* 인덱서 사용예
1. 인덱서를 구현하는 클래스

2. 인덱서 사용하기

인덱서를 사용하기 코드를 보면 객체를 배열과 유사한 형태로 사용하고 있음을 알 수 있다.
단 배열은 배열의 위치값으로 정수타입만 사용할 수 있지만 인덱스는 그에 대한 제한이 없는 차이가 있긴 한다.
* 인덱서의 특징
1. 인덱서는 정수 타입 외의 첨자를 사용할 수 있다 (배열과 다른점 이다)
2. 오버로딩 가능(인덱스 역시 메소드 이기 때문에)
3. 인덱서는 값이 아니다. 즉 인덱서는 메모리 주소를 가지지 않는다 따라서 ref나 out 키워드를 사용한 파라메타
전달을 할 수 없다
4. void 형을 사용할 수 없다(메쏘드 와의 차이점)
5. static 로 선언될수 없다
인덱서의 키워드는 this 이다. 결국 클래스가 인스턴스화(객체) 되었을 때 만이 가능한 것이다.
* string 클래스의 인덱서
닷넷 프레임워크의 string 클래스도 인덱서를 구현하고 있다. 아래와 같이 string 클래스의 인덱서를 사용 할 수 있다.
string s = "mkex";
char c = s[1];// <- 'k' 가 반환된다.
그러나 아래와 같이 값의 설정의 불가능 하다.
s[1] = "t"
String 클래스는 immutable 클래스 이다. 즉, 변경되지 않는 읽기 전용 이다.
따라서 get 인덱서만을 지원하는 것이다.
아래 처럼...
class String{
public char this[int index]{
get {
if(index < 0 || index >= Length)
throw new ArgumentOutOfRangeException();
...
}
}
}