■ 인덱서(Indexer) :
인덱서(Indexer)는 인덱스(Index)를 사용하여 배열과 유사한 방식으로 개체에 접근할 수 있습니다.
■ Example
class IndexerSample<T>
{
private T[] arr = new T[3];
public T this[int idx]
{
get { return arr[idx]; }
set { arr[idx] = value; }
}
public int Length
{
get { return arr.Length; }
}
}
class Program
{
static void Main(string[] args)
{
var idxString = new IndexerSample<string>();
idxString[0] = "AA";
idxString[1] = "BB";
idxString[2] = "CC";
for (int i = 0; i< idxString.Length; i++)
Console.WriteLine($"idxString[{i}] = {idxString[i]}");
Console.WriteLine();
var idxInt = new IndexerSample<int>();
for (int i = 0; i < idxInt.Length; i++)
idxInt[i] = i*10;
for (int i = 0; i < idxInt.Length; i++)
Console.WriteLine($"idxInt[{i}] = {idxInt[i]}");
}
}
■ IEnumerable :
IEnumerable은 인터페이스로 컬렉션(List, Stack , Queue 등)의 반복이 필요한 경우 사용, 컬렉션은 기본적으로 IEnumerable을 상속받고 있기 때문에 반복문(foreach)을 사용할 수 있습니다.
- IEnumerator 객체를 반환하는 메서드 GeEnumerator()를 가지고 있습니다.
using System.Runtime.InteropServices;
namespace System.Collections
{
public interface IEnumerable
{
IEnumerator GetEnumerator();
}
}
■ IEnumerator :
컬렉션을 반복할 수 있도록 지원하는 인터페이스
- Current, MoveNext, Reset 3가지 메서드를 가지고 있습니다.
· Current : 현재 위치의 데이터
· MoveNext : 다음 이동 할 위치에 데이터가 있으면 true, 없으면 false
· Reset : index를 초기 위치로 이동, 보통 -1로 설정
using System.Runtime.InteropServices;
namespace System.Collections
{
public interface IEnumerator
{
object Current { get; }
bool MoveNext();
void Reset();
}
}
■ Example
class IndexerSample:IEnumerable, IEnumerator
{
private int[] arr = new int[3];
int position = -1;
public int this[int idx]
{
get { return arr[idx]; }
set
{
if (idx >= arr.Length)
{
Array.Resize<int>(ref arr, idx + 1);
Console.WriteLine($"[INFO] Array Resize : {idx}");
}
arr[idx] = value;
}
}
public int Length
{
get { return arr.Length; }
}
public object Current // IEnumerator 상속, 현재 위치 요소 반환
{
get{ return arr[position]; }
}
public IEnumerator GetEnumerator() // IEnumerable 상속
{
for (int i = 0; i < arr.Length; i++)
yield return arr[i];
}
public bool MoveNext() // IEnumerator 상속, 다음 위치의 요소로 이동
{
if(position == arr.Length - 1)
{
Reset();
return false;
}
position++;
return (position < arr.Length);
}
public void Reset() // 첫 번째 요소 위치 앞으로 이동
{
position = -1;
}
}
class Program
{
static void Main(string[] args)
{
IndexerSample sample = new IndexerSample();
for (int i = 0; i < 5; i++)
sample[i] = i;
foreach(var item in sample)
Console.WriteLine($"[sample]: {item}");
}
}
'개인공부 > C#' 카테고리의 다른 글
[C#] 예외(Exception) (0) | 2022.10.07 |
---|---|
[C#] 일반화(Generalization) (0) | 2022.09.26 |
[C#] 컬렉션(Collection) (0) | 2022.09.23 |
[C#] 배열(Array) (0) | 2022.09.22 |
[C#] 프로퍼티(Property) (0) | 2022.09.21 |