[문법] String To int Parser
2025.07.10 - [코딩테스트] - [PCCP 기출문제] 1번 / 동영상 재생기 위 코딩 테스트 문제를 풀면서 아쉬웠던 문법들에 대해 알아보는 시간을 가지고자 글을 작성하게 되었습니다. C# 공식문서 문자열을
develophyun.tistory.com
이전 String To int Parser 관련하여 정리한 글 안에서 ReadOnlySpan <char> 구조체에 대한 정보를 정리해보려고 합니다.
이름만 보았을 때는 뭔가 ReadOnly에서 읽기 전용이라는 의미를 뜻하고 있습니다. 관련 공식 문서를 아래에 링크해 두도록 하겠습니다.
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 |