1. 개념 설명
Span<T>는 연속된 메모리를 가리키는 stack-only 타입으로, 배열·문자열 등의 일부를 할당 없이 슬라이스할 수 있습니다. Memory<T>는 같은 메모리를 heap에서 안전하게 보관할 수 있어 필드·비동기 경계에서도 사용할 수 있습니다. 필요 시 Memory<T>.Span으로 실제 접근을 수행하고, ReadOnlySpan<char>로 문자열 처리 비용을 줄일 수 있습니다.
2. 코드 예제
아래 예제는 배열을 슬라이스해 값을 수정하고, Memory<T>로 부분 합을 계산하며, 문자열에서 ReadOnlySpan<char>로 부분을 추출합니다. Console.WriteLine으로 결과를 확인합니다.
using System;
class Program
{
static int Sum(Memory data)
{
var span = data.Span;
int total = 0;
foreach (var v in span) total += v;
return total;
}
static void Main()
{
int[] arr = { 1, 2, 3, 4, 5 };
Span s = arr.AsSpan(1, 3);
s[0] = 99;
Console.WriteLine(string.Join(",", arr)); // 1,99,3,4,5
var mem = new Memory(arr);
var slice = mem.Slice(2, 2);
Console.WriteLine(Sum(slice)); // 7
string text = "Hello Span/Memory";
ReadOnlySpan part = text.AsSpan(6, 4);
Console.WriteLine(part.ToString()); // Span
}
}
실행 결과는 "1,99,3,4,5", 합계 "7", 그리고 문자열 "Span"이 출력됩니다. 배열 변경은 Span<T>가 원본을 직접 참조함을 보여주며, Memory<T>는 안전하게 전달·보관 후 .Span으로 처리합니다.
3. 주의사항/팁
Span<T>는 ref struct이므로 필드로 보관하거나 async/iterator 경계, 람다 캡처에 사용할 수 없습니다. 장기간 보관·비동기 처리에는 Memory<T>를 사용하고, 필요할 때만 .Span으로 변환해 최소 범위에서 연산하세요. 문자열 출력 시 ToString()은 할당이 발생하므로 가능하면 Console.WriteLine(ReadOnlySpan<char>) 지원 환경에서는 직접 전달하는 것이 좋습니다.
'C#' 카테고리의 다른 글
| C# 튜플 (Tuple)과 분해 (0) | 2026.04.08 |
|---|---|
| C# IEnumerable vs IQueryable (0) | 2026.04.07 |
| C# Switch 표현식 (Switch Expression) (0) | 2026.04.07 |
| C# Task와 Task<T> 사용법 (0) | 2026.04.06 |
| C# JSON 직렬화 System.Text.Json (0) | 2026.04.06 |