C# 언어 심화 4편 – Span과 ReadOnlySpan 고성능 처리 방법

2025. 4. 25. 13:41개발이야기

728x90
반응형

C#에서 메모리를 더욱 효율적으로 관리하기 위해 .NET에서 새롭게 추가된 Span과 ReadOnlySpan 타입을 사용할 수 있습니다. 이번 글에서는 이 두 가지 타입이 무엇이고, 어떻게 성능을 높일 수 있는지 실무 중심으로 정리해봅니다.


1. Span이란?

메모리 연속 영역에 대한 참조를 나타내는 구조체로, 배열, 문자열, 스택 메모리 등 다양한 메모리를 직접 접근하고 관리할 수 있습니다.

 Span 기본 사용법

int[] numbers = { 1, 2, 3, 4, 5 };
Span<int> spanNumbers = numbers;

spanNumbers[0] = 10;
Console.WriteLine(numbers[0]); // 출력: 10

2. ReadOnlySpan이란?

Span과 유사하지만 읽기 전용이며 변경이 불가능한 데이터를 처리할 때 사용됩니다.

 ReadOnlySpan 기본 사용법

string text = "Hello, Span!";
ReadOnlySpan<char> readOnlySpanText = text.AsSpan();

Console.WriteLine(readOnlySpanText.Slice(7, 4).ToString()); // 출력: Span

3. Span vs ReadOnlySpan 비교

항목 Span ReadOnlySpan

변경 가능 여부 가능 불가능
사용 용도 데이터를 수정할 때 사용 데이터를 읽기 전용으로 처리할 때
메모리 안전성 높음 더 높음 (읽기 전용이므로 더 안전)

4. 실전 예제: Span를 이용한 고속 문자열 처리

string text = "hello world";
Span<char> span = stackalloc char[text.Length];

text.AsSpan().ToUpperInvariant(span);
Console.WriteLine(span.ToString()); // 출력: HELLO WORLD

5. 실전 예제: ReadOnlySpan를 이용한 안전한 파싱

string dateText = "2024-05-01";
ReadOnlySpan<char> dateSpan = dateText.AsSpan();

int year = int.Parse(dateSpan.Slice(0, 4));
int month = int.Parse(dateSpan.Slice(5, 2));
int day = int.Parse(dateSpan.Slice(8, 2));

Console.WriteLine($"Year: {year}, Month: {month}, Day: {day}");
// 출력: Year: 2024, Month: 05, Day: 01

 요약

  • Span: 메모리를 직접적으로 효율적으로 관리하며 수정 가능
  • ReadOnlySpan: 메모리를 효율적이면서 안전하게 읽기 전용으로 관리
  • 고성능 애플리케이션, 데이터 파싱, 문자열 처리에 최적화된 기능

 

728x90
반응형