13.6.2 Span<T>와 stackalloc
.NET에서는 메모리 블록을 다루기 위한 몇 가지 방법을 제공한다. 배열이 가장 대표적이기는 하지만 ArraySegment<T>나 포인터를 사용할 수도 있다. 배열을 직접 사용할 때의 가장 큰 단점은 배열이 정확히 필요한 만큼만 메모리를 소유한다는 점이다. 즉, 배열을 더 큰 메모리 조각의 일부로 사용할 수 없다는 것이다. 다음과 같이 선언된 수많은 메서드 타입이 있다는 것을 고려한다면, 이것이 무슨 문제인지 이해하기 어려울 수 있다.
int ReadData(byte[] buffer, int offset, int length)
‘buffer, offset, length’와 같은 일련의 매개변수 예제는 .NET 도처에서 사용되고 있지만, 사실 효과적으로 추상화가 이루어지지 않았음을 나타내는 ‘코드의 나쁜 냄새’이기도 하다. Span<T>와 이와 관련된 타입들은 바로 이러한 문제를 해결하기 위한 것이다.
Note ≡
Span<T>를 제한적으로 사용하는 경우라면 System.Memory Nuget 패키지를 추가하는 것만으로 충분할 수 있지만, 이와 관련된 다양한 기능을 모두 사용하려면 프레임워크의 지원이 필요하다. 이 절에 포함된 코드 예제들은 .NET Core 2.1을 기반으로 작성되었다. 하지만 일부 예제들은 이전 버전의 프레임워크에서도 정상 동작할 것이다.