반응형
C# Indexer는 클래스 속성(Property)에 특별한 문법인 this[ ] 를 써서 클래스 내부의 어떤 데이타를 셋팅 및 리턴을 받을 수 있게 만드는 똑똑한 배열이라고 볼 수 있습니다.
* 예제
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Indexer2
{
class IndexerClass
{
//배열 크기 기본 10
private const int index_MAX = 10;
// 내부의 정수 배열
private int[] idata = new int[index_MAX];
// 인덱서 정의.
public int this[int index]
{
get
{
if (index < 0 || index >= index_MAX)
{
throw new IndexOutOfRangeException();
}
else
{
// 배열로부터 값 리턴
return idata[index];
}
}
set
{
if (!(index < 0 || index >= index_MAX))
{
// 배열에 값 저장
idata[index] = value;
}
}
}
}
class Program
{
static void Main(string[] args)
{
IndexerClass icls = new IndexerClass();
// 인덱서 set 사용
icls[1] = 3096000;
// 인덱서 get 사용
int iValue = icls[1];
//값 확인
System.Console.WriteLine(iValue.ToString());
System.Console.WriteLine("Press the Enter key to continue.");
System.Console.ReadLine();
}
}
}
위의 예제와 같이 클래스 내부에 정수형 배열 선언과 클래스 속성에 인덱서를 정의 하여 마치 클래스 속성을
배열 처럼 사용 하여 보았습니다.
이번에는 제네릭과 인덱서를 같이 활용한 예제를 만들어 보겠습니다.
- 제네릭 클래스
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Indexer
{
class Indexer<T>
{
//T 제네릭 : 데이터 자료형에 관한 것...Ex) int, byte, String, float, double 형 등등
public T[] Items;
#region 생성자...
//기본 인덱서 클래스 내 아이템 변수 10개...
public Indexer()
{
Items = new T[10];
}
//사용자가 직접 크기 결정...
public Indexer(int iSize)
{
Items = new T[iSize];
}
#endregion
#region 속성...
//인덱서 정의...
public T this[int index]
{
get
{
return Items[index];
}
set
{
Items[index] = value;
}
}
public int FnLength
{
get
{
return Items.Length;
}
}
#endregion
}
}
- 폼 메인화면
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Indexer
{
public partial class Form1 : Form
{
Indexer<int> idList_int = new Indexer<int>();
Indexer<string> idList_Str = new Indexer<string>();
List<int> ltList_int = new List<int>();
public Form1()
{
InitializeComponent();
for (int iCount = 0; iCount < idList_int.FnLength; iCount++)
{
//인덱서를 활용한 Array
idList_int[iCount] = iCount + 1;
idList_Str[iCount] = (iCount + 1).ToString() + "Str";
//Array 계열 List 사용
ltList_int.Add(iCount + 1);
}
}
private void button1_Click(object sender, EventArgs e)
{
listBox1.Items.Clear();
listBox2.Items.Clear();
for (int iCount = 0; iCount < idList_int.FnLength; iCount++)
{
listBox1.Items.Add(idList_int[iCount]); //인덱서클래스 int 형
listBox2.Items.Add(idList_Str[iCount]); //인덱서클래스 string 형
}
listBox1.Items.Add("========================================================");
for (int jCount = 0; jCount < ltList_int.Count; jCount++)
{
listBox1.Items.Add(ltList_int[jCount]); //List 배열
}
}
}
}
위 예제에서 보듯이 제네릭과 인덱서를 같이 활용하면 List 배열 처럼 사용 할 수 있습니다.
다만 List 배열과 가장 큰 차이점은 배열의 크기가 정해지느냐 안 정해지느냐 로 볼 수 있습니다.
반응형
'C# Programming' 카테고리의 다른 글
[C#] 구조체 를 바이트 배열로 또는 바이트 배열을 구조체로 변환 (0) | 2019.09.18 |
---|---|
[C#] 크로스 스레드 (Cross Thread) 예제 (0) | 2019.09.15 |
[C#] 델리 게이트 (Delegate) - 2 델리게이트 콜백과 사용 그리고 체인 (0) | 2019.09.12 |
[C#] 델리 게이트 (Delegate) - 1 델리게이트란? , 선언 방법과 간단한 예제 (0) | 2019.09.11 |
[C#] 프로젝트(Project) 내 폼(Form) 목록 리스트(List) 읽기 및 폼(Form) 찾기 (0) | 2019.09.10 |