79


WHAT

  • 속성 + 배열 역할을 한다.

WHY

HOW


  • 클래스 내의 컬렉션을 외부에서 접근할 수 있도록 하는 역할
  • 속성 + 배열 형식
  • 딕셔너리와 같은 컬렉션으로 쓸때 진정한 힘을 발휘한다고 생각한다
  • 일급 컬렉션과 닿아있는 것 같다. 컬렉션을 래핑 했다는 점에서.
    • 하지만 불변성은?
  • 속성과의 차이가 있나?
  • 또는 클래스를 그냥 배열로 쓰는것과는?
    • 아 배열선언해도 각각 다 인스턴스화해서 써야하는구나
    • 객체를 배열처럼 접근한다는 것뿐 배열로 쓰는것은 아님
    • 인덱스를 숫자로만 쓸수 있는 배열과 달리 다른 타입으로도 가능
    • 오버로딩도 가능
// 클래스 배열의 변수
class A
{
    public int number;
}
 
A[] arr = new A[3];
**arr[0= new A();**
arr[0].number = 155;
 
// arr[1].number = 4; 이것만 쓰면 에러발생
 
arr[1= new A();
rr[1].number = 4;
  • 디박 스트링도 인덱스였음
string s = “Hello”;
char c = s[0]; //c = ‘H’
 
s가 배열이 아님에도 불구하고 배열처럼 사용하고 있다. 이것은 String 클래스가 인덱서로 구현되어 있기 때문에 가능한 것이다. 인덱서를 사용하면 string 타입처럼 객체를 배열처럼 쓰는 것이 가능해 진다는 것이다.
 
s[2] = ‘c’; //에러
이 경우 오류가 발생 하는 것은 String 인덱서가 읽기 전용으로 만들어졌기 때문
 
**[출처]** [닷넷, C# 인덱서(Indexer)](https://blog.naver.com/leejongcheol2018/221449844041)|**작성자** [풀스택개발자](https://blog.naver.com/leejongcheol2018)
[예제1 인덱서 심플 예제]
 
using System;
namespace IndexerTest
{
    class Dept
    {
        public string[] emps = new string[3];
        public string this[int i]
        {
            get { return emps[i]; }
            set { emps[i] = value; }
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            Dept d1 = new Dept();
            d1.emps[0] = "사원1"; d1.emps[1] = "사원2"; d1.emps[2] = "사원3";
 
			// 이렇게 바로 접근
            d1[0] = "사원1"; d1[1] = "사원2"; d1[2] = "사원3";
            Console.WriteLine(d1[0]);
        }
    }
}
 
[예제3 : 문자열을 첨자로 사용한 인덱서 예제]
 
using System;
using System.Collections;
 
class DayCollection
{
    string[] days = { "일", "월", "화", "수", "목", "금", "토" };
    // This method finds the day or returns -1
    private int GetDay(string testDay)
    {
        for (int j = 0; j < days.Length; j++)
        {
            if (days[j] == testDay) { return j; }
        }
        return 999;
    }
 
	public int this[string day]
    {
        get { return (GetDay(day)); }
    }
}
 
class Program
{
    static void Main(string[] args)
    {
        DayCollection week = new DayCollection();
        System.Console.WriteLine(week["일"]);   //0
        // 999 리턴        
        System.Console.WriteLine(week["Made-up Day"]);
    }
}
 
[예제4 : 일반화 프로그래밍을 이용한 인덱서 예제]
class Ojc<T>   //일반화 클래스 정의
{   
    //외부에서 접근못하도록 private으로 배열을 정의하고
    //배열의 값은 인덱스를 통해 다루도록 한다.
    //배열의 타입은 Ojc를 사용하는 시점에 정의 ==> Generic
    private T[] ojcArr = new T[10];
 
    //Generic을 이용하여 인덱서를 정의하자.
    public T this[int i]
    {
        get   //R-VALUE
        {
            return ojcArr[i];
        }
        set   //L-VALUE
        {
            ojcArr[i] = value;
        }
    }
}
 
class Program
{
    static void Main(string[] args)
    {  
        Ojc<string> ojc1 = new Ojc<string>();
        ojc1[0] = "Hello, OJC";
        //string s = ojc1[0];
        System.Console.WriteLine(ojc1[0]);
 
        Ojc<int> ojc2 = new Ojc<int>();
        ojc2[0] = 999;
        System.Console.WriteLine(ojc2[0]);
    }
}
 
[결과]
Hello, OJC
999
 
[출처] 닷넷, C# 인덱서(Indexer)|작성자 풀스택개발자