C# - StringBuilder

2025. 9. 23. 22:45·C#

스트링빌더(StringBuilder)

System.Text 에 포함된 클래스로 불변성(Immutable)을 가진 일반 문자열과 달리, 가변(Mutable) 문자열 버퍼를 제공한다.

문자열을 추가, 수정, 삭제하더라도 새로운 객체를 생성하지 않고, 내부 버퍼에서 처리한다.

 

  • Append : 문자열 추가
  • Insert : 특정 위치에 삽입
  • Remove : 특정 위치에서 삭제
  • Replace : 특정 문자열 치환
  • Clear : 전체 버퍼 초기화

사용법은 아래와 같다.

using System;
using System.Text;

class Program
{
    static void Main()
    {
        StringBuilder sb = new StringBuilder("Hello");

        sb.Append(" World");
        sb.Replace("World", "C#");
        sb.Insert(0, "[Start] ");
        sb.Remove(0, 8);

        Console.WriteLine(sb.ToString()); // Hello C#
    }
}

 

 

 

기존 문제

string text = "";
for (int i = 0; i < 1000; i++)
{
    text += i + " ";
}

 

기존의 string의 불변성 때문에 매번 새로운 문자열 객체가 힙에 생성된다.

이로 인해 GC 부담 증가, 메모리 파편화, 성능 저하가 발생할 수 있다.

 

 

솔루션

StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000; i++)
{
    sb.Append(i).Append(" ");
}
Console.WriteLine(sb.ToString());

 

스트링빌더를 통해 새로운 객체를 매번 생성하지 않고 내부 버퍼에서 누적한다.

이로 GC 압박을 줄이고 성능을 개선할 수 있다.

 

 

게임 개발에 적용

게임 환경에서는 문자열이 자주 바뀔 일이 많다.

특히나 이전에 적용했던 콘솔 프로젝트 같은 경우는 문자열을 이용하는 경우는 더욱이...

그 외에도 일반적인 게임에서 UI 출력, 대미지나 행동에 대한 전투 로그 출력, 채팅 시스템 등 string이 사방에 널려있다.

이러한 상황에서 안 그래도 바빠 죽겠는데 일반 string으로 매번 새로운 문자열 객체가 생성되면 성능 저하를 유발할 수 있다.

 

이러한 실시간 처리 상황에 StringBuilder를 사용하면 반복적인 문자열 수정을 최적화 하여 GC 사용 수 감소를 통해 성능 최적화로 이어진다.

 

 

 

콘솔 프로젝트에 적용 실패

이전에 콘솔 프로젝트를 통해 벽 부수기 게임을 구현한 적이 있다.

이때 50ms 기준으로 매 프레임을 업데이트 하게끔 구성했으며, Console.WriteLine 과 배경색을 이용해 그래픽을 표현했었는데

출력수가 많아 화면이 끊겨 보이는 현상이 발생했다.

 

기존에 Console.Write를 직접 호출하는 형태로 작동하던 DrawFrame, DrawBottomUI, DrawLine 등의 메서드들이 있다.

이곳에 StringBuilder 기반의 2중 버퍼링(double buffering)을 적용해, 모든 프레임을 메모리에서 문자열로 먼저 조립한 후 한번에 출력해 깜빡임을 줄이고 속도를 개선해보고자 했으나...

 

StringBuilder는 문자 데이터만 조립하는 도구이기 때문에 배경색을 이용해야하는 기존 코드에는 적용할 수 없었다...

 

슬픈 결말...

혹시 sb를 이용해 배경 색도 제어하는 방법을 아시는 분이 있다면 정보 공유 부탁드립니다...

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

C# - 자료구조 : Indexer, List, LinkedList  (0) 2025.09.24
C# - record  (0) 2025.09.23
C# - 캡쳐(Capture), 클로져(Closure) - feat React.useState  (0) 2025.09.23
C# - 델리게이트 (Delegate)  (0) 2025.09.22
C# - 인터페이스 문제 풀이  (0) 2025.09.22
'C#' 카테고리의 다른 글
  • C# - 자료구조 : Indexer, List, LinkedList
  • C# - record
  • C# - 캡쳐(Capture), 클로져(Closure) - feat React.useState
  • C# - 델리게이트 (Delegate)
ellug
ellug
Web / App / Game Dev
  • ellug
    dev.ellug
    ellug
  • 전체
    오늘
    어제
    • 분류 전체보기 (95)
      • Javascript (React, Next) (1)
      • C# (66)
      • Graphics (1)
      • Unity (25)
      • 프로그래머스 (0)
        • Lv.0 (0)
        • Lv.1 (0)
        • Lv.2 (0)
        • Lv.3 (0)
      • AI Agent (0)
      • StableDiffusion (0)
      • ETC (1)
      • 잡담 (0)
      • 유머 (0)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    최적화
    class
    Network
    추상 클래스
    게임
    Photon
    interface
    큐
    콘솔
    stack
    Queue
    Abstract
    inputsystem
    터미널
    알고리즘
    firebase
    unity
    delegate
    struct
    list
    자료구조
    클래스
    유니티
    Design Pattern
    스택
    C#
    function
    useState
    console
    네트워크
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
ellug
C# - StringBuilder
상단으로

티스토리툴바