반응형

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 배열과 가장 큰 차이점은 배열의 크기가 정해지느냐 안 정해지느냐 로 볼 수 있습니다.

반응형

+ Recent posts