본문 바로가기
유니티/개념 정리

Indexer

by fore4022 2024. 5. 9.
  • 배열 형식으로 내부 요소에 접근이 가능하다.
  • 인덱스를 통하여 객체와 인스턴스 변수에 접근할 수 있다.
    • 배열처럼 값에 접근할 수 있다.

장점

  • 배열을 통하여서 값을 빠르게 가져올 수 있다.
  • 값을 명시적으로 지정하지 않아도 된다.

단점

  • 배열을 만드는 과정에서 추가적인 메모리가 사용된다.
  • 인덱서로 사용하기 위한, 인덱스를 만드는데 시간이 필요하다.

인덱서 정의 방법

  • 인덱서의 정의 구문
    • 한정자 : private, protected, public
    • 인덱서의 반환 타입 : 위의 예제에서는 여러가지의 자료형을 반환한다는 가정으로 최상위 클래스인 Object를 사용해 주었다.
    • this : 현재 인스턴스를 가리키는, 식별자로 사용된다.
    • 인덱스 식별자 : int, string형 인덱스
  • [한정자] (인덱서의 반환 타입) this [인덱스 식별자] 예 : public Object this [int index] { get { //데이터 반환 } set { //데이터 저장 } }
  • get또는 set만을 구현하여서, 읽기 또는 쓰기 전용으로 만들 수 있다.

왜 this로 indexer를 정의하는가?

indexer를 통해서 값을 가져와 사용하는 방법은, indexer의 클래스 인스턴스를 통해서 가져오기 때문이다.

인터페이스 인덱서

  • 한정자가 없으며, 본문 내용을 선언하지 않는다.
  • 읽기/쓰기 전용인지 정해준다.
(인덱서의 반환 타입) this [인덱스 식별자]
{
	(필요에 따라서 get 또는 set을 구현, 둘 중 하나는 구현해야함)
}
예 : 
public interface indexer
{
    string this[int index]
    {
        get;
        set;
    }
}
public class test : indexer
{
	private string[] arr = new string[10];
	public string this[int index]
	{
		get { return arr[index]; }
		set { arr[index] = value; }
	}
}

인덱서 foreach

  • 인덱서는 배열처럼 불러올 수 있지만, foreach문은 돌릴 수 없다.
  • 인덱서를 foreach문으로 돌리기 위해서는, IEnumerable를 상속 받은 객체가 사용이 가능하다.

public class main : MonoBehaviour
{
    Indexer indexer = new();
    public void Start()
    {
        indexer[0] = "a";
        indexer[1] = "b";
        indexer[2] = "c";
        indexer[3] = "d";
        indexer[4] = "e";//각 배열에 있을 값을 지정

        foreach (string str in indexer) { Debug.Log(str); }
    }
}
public class Indexer : IEnumerable, IEnumerator
{
    public string[] str = new string[5];
    private int pos;
    public string this[int index]
    {
        get { return str[index]; }
        set { str[index] = value; }
    }
		//이하 코드는 IEnumerable과 IEnumerator를 상속시켜 주면서, 선언해 주어야 하는 메서드이다.
    public object Current
    {
        get { return str[pos]; }
    }

    public void Reset() { pos = -1; }

    public bool MoveNext()
    {
        if (pos == str.Length - 1)
        {
            Reset();
            return false;
        }
        pos++;
        return (pos < str.Length);
    }

    public IEnumerator GetEnumerator() { return this; }
}
// 실행결과로는 a, b, c, d, e가 차례대로 출력된다.

'유니티 > 개념 정리' 카테고리의 다른 글

Generic  (0) 2024.07.22
New Input System  (0) 2024.07.19
대리자  (0) 2024.04.23
Type  (0) 2024.03.26
async, await란?  (0) 2024.03.21