Menu
Coddy logo textTech

인덱서 (this[])

Coddy C# 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 70개 중 37번째.

인덱서를 사용하면 배열과 같은 대괄호 표기법을 사용하여 클래스 내의 요소에 접근할 수 있습니다. collection.GetItem(0)과 같은 메서드를 호출하는 대신, 더 직관적인 collection[0]을 작성할 수 있습니다.

this 키워드와 대괄호를 사용하여 인덱서를 정의합니다:

public class Sentence
{
    private string[] words;
    
    public Sentence(string text)
    {
        words = text.Split(' ');
    }
    
    public string this[int index]
    {
        get { return words[index]; }
        set { words[index] = value; }
    }
}

이제 자연스럽게 단어에 접근할 수 있습니다:

Sentence s = new Sentence("Hello World");
Console.WriteLine(s[0]);  // Hello
s[1] = "C#";
Console.WriteLine(s[1]);  // C#

인덱서는 정수에만 국한되지 않습니다. 인덱스 매개변수로 어떠한 타입도 사용할 수 있어, 딕셔너리와 유사한 접근 방식에 유용하게 활용할 수 있습니다:

public string this[string key]
{
    get { return dictionary[key]; }
    set { dictionary[key] = value; }
}

프로퍼티와 마찬가지로, 인덱서는 읽기 전용(setter 생략)으로 만들거나 접근자에 유효성 검사 로직을 포함할 수 있습니다. 클래스가 컬렉션을 감싸고 있거나 대괄호 표기법을 사용하는 것이 코드의 가독성을 높여줄 때 사용하기에 이상적입니다.

challenge icon

챌린지

쉬움

배열을 다루는 것과 마찬가지로 직관적인 대괄호 표기법을 사용하여 노래에 접근할 수 있는 Playlist 클래스를 만들어 보겠습니다. 인덱서(indexer)를 사용하여 위치에 따라 노래를 검색하고 업데이트할 수 있는 음악 재생 목록을 만들 것입니다.

코드는 두 개의 파일로 구성됩니다:

  • Playlist.cs: Music 네임스페이스 내에 Playlist 클래스를 생성합니다. 이 클래스는 내부 노래 컬렉션을 캡슐화하고 인덱서를 통해 배열과 같은 접근 방식을 제공합니다. 재생 목록에는 다음이 포함되어야 합니다:
    • 노래 제목을 저장할 private 문자열 배열
    • 쉼표로 구분된 노래 제목 문자열을 받아 내부 배열로 분할하는 생성자
    • 특정 위치의 노래를 가져오거나(get) 설정(set)할 수 있는 this[int index] 구문을 사용한 인덱서
    • 재생 목록의 노래 개수를 반환하는 읽기 전용 속성 Count
    • 모든 노래를 " | "로 연결하여 반환하는 GetAllSongs() 메서드
  • Program.cs: 메인 파일에서 입력값으로 재생 목록을 생성한 다음, 인덱서를 사용하여 노래에 접근하고 수정합니다. 인덱스로 노래를 읽는 것과 특정 위치의 노래를 업데이트하는 것을 모두 보여주세요.

세 가지 입력을 받게 됩니다:

  • 쉼표로 구분된 노래 제목 목록 (예: Song A,Song B,Song C)
  • 검색할 인덱스 (정수)
  • 해당 인덱스의 노래를 대체할 새로운 노래 제목

출력은 다음 형식으로 출력하세요:

Total songs: {Count}
Song at index {index}: {song title}
After update: {GetAllSongs()}

예를 들어, 입력값이 Rock Anthem,Jazz Vibes,Pop Hit, 1, Blues Classic인 경우 출력은 다음과 같아야 합니다:

Total songs: 3
Song at index 1: Jazz Vibes
After update: Rock Anthem | Blues Classic | Pop Hit

인덱서를 사용하면 playlist[1]로 접근하여 "Jazz Vibes"를 가져오고, playlist[1] = "Blues Classic"을 할당하여 업데이트할 수 있습니다. 이는 GetSongAt(1)이나 SetSongAt(1, "Blues Classic")과 같은 메서드를 호출하는 것보다 훨씬 자연스럽습니다!

치트 시트

인덱서(Indexer)를 사용하면 메서드 호출 대신 배열과 같은 대괄호 표기법(collection[0])을 사용하여 클래스의 요소에 액세스할 수 있습니다.

대괄호와 함께 this 키워드를 사용하여 인덱서를 정의합니다:

public class Sentence
{
    private string[] words;
    
    public Sentence(string text)
    {
        words = text.Split(' ');
    }
    
    public string this[int index]
    {
        get { return words[index]; }
        set { words[index] = value; }
    }
}

사용 예시:

Sentence s = new Sentence("Hello World");
Console.WriteLine(s[0]);  // Hello
s[1] = "C#";
Console.WriteLine(s[1]);  // C#

인덱서는 정수뿐만 아니라 모든 타입을 인덱스 매개변수로 사용할 수 있습니다:

public string this[string key]
{
    get { return dictionary[key]; }
    set { dictionary[key] = value; }
}

속성(Property)과 마찬가지로 인덱서는 읽기 전용(setter 생략)으로 만들거나 접근자(accessor)에 유효성 검사 로직을 포함할 수 있습니다.

직접 해보기

using System;
using Music;

class Program
{
    public static void Main(string[] args)
    {
        // 입력 읽기
        string songList = Console.ReadLine();
        int index = Convert.ToInt32(Console.ReadLine());
        string newSong = Console.ReadLine();

        // TODO: songList로부터 Playlist 객체 생성

        // TODO: Count 속성을 사용하여 전체 곡 수 출력

        // TODO: 인덱서를 사용하여 지정된 index의 곡 출력

        // TODO: 인덱서를 사용하여 지정된 index의 곡 업데이트

        // TODO: GetAllSongs()를 사용하여 업데이트 후의 모든 곡 출력
    }
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨