0Pricing
C# Academy · 강의

인덱서

배열과 유사한 구문으로 객체에 액세스합니다.

인덱서은(는) CoddyKit의 무료 C# Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C# Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

인덱서란 무엇인가요

인덱서를 사용하면 배열처럼 [ ] 구문으로 객체에 접근할 수 있습니다. this[...]로 정의하며, 컬렉션과 같은 클래스에 적합합니다.

using System;

class Week
{
    private string[] _days = { "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun" };

    public string this[int index] => _days[index];
}

class Program
{
    static void Main()
    {
        var w = new Week();
        Console.WriteLine(w[0]);
        Console.WriteLine(w[6]);
    }
}

인덱서 구문

인덱서는 속성과 비슷하지만 this를 사용하고 대괄호 안에 매개 변수 목록을 받습니다. get을 포함하며 set은 선택 사항입니다.

using System;

class Scores
{
    private int[] _data = new int[5];

    public int this[int i]
    {
        get { return _data[i]; }
        set { _data[i] = value; }
    }
}

class Program
{
    static void Main()
    {
        var s = new Scores();
        s[0] = 90;
        s[1] = 75;
        Console.WriteLine(s[0] + ", " + s[1]);
    }
}

인덱서로 읽고 쓰기

가져오기와 설정자를 모두 사용하면 클래스가 내부 저장 공간을 제어하면서 배열처럼 요소를 할당하고 읽을 수 있습니다.

using System;

class Grid
{
    private int[] _cells = new int[3];

    public int this[int i]
    {
        get => _cells[i];
        set => _cells[i] = value;
    }
}

class Program
{
    static void Main()
    {
        var g = new Grid();
        for (int i = 0; i < 3; i++) g[i] = i * 10;
        Console.WriteLine(g[0] + ", " + g[1] + ", " + g[2]);
    }
}

인덱서에서 유효성 검사하기

인덱서는 단순히 코드이므로 인덱스를 검증하고 범위를 벗어난 접근에 대해 명확한 오류를 발생시킬 수 있습니다.

using System;

class SafeList
{
    private int[] _data = new int[3];

    public int this[int i]
    {
        get
        {
            if (i < 0 || i >= _data.Length)
                throw new IndexOutOfRangeException("Bad index: " + i);
            return _data[i];
        }
        set { _data[i] = value; }
    }
}

class Program
{
    static void Main()
    {
        var list = new SafeList();
        list[1] = 42;
        Console.WriteLine(list[1]);
    }
}

문자열 키 인덱서

인덱서 매개 변수는 int로 제한되지 않습니다. string 키를 사용하면 클래스를 사전과 같은 조회 기능으로 만들 수 있습니다.

using System;
using System.Collections.Generic;

class Config
{
    private Dictionary<string, string> _map = new Dictionary<string, string>();

    public string this[string key]
    {
        get => _map.ContainsKey(key) ? _map[key] : "(none)";
        set => _map[key] = value;
    }
}

class Program
{
    static void Main()
    {
        var c = new Config();
        c["theme"] = "dark";
        Console.WriteLine(c["theme"]);
        Console.WriteLine(c["missing"]);
    }
}

여러 매개 변수

인덱서는 둘 이상의 매개 변수를 받을 수 있으므로 matrix[row, col]처럼 접근하는 Matrix나 2차원 Grid에 적합합니다.

using System;

class Matrix
{
    private int[,] _data = new int[2, 2];

    public int this[int row, int col]
    {
        get => _data[row, col];
        set => _data[row, col] = value;
    }
}

class Program
{
    static void Main()
    {
        var m = new Matrix();
        m[0, 0] = 1;
        m[1, 1] = 9;
        Console.WriteLine(m[0, 0] + ", " + m[1, 1]);
    }
}

읽기 전용 인덱서

설정자를 생략하면 읽기 전용 인덱서가 되어 외부에서 수정하지 못하도록 하면서 데이터를 노출할 수 있습니다.

using System;

class Fibonacci
{
    public int this[int n]
    {
        get
        {
            int a = 0, bv = 1;
            for (int i = 0; i < n; i++)
            {
                int t = a + bv;
                a = bv;
                bv = t;
            }
            return a;
        }
    }
}

class Program
{
    static void Main()
    {
        var fib = new Fibonacci();
        Console.WriteLine(fib[7]);
    }
}

인덱서와 속성 비교

속성은 이름(obj.Name)으로 접근하고 인덱서는 키(obj[key])로 접근합니다. 객체가 컬렉션처럼 동작할 때 인덱서를 사용하세요.

using System;

class Inventory
{
    private int[] _stock = new int[4];
    public int Total => _stock.Length;          // property
    public int this[int slot]                    // indexer
    {
        get => _stock[slot];
        set => _stock[slot] = value;
    }
}

class Program
{
    static void Main()
    {
        var inv = new Inventory();
        inv[2] = 15;
        Console.WriteLine("Slot 2: " + inv[2] + ", Total slots: " + inv.Total);
    }
}

오버로드된 인덱서

매개 변수 형식이 서로 다른 여러 인덱서를 정의할 수 있으며, 컴파일러가 인수에 맞는 인덱서를 선택합니다.

using System;
using System.Collections.Generic;

class People
{
    private List<string> _names = new List<string> { "Ann", "Bob", "Cara" };

    public string this[int i] => _names[i];
    public int this[string name] => _names.IndexOf(name);
}

class Program
{
    static void Main()
    {
        var p = new People();
        Console.WriteLine(p[1]);
        Console.WriteLine(p["Cara"]);
    }
}

인덱스로 접근하는 객체 반복하기

인덱서와 개수 속성을 결합하면 사용자 지정 컬렉션을 자연스럽게 반복할 수 있습니다.

using System;

class Ring
{
    private int[] _data = { 10, 20, 30 };
    public int Count => _data.Length;
    public int this[int i] => _data[i % _data.Length];
}

class Program
{
    static void Main()
    {
        var ring = new Ring();
        for (int i = 0; i < 5; i++)
            Console.Write(ring[i] + " ");
        Console.WriteLine();
    }
}

종합하기

인덱서를 사용하면 래퍼 클래스가 기본 컬렉션처럼 느껴지며, 익숙한 대괄호 구문 뒤에 저장 세부 정보를 숨길 수 있습니다.

using System;
using System.Collections.Generic;

class Phonebook
{
    private Dictionary<string, string> _book = new Dictionary<string, string>();

    public string this[string name]
    {
        get => _book.TryGetValue(name, out var num) ? num : "unknown";
        set => _book[name] = value;
    }
}

class Program
{
    static void Main()
    {
        var pb = new Phonebook();
        pb["Alice"] = "555-1234";
        Console.WriteLine("Alice: " + pb["Alice"]);
        Console.WriteLine("Zed: " + pb["Zed"]);
    }
}

간단한 확인

인덱서에 대한 이해도를 확인해 보세요.

복습

인덱서는 this[...]를 사용해 클래스에 배열과 같은 접근 방식을 제공합니다. get/set, 모든 매개 변수 형식(int, 문자열, 여러 매개 변수), 유효성 검사, 오버로드 및 읽기 전용 형식을 지원합니다. 컬렉션과 같은 클래스에는 인덱서를 사용하고, 서로 구별되는 특성에는 이름이 있는 속성을 사용하세요.

using System;

class Demo
{
    private int[] _v = new int[3];
    public int this[int i]
    {
        get => _v[i];
        set => _v[i] = value;
    }
}

class Program
{
    static void Main()
    {
        var d = new Demo();
        d[0] = 100;
        Console.WriteLine(d[0]);
    }
}

자주 묻는 질문

“인덱서” 강의는 무료인가요?

네 — “인덱서” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C# Academy 강의 전체를 잠금 해제할 수 있습니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“인덱서”에서 뭘 배우나요?

배열과 유사한 구문으로 객체에 액세스합니다. 브라우저에서 직접 실행하는 실습 코드로 C# Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

C# Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 C# Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“인덱서” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 C# Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 C# Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 자동 구현 속성
  2. 백업 필드를 사용하는 전체 속성
  3. 식 본문 멤버
  4. 인덱서
← C# Academy(으)로 돌아가기