07
13
MS 프로그래밍 가이드 : 인덱서 사용
https://docs.microsoft.com/ko-kr/dotnet/csharp/programming-guide/indexers/using-indexers

 

# 무엇인가요

 간단히 말해서 클래스 내부에 있는 특정 값들을 배열처럼 접근 가능하게 해준다. 프로퍼티와 많은 부분에서 유사.

 구문을 간소화하여 클래스와 해당 용도를 다른 개발자가 이해하기 쉽게 만든다.

 

# 사용 방법

 아래와 같이 this 키워드를 사용하여 구현.

public int this[int index]    // Indexer declaration  
{  
    // get and set accessors  
}  

프로퍼티와 비슷하게 Get과 Set을 사용한다. set은 제한적으로 사용하길 바람.

    public float this[int index]
    {
        get
        {
            return temps[index];
        }

        set
        {
            temps[index] = value;
        }
    }

 

# 주의 사항

배열처럼이라고 말했지만, 매개 변수 형식은 정수로 제한 되지않는다. 

string이든 object든 원하는 값을 함수처럼 받는다.

 

반드시 인스턴스 멤버로만 존재. static을 사용할 수 없다.

 

인덱서는 오버로드도 가능하다. (즉, 두 개 이상의 매개변수를 받을 수 있다)

 

# 사용 예시

 아래와 같이 메인 관리자가 존재할 때,

public class BGDataManager : PersistentSingleton<BGDataManager>
{
    public TalkEntity TalkEntity { get; set; }
    
    protected override void AwakeAfter()
    {
        TalkEntity = new TalkEntity();
    }
}

TalkEntity 라는 Class는 GetTalkString(string)으로 특정 값을 반환한다.

public class TalkEntity
{
    readonly Dictionary<string, string> talkTextDic = new Dictionary<string, string>();

    public string GetTalkString(string groupKey)
    {
        talkTextDic.TryGetValue(groupKey, out string talkTextSts);
        Debug.Assert(talkTextSts != null, $"키 [{groupKey}]가 존재하지않음");
        return talkTextSts;
    }
}

때문에 해당 값을 받아오기 위해서는 Manager에 접근 -> TalkEntity에 접근 -> 함수 호출의 형태로 진행된다.

var texts = BGDataManager.Inst.TalkEntity.GetTalkString(key);

 

# 인덱서를 사용하여 구현하는 경우

 아래와 같이 this 키워드를 써서 구현한다.

public class TalkEntity
{
    readonly Dictionary<string, string> talkTextDic = new Dictionary<string, string>();

    public string this[string groupKey]
    {
        get
        {
            talkTextDic.TryGetValue(groupKey, out string talkTextSts);
            Debug.Assert(talkTextSts != null, $"키 [{groupKey}]가 존재하지않음");
            return talkTextSts;
        }
    }
}    

사용하는 쪽에서는 아래와 같이 짧아졌다!

var texts = BGDataManager.Inst.TalkEntity[key];

 

COMMENT