NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 학습
  • 매뉴얼

    학습


    C# 22. 인덱서. (Indexer)

    페이지 정보

    본문

    안녕하세요. 소심비형입니다. 오늘은 인덱서에 대해서 알아보겠습니다. C#에서 제공하는 인덱서는 속성과 유사합니다. 다른점은 이름 대신 this를 사용한다는 점입니다. 인덱서를 사용하는 목적은 클래스나 구조체를 배열 또는 컬렉션과 같은 방식으로 사용하기 위함입니다. 

     

    아래 예제는 MyList 클래스를 인덱싱하고, 값을 할당합니다. 진입점을 가진 MainApp 클래스는 MyList 인스턴스를 생성한 후 숫자값을 저장하고 출력하는 방법을 보여줍니다.

    using System;
    using System.Collections;
     
    namespace Indexer
    {
        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);
                        Console.WriteLine($"Array Resized : {array.Length}");
                    }
     
                    array[index] = value;
                }
            }
     
            public int Length
            {
                get
                {
                    return array.Length;
                }
            }
        }
        class MainApp
        {
            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]);
            }
        }
    }

     

     

    아래 예제는 제네릭을 사용하여 대표 타입을 저장하고 인덱싱할 수 있는 클래스 예제입니다.

    Program.cs

    class SampleCollection<T>
    {
        // 데이터 요소를 저장하는 배열을 선언.    
        private T[] arr = new T[100];
     
        // 클라이언트 코드는 클래스 인스턴스 자체에[] 표기법을 사용 할 수 인덱서를 정의합니다.    
        // (아래 Program클래스 Main메소드 코드의 라인 2를 참조하십시오.)            
        public T this[int i]
        {
            get
            {
                // 데이터 요소를 저장하는 제네릭 배열에 인덱스에 위치한 요소를 반환합니다.            
                return arr[i];
            }
            set
            {
                // 데이터 요소를 저장하는 제네릭 배열에지정된 위치에 어떤 형식(value)을 저장합니다.            
                arr[i] = value;
            }
        }
    }
     
    // 이 클래스는 클라이언트 코드가 인덱서를 사용하는 방법을 보여줍니다.
    class Program
    {
        static void Main(string[] args)
        {
            // 샘플 컬렉션 형식의 인스턴스를 선언합니다.        
            SampleCollection<string> stringCollection = new SampleCollection<string>();
     
            // 인덱서를 사용하려면 [] 표기법을 사용합니다.        
            stringCollection[0] = "Hello, World";
            System.Console.WriteLine(stringCollection[0]);
        }
    }
    

     

     

    인덱서는 아래와 같은 특징을 가지고 있습니다.

    • 인덱서를 사용하면 배열과 유사한 방식으로 개체를 인덱싱할 수 있습니다.

    • get접근자는 값을 반환합니다. set접근자는 값을 할당합니다.

    • this 키워드는 인덱서를 정의하는 데 사용됩니다.

    • value 키워드는 set 인덱서에서 할당하는 값을 정의하는 데 사용됩니다.

    • 인덱서는 정수 값으로 인덱싱될 필요가 없으며, 특정 조회 메커니즘을 정의하는 방법을 결정해야 합니다.

    • 인덱서는 오버로드될 수 있습니다.

    • 인덱서는 2차원 배열에 액세스하는 경우 둘 이상의 정식 매개 변수를 사용할 수 있습니다.

     

     

    인덱서는 사용하기에 따라 상당히 유용한 기술이지만, 여러가지 고려해야 할 사항이 많기도 합니다. 일반적으로 인덱서를 잘 사용하지 않는 이유는 요소를 인덱싱하기 위한 클래스 또는 구조체를 만들 때 단순히 인덱서만 정의한다고해서 완료되지 않는다는 점입니다. 이는 클라이언트가 잘못된 인덱스 값을 전달할 경우 처리해야 하는 오류들이 많고, 이런 오류들에 대해 반드시 처리해야 한다는 점입니다.

     

    예를들어 일반적으로 사용하는 배열과 컬렉션에 보면 Length와 Count를 제공하고 있고, 이를 통해 클라이언트는 OutOfRangeException을 처리해야 합니다. 이런 경우 인덱서 접근자 내에서 throw하는 모든 예외에 대해 처리해야하고 적절하게 설명할 수 있는 메시지를 반환해야 합니다.

     

    다음 시간에...

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.