인덱서 (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 생략)으로 만들거나 접근자에 유효성 검사 로직을 포함할 수 있습니다. 클래스가 컬렉션을 감싸고 있거나 대괄호 표기법을 사용하는 것이 코드의 가독성을 높여줄 때 사용하기에 이상적입니다.
챌린지
쉬움배열을 다루는 것과 마찬가지로 직관적인 대괄호 표기법을 사용하여 노래에 접근할 수 있는 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()를 사용하여 업데이트 후의 모든 곡 출력
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.