- 배열 형식으로 내부 요소에 접근이 가능하다.
- 인덱스를 통하여 객체와 인스턴스 변수에 접근할 수 있다.
- 배열처럼 값에 접근할 수 있다.
장점
- 배열을 통하여서 값을 빠르게 가져올 수 있다.
- 값을 명시적으로 지정하지 않아도 된다.
단점
- 배열을 만드는 과정에서 추가적인 메모리가 사용된다.
- 인덱서로 사용하기 위한, 인덱스를 만드는데 시간이 필요하다.
인덱서 정의 방법
- 인덱서의 정의 구문
- 한정자 : 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 |