제로의영역

10.9 인덱서 본문

C#

10.9 인덱서

아이큐제로 2019. 11. 18. 16:08

* 본 블로그 글은 머리가 아~~~주 나쁜 왕X100초보가 프로그래밍을 공부하면서 정리를 위해 작성하는 글입니다. 잘못 정리되거나 제가 잘못 이해한 글은 이해 및 조언 부탁드립니다.

* 공부는 '이것이 C#이다' 책을 보고 하고 있습니다. 참고로 저같은 왕초보가 보기 어렵게 써져 있어서 별도의 정리 문서를 만들게 되었습니다.

 

1. 정의: 인덱스를 이용해서 객체 내의 데이터에 접근하게 해주는 프로퍼티

 * 인덱스: 데이터를 관리하기 쉽게 배열하여 놓은 목록

 * 프로퍼티: 객체나 클래스의 필드에 접근하는 수단을 제공하는 클래스의 멤버

 

2. 형식

 (1) this[ ]를 써서 프로퍼티처럼 get과 set을 정의

 (2) 클래스 내부의 리턴 데이터의 종류는 클래스 디자인 시 필요에 따라 정하게 됨. 리턴 데이타 타입도 여러가지로 지정가능.

 (3) 파라미터인 인덱스도 여러 데이터 타입을 쓸 수 있는데, 주로 int나 string 타입을 사용하여 인덱스 값을 주는 것이 일반적.

 

 class 클래스이름

 {

    한정자 인덱서형식 this[형식 index] ---------// 인덱스의 식별자가 꼭 index일 필요는 없음.

     {

        get

        {

            // index를 이용하여 내부 데이터 변환

        }

 

        set

         {

            // index를 이용하여 내부 데이터 저장

       }

    }

}

 * 인덱서는 프로퍼티처럼 식별자를 따로 가지지 않음

 * 인덱스를 통해 객체 내의 데이터에 접근하게 해줌.

 

예제1 )

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _10._9
{
    class MyList
    {
        private int[] array;

        public MyList()
        {
            array = new int[3];
        }

        public int this[int index]
        {
            get
            {
                return array[index];
            }

            set
            {
                if(index >= array.Length)
                {
                    Array.Resize<int>(ref array, index + 1);    // Array.Resize: 배열의 크기 변경, ref:참조에 의한 매개 변수 전달
                    Console.WriteLine($"Array Resized:{array.Length}");
                }

                array[index] = value;
            }
        }

        public int Length
        {
            get { return array.Length; }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            MyList list = new MyList();
            for (int i = 0; i < 5; i++)
                list[i] = i;               // 배열을 다루듯 인덱스를 통해 데이터를 입력

            for (int i = 0; i < list.Length; i++)
                Console.WriteLine(list[i]);    //데이터를 얻어올 때도 인덱스를 이용
        }
    }
}

 

실행결과

Array Resized:4
Array Resized:5
0
1
2
3
4

 

예제2)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _10._9._1
{
    class TempRecord
    {
        // Array of temperature values
        private float[] temps = new float[10] { 56.2F, 56.7F, 56.5F, 56.9F, 58.8F, 61.3F, 65.9F, 62.1F, 59.2F, 57.5F };
        
        // To enable client code to validate input
        // when accessing your indexer
        public int Length
        {
            get { return temps.Length; }
        }
        // indexer declaration
        // If index is out of range, the temps array will throw the exception.
        public float this[int index]
        {
            get
            {
                return temps[index];
            }
            set
            {
                temps[index] = value;
            }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            TempRecord tempRecord = new TempRecord();
            // Use the indexer's set accessor
            tempRecord[3] = 58.3f;
            tempRecord[5] = 60.1F;

            // Use the indexer's get accessor
            for(int i=0; i<10; i++)
            {
                System.Console.WriteLine("Element#{0}={1}", i, tempRecord[i]);
            }

            //Keep yhr vondolr einfoe oprn in debug mode.
            System.Console.WriteLine("Press any key to exit.");
            System.Console.ReadKey();
        }
    }
}

 

실행결과

Element#0=56.2
Element#1=56.7
Element#2=56.5
Element#3=58.3
Element#4=58.8
Element#5=60.1
Element#6=65.9
Element#7=62.1
Element#8=59.2
Element#9=57.5
Press any key to exit.

 

'C#' 카테고리의 다른 글

11.1 일반화 프로그래밍 & 11.2 일반화 메소드  (0) 2019.12.27
10.10 foreach가 가능한 객체 만들기  (0) 2019.12.26
10.8 컬렉션을 초기화하는 방법  (0) 2019.09.19
10.6 가변 배열  (0) 2019.08.09
10.5 다차원배열  (0) 2019.08.09