Range란?
일반적으로 우리는 배열 연산을 사용할 때 인덱스를 이용하여 배열의 요소 하나에만 접근 했다. 하지만 C# 8.0 부터 Range를 이용해 배열의 여러 요소에 접근 할 수 있는 방법을 제공한다.
class Program
{
static void Main(string[] args)
{
string s = "ABCDEFGHIJ";
char c = s[2]; // C
string s1 = s[2..7]; // CDEFG
string s2 = s[2..^3]; // CDEFG
Console.WriteLine($"{c}, {s1}, {s2}");
}
}
8라인의 배열 접근 연산을 보면 "s[2..7]" 와 같이 낮선 문법이 보인다. 암묵적으로 Range 객체를 생성하는 문법으로써 두 개의 인덱스 사이에 점(dot) 두 개를 사용함으로써 인덱스 사이의 요소들을 접근하겠다는 의미다.
주의 할 것은, 시작 인덱스는 포함(include)이고, 마지막 인덱스는 포함하지 않는다는 것이다(exclude). 위 예를 보면 시작 인덱스는 2. 즉, C가 되고, 마지막 인덱스는 7이지만 포함하지 않으므로 결국 6, 즉, G까지, CDEFG가 리턴 된다.
9라인에서는 Index를 이용해 배열의 뒤에서 부터 접근한다. ^3이라는 것은 뒤에서 세번째 즉 H를 의미하고, H의 앞, G까지. 결국 8라인의 결과와 동일하다.
C# 8.0 부터 .. 를 이용해 배열의 범위 접근을 할 수 있다.
Range 객체 만드는 방법
- new 사용(Index)
string s = "ABCDEFGHIJ";
Range r1 = new Range(new Index(2), new Index(3, true));
Console.WriteLine(s[r1]); // CDEFG
- new 사용(정수 인덱스 사용, 암묵적으로 Index로 변환)
string s = "ABCDEFGHIJ";
Range r2 = new Range(2, ^3);
Console.WriteLine(s[r2]); // CDEFG
- 정적 메소드 사용
string s = "ABCDEFGHIJ";
Range r3 = Range.All; // All 프로퍼티, 모든 구간 리턴
Console.WriteLine(s[r3]); // ABCDEFGHIJ
Range r4 = Range.StartAt(2); // 시작 인덱스 부터 끝까지
Console.WriteLine(s[r4]); // CDEFGHIJ
Range r5 = Range.EndAt(7); // 시작 부터 끝 인덱스 까지. 마지막은 포함하지 않는 인덱스
Console.WriteLine(s[r5]); // ABCDEFG
- 단축 표기법 사용
string s = "ABCDEFGHIJ";
Range r6 = 2..7;
Console.WriteLine(s[r6]); // CDEFG
Range r7 = 2..^3;
Console.WriteLine(s[r7]); // CDEFG
Range r8 = 2..; // 시작 인덱스 부터 끝까지
Console.WriteLine(s[r8]); // CDEFGHIJ
Range r9 = ..7; // 시작 부터 끝 인덱스 까지. 마지막은 포함하지 않는 인덱스
Console.WriteLine(s[r9]); // ABCDEFG
마치며
마치는 내용 없음
부록 1. 같이 읽으면 좋은 글