0Pricing
C# Academy · 강의

문자열을 Span처럼 다루는 API(C# 6 에뮬레이션)

문자열을 Span처럼 다루는 방식을 에뮬레이션합니다. char[]로 변환하고 ArraySegment 로 자르며, 인덱스로 검색·트리밍·분석을 수행하고, 가장자리에서만 부분 문자열을 만듭니다.

문자열을 Span처럼 다루는 API(C# 6 에뮬레이션)은(는) CoddyKit의 무료 C# Academy 강의입니다. 이것은 3개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C# Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C# Academy 강의에는 총 3개의 강의가 포함되어 있습니다.

계열을 슬라이스로 다루는 계획

목표: C# 6에서 문자열을 span처럼 다루기라는 개념을 사용합니다.

  • 한 번만 char[]로 변환합니다.
  • ArraySegment<char>를 뷰로 사용합니다.
  • 인덱스로 트리밍, 검색, 구문 분석을 수행합니다.
  • 경계에서만 하위 문자열을 만듭니다.

문자열 위의 창

문자열을 한 번만 char[]로 변환하여 문자열 위에 창을 만들고, 이후에는 오프셋/개수로 작업합니다.

using System;

public static class StrWin
{
  public static ArraySegment<char> Window(string s, int start, int count)
  {
    if (s == null) throw new ArgumentNullException("s");
    if (start < 0 || count < 0 || start + count > s.Length) throw new ArgumentOutOfRangeException();
    // Convert once: keep char[] for further operations
    char[] buf = s.ToCharArray();
    return new ArraySegment<char>(buf, start, count);
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    string text = "  [User: Ada]  ";
    ArraySegment<char> mid = StrWin.Window(text, 2, 10); // "[User: Ada]"
    Console.WriteLine("Offset=" + mid.Offset + " Count=" + mid.Count);
  }
}

인덱스로 트리밍하기

인덱스를 사용하여 Span 기반 Trim 로직을 흉내 냅니다. 새 문자열은 만들지 않습니다.

using System;

public static class SegText
{
  public static ArraySegment<char> Trim(ArraySegment<char> seg)
  {
    int i = seg.Offset;
    int j = seg.Offset + seg.Count - 1;
    while (i <= j && Char.IsWhiteSpace(seg.Array[i])) i++;
    while (j >= i && Char.IsWhiteSpace(seg.Array[j])) j--;
    int n = (j >= i) ? (j - i + 1) : 0;
    return new ArraySegment<char>(seg.Array, i, n);
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    char[] buf = "   Hello, Ada   ".ToCharArray();
    ArraySegment<char> all = new ArraySegment<char>(buf, 0, buf.Length);
    ArraySegment<char> t = SegText.Trim(all);

    // Print without creating a new string
    for (int k = 0; k < t.Count; k++) Console.Write(t.Array[t.Offset + k]);
    Console.WriteLine();
  }
}

창 내부 검색

창 안의 상대적 위치를 반환하는 작은 IndexOf 유사 도우미를 만듭니다.

using System;

public static class SegSearch
{
  // Find the first index of a char inside the segment; returns -1 if not found.
  public static int IndexOf(ArraySegment<char> seg, char needle)
  {
    int end = seg.Offset + seg.Count;
    for (int i = seg.Offset; i < end; i++)
      if (seg.Array[i] == needle) return i - seg.Offset; // relative index
    return -1;
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    char[] buf = "[User: Ada]".ToCharArray();
    ArraySegment<char> w = new ArraySegment<char>(buf, 0, buf.Length);
    int pos = SegSearch.IndexOf(w, '/'); // 5
    Console.WriteLine("pos=" + pos);
  }
}

창에서 구문 분석하기

하위 문자열을 만들지 않고 창에서 직접 숫자를 구문 분석하여 성공 또는 실패를 반환합니다.

using System;

public static class SegParse
{
  // Try to parse a non-negative integer from the segment; returns false on failure.
  public static bool TryParseInt(ArraySegment<char> seg, out int value)
  {
    value = 0;
    if (seg.Count == 0) return false;
    int end = seg.Offset + seg.Count;
    for (int i = seg.Offset; i < end; i++)
    {
      char c = seg.Array[i];
      if (c < '0' || c > '9') return false;
      int digit = (int)(c - '0');
      // basic overflow-safe step for small inputs
      if (value > (Int32.MaxValue - digit) / 10) return false;
      value = value * 10 + digit;
    }
    return true;
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    char[] buf = "id=1203; name=Ada".ToCharArray();
    ArraySegment<char> idSeg = new ArraySegment<char>(buf, 3, 4); // "1203"
    int n;
    bool ok = SegParse.TryParseInt(idSeg, out n);
    Console.WriteLine(ok ? ("n=" + n) : "parse failed");
  }
}

경계에서 실체화하기

마지막 단계(UI/기록)에서만 새 문자열을 만들고, 내부 작업에서는 할당이 발생하지 않도록 유지합니다.

using System;

public static class SegToString
{
  public static string ToStringSegment(ArraySegment<char> seg)
  {
    // Materialize a new string only when needed (e.g., logging/output)
    return new string(seg.Array, seg.Offset, seg.Count);
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    char[] buf = "  key=value  ".ToCharArray();
    ArraySegment<char> all = new ArraySegment<char>(buf, 0, buf.Length);

    // Trim first
    int i = all.Offset, j = all.Offset + all.Count - 1;
    while (i <= j && Char.IsWhiteSpace(buf[i])) i++;
    while (j >= i && Char.IsWhiteSpace(buf[j])) j--;
    ArraySegment<char> trimmed = new ArraySegment<char>(buf, i, (j >= i) ? (j - i + 1) : 0);

    // Create string only at the end
    Console.WriteLine(SegToString.ToStringSegment(trimmed)); // "key=value"
  }
}

문자열을 span처럼 다루는 방식

빠른 확인: C# 6에서 추가 할당 없이 문자열의 일부를 분석하려면 어떻게 해야 합니까?

복습

복습: 문자열을 span처럼 다룹니다. char[] 창에서 작업하고, 트리밍/검색/구문 분석에는 오프셋/개수를 사용하며, 필요할 때만 실체화합니다.

자주 묻는 질문

“문자열을 Span처럼 다루는 API(C# 6 에뮬레이션)” 강의는 무료인가요?

네 — “문자열을 Span처럼 다루는 API(C# 6 에뮬레이션)” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C# Academy 강의 전체를 잠금 해제할 수 있습니다. C# Academy 강의에는 총 3개의 강의가 포함되어 있습니다.

“문자열을 Span처럼 다루는 API(C# 6 에뮬레이션)”에서 뭘 배우나요?

문자열을 Span처럼 다루는 방식을 에뮬레이션합니다. char[]로 변환하고 ArraySegment 로 자르며, 인덱스로 검색·트리밍·분석을 수행하고, 가장자리에서만 부분 문자열을 만듭니다. 브라우저에서 직접 실행하는 실습 코드로 C# Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

C# Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 C# Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 3개 중 3번째 강의입니다.

“문자열을 Span처럼 다루는 API(C# 6 에뮬레이션)” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 C# Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 C# Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. Span/ReadOnlySpan 기초(C# 6 에뮬레이션)
  2. Memory/ReadOnlyMemory 에뮬레이션: 복사 없는 창
  3. 문자열을 Span처럼 다루는 API(C# 6 에뮬레이션)
← C# Academy(으)로 돌아가기