범위를 지원하는 사용자 지정 형식
사용자 지정 형식에 Index와 Range 지원을 추가합니다.
범위를 지원하는 사용자 지정 형식은(는) CoddyKit의 무료 C# Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C# Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
인덱스와 범위를 지원하는 두 가지 방법
사용자 지정 형식에서도 Index와 Range 구문을 사용할 수 있습니다. 방법은 두 가지입니다. 명시적 인덱서를 제공하거나, Length/Count 속성과 Slice 메서드를 제공하면 됩니다.
명시적 인덱스 인덱서
System.Index를 받는 인덱서를 추가하면 ^ 연산자가 해당 형식에서 바로 작동합니다.
using System;
class Deck {
private int[] cards = { 1, 2, 3, 4, 5 };
public int this[Index i] => cards[i];
}
var d = new Deck();
Console.WriteLine(d[^1]); // 5명시적 Range 인덱서
..를 사용한 슬라이싱을 지원하려면 System.Range를 받고 원하는 슬라이스 형식을 반환하는 인덱서를 추가하세요.
using System;
class Deck {
private int[] cards = { 1, 2, 3, 4, 5 };
public int[] this[Range r] => cards[r];
}
var d = new Deck();
Console.WriteLine(string.Join(",", d[1..3])); // 2,3길이 + 슬라이스 패턴
형식에 Count 또는 Length 속성과 Slice(int start, int length) 메서드가 있으면 컴파일러가 범위 지원을 자동으로 구성할 수도 있습니다.
패턴 구현하기
여기서는 사용자 지정 버퍼가 Length와 Slice를 제공합니다. 컴파일러가 buf[1..3]을 대신 buf.Slice(1, 2)로 다시 작성합니다.
using System;
class Buffer {
private int[] data = { 10, 20, 30, 40 };
public int Length => data.Length;
public int this[int i] => data[i];
public int[] Slice(int start, int length) {
var result = new int[length];
Array.Copy(data, start, result, 0, length);
return result;
}
}
var buf = new Buffer();
Console.WriteLine(string.Join(",", buf[1..3])); // 20,30길이가 중요한 이유
Length(또는 Count) 속성이 있어야 컴파일러가 해당 형식에서 ^1과 같은 끝 기준 인덱스를 확인할 수 있습니다. 이 속성이 없으면 ^를 변환할 수 없습니다.
using System;
class Buffer {
private int[] data = { 10, 20, 30, 40 };
public int Length => data.Length;
public int this[Index i] => data[i.GetOffset(Length)];
}
var buf = new Buffer();
Console.WriteLine(buf[^1]); // 40인덱스를 수동으로 확인하기
Index 인덱서 내부에서 i.GetOffset(Length)를 호출하면 끝 기준일 수도 있는 인덱스를 일반 오프셋으로 변환할 수 있습니다.
using System;
class Ring {
private string[] items = { "a", "b", "c" };
public int Length => items.Length;
public string this[Index i] {
get {
int offset = i.GetOffset(Length);
return items[offset];
}
}
}
var r = new Ring();
Console.WriteLine(r[^2]); // b범위를 수동으로 확인하기
Range 인덱서에서는 r.GetOffsetAndLength(Length)를 사용해 복사할 시작 위치와 개수를 모두 얻을 수 있습니다.
using System;
class Ring {
private int[] items = { 1, 2, 3, 4, 5 };
public int Length => items.Length;
public int[] this[Range r] {
get {
var (start, len) = r.GetOffsetAndLength(Length);
var slice = new int[len];
Array.Copy(items, start, slice, 0, len);
return slice;
}
}
}
var r = new Ring();
Console.WriteLine(string.Join(",", r[^3..^1])); // 3,4개수와 길이 비교
이 패턴은 어느 이름이든 허용합니다. 배열과 스팬은 Length를 사용하고, List<T>는 Count를 사용합니다. 둘 중 어느 속성이든 컴파일러의 요구 사항을 충족합니다.
using System;
using System.Collections.Generic;
var list = new List<int> { 1, 2, 3, 4 };
// List<T> has Count, so Index works:
Console.WriteLine(list[^1]); // 4슬라이스 반환 형식 설계하기
Slice가 배열처럼 복사본을 반환할지, 스팬처럼 뷰를 반환할지 결정하세요. 뷰는 비용이 적지만 변경 가능한 상태를 공유하므로 선택한 방식을 문서화해야 합니다.
완전한 사용자 지정 형식
이 Sequence는 명시적 인덱서와 Length 속성을 통해 ^와 ..을 모두 지원합니다.
using System;
class Sequence {
private int[] data;
public Sequence(int[] d) => data = d;
public int Length => data.Length;
public int this[Index i] => data[i];
public int[] this[Range r] => data[r];
}
var s = new Sequence(new[] { 5, 10, 15, 20 });
Console.WriteLine(s[^1]); // 20
Console.WriteLine(string.Join(",", s[1..^1])); // 10,15빠른 확인
사용자 지정 형식에서 범위 구문을 사용할 수 있게 하는 요소를 확인해 보세요.
복습
형식에 Index/Range 지원을 추가하는 두 가지 방법을 배웠습니다.
Index와Range를 받는 명시적 인덱서Count/Length속성과Slice(int, int)를 함께 사용하는 암시적 패턴GetOffset(Length)와GetOffsetAndLength(Length)를 사용한 끝 기준 위치 확인
자주 묻는 질문
“범위를 지원하는 사용자 지정 형식” 강의는 무료인가요?
네 — “범위를 지원하는 사용자 지정 형식” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C# Academy 강의 전체를 잠금 해제할 수 있습니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“범위를 지원하는 사용자 지정 형식”에서 뭘 배우나요?
사용자 지정 형식에 Index와 Range 지원을 추가합니다. 브라우저에서 직접 실행하는 실습 코드로 C# Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
C# Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 C# Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“범위를 지원하는 사용자 지정 형식” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 C# Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 C# Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- Index 형식과 ^ 연산자
- Range 형식과 .. 연산자
- 배열과 문자열의 범위
- 범위를 지원하는 사용자 지정 형식