본문 바로가기

진리는어디에/C#

[C#] System.Range

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. 같이 읽으면 좋은 글

 

유익한 글이었다면 공감(❤) 버튼 꾹!! 추가 문의 사항은 댓글로!!