문자열을 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처럼 다루는 방식
복습
복습: 문자열을 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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- Span/ReadOnlySpan 기초(C# 6 에뮬레이션)
- Memory/ReadOnlyMemory 에뮬레이션: 복사 없는 창
- 문자열을 Span처럼 다루는 API(C# 6 에뮬레이션)