C#

[문법] ReadOnlySpan<char> 자료형

CCS_Cheese 2025. 8. 12. 19:22

int.Parse()

 

[문법] String To int Parser

2025.07.10 - [코딩테스트] - [PCCP 기출문제] 1번 / 동영상 재생기 위 코딩 테스트 문제를 풀면서 아쉬웠던 문법들에 대해 알아보는 시간을 가지고자 글을 작성하게 되었습니다. C# 공식문서 문자열을

develophyun.tistory.com

 

이전 String To int Parser 관련하여 정리한 글 안에서 ReadOnlySpan <char> 구조체에 대한 정보를 정리해보려고 합니다.

 

이름만 보았을 때는 뭔가 ReadOnly에서 읽기 전용이라는 의미를 뜻하고 있습니다. 관련 공식 문서를 아래에 링크해 두도록 하겠습니다.

 

ReadOnlySpan <char> 정의부

public readonly ref struct ReadOnlySpan<T>
{
    public ReadOnlySpan(T[] array);
    [CLSCompliant(false)]
    public ReadOnlySpan(void* pointer, int length);
    public ReadOnlySpan(T[] array, int start, int length);

    public ref readonly T this[int index] { get; }

    public static ReadOnlySpan<T> Empty { get; }
    public int Length { get; }
    public bool IsEmpty { get; }

    public void CopyTo(Span<T> destination);
    [EditorBrowsable(EditorBrowsableState.Never)]
    [Obsolete("Equals() on ReadOnlySpan will always throw an exception. Use == instead.")]
    public override bool Equals(object obj);
    public Enumerator GetEnumerator();
    [EditorBrowsable(EditorBrowsableState.Never)]
    [Obsolete("GetHashCode() on ReadOnlySpan will always throw an exception.")]
    public override int GetHashCode();
    [EditorBrowsable(EditorBrowsableState.Never)]
    public ref readonly T GetPinnableReference();
    public ReadOnlySpan<T> Slice(int start);
    public ReadOnlySpan<T> Slice(int start, int length);
    public T[] ToArray();
    public override string ToString();
    public bool TryCopyTo(Span<T> destination);

    public static bool operator ==(ReadOnlySpan<T> left, ReadOnlySpan<T> right);
    public static bool operator !=(ReadOnlySpan<T> left, ReadOnlySpan<T> right);

    public static implicit operator ReadOnlySpan<T>(T[] array);
    public static implicit operator ReadOnlySpan<T>(ArraySegment<T> segment);

    public ref struct Enumerator
    {
        public ref readonly T Current { get; }

        public bool MoveNext();
    }
}
공식문서에도 나와있듯이 해당 구조체는 읽기 전용범 위를 나타내는 구조체로 char가 들어가는 자리에 다양한 자료형이 들어가 읽기 전용으로 특정 자료형을 선언하고, 범위를 지정하는 구조체라고 이해하면 됩니다. 그렇다면 해당 읽기 전용은 왜 사용하는 것일까? 그 이유는 다음과 같습니다.

 

읽기 전용 접근 

ReadOnlySpan <T>는 데이터를 읽기만 가능하며, 수정은 불가능합니다. 
이는 데이터 무결성을 유지하고 예상치 못한 변경을 방지하는 데 유용합니다.

메모리 효율성 증가

ReadOnlySpan<T>는 데이터에 직접 접근하는 것이 아니라, 데이터의 위치를 가리키는 포인터와 길이를 가지고 있습니다. 
따라서 데이터 복사 없이 메모리에 효율적으로 접근할 수 있습니다.

다양한 데이터 소스

T 제네릭스 타입으로 읽기 전용 구조체에 다양한 데이터 소스를 생성할 수 있습니다.

스택 할당

ReadOnlySpan<T> 구조체는 기본적으로 스택에 할당하는 구조로, 가비지 컬렉터의 영향을 받지 않아 성능이 우수합니다.

 

여기까지 정리했을 때 그래서 ReadOnlySpan <char> 형이 문자열을 정수형으로 변경하는 것과 무슨 상관이 있는지 의문이 들 겁니다. 결국 ReadOnlySpan <char>라는 것을 쉽게 생각하면, 읽기 전용 문자열이라고 이해할 수 있다고 생각합니다. 그러면 ReadOnlySpan <char>를 통해 어떤 식으로 변환하는지 예제 코드를 통해 알아보겠습니다. 

 

char[] baseChar = new char[] { '1', '2', '3', '4' , ' '};
ReadOnlySpan<char> CharSpan = new ReadOnlySpan<char>(baseChar);
int parseInt = int.Parse(baseChar, NumberStyles.AllowTrailingWhite);
Debug.Log($"OutPut >> {parseInt}");

 

위의 ReadOnlySpan <T>의 정의부를 보면 다양한 생성자를 제공하게 되는데 이때 특정 자료형의 배열을 통해 읽기 전용 구조체를 만들고 데이터를 할당하여 주소를 참조하여 활용합니다. 이를 통해 원본데이터를 보호하고, 무결성을 유지합니다. 그 이후 정수형으로 변환할 때는 이전 포스팅에서 설명했듯이 NumberStyles이나, IFormatProvider를 활용하여 변환을 진행합니다.

 

마치며

간단한 문자열을 정수형으로 바꾸는 기본적인 문법을 봐도 많은 함수들이 정의되어 있고, 변환하는 방식도 엄청 많이 제공하는 것을 알 수 있었습니다. 이미 제공하고 있는 많은 문법을 조합하는 것만으로도 문제해결(문자열을 정수형으로 변환)에 필요한 기능들을 사용자 맞춤으로 정의하고 활용할 수 있다는 사실을 알게 된 계기가 되었습니다. 

'C#' 카테고리의 다른 글

[문법] IFormatProvider  (0) 2025.08.04
[문법] String To int Parser  (0) 2025.07.15