(C#) StringBuilder

장장·2025년 9월 25일

결국 코딩테스트에서 시간 복잡도로 인해 사용하게 되었다

StringBuilder 시간복잡도 n
string 시간복잡도 n^2

for문안에서 string str에 str += c; 형식으로 넣어줬는데
넣어줄때마다 계속 재할당을 해서 시간복잡도 n^2라고 한다
이유는 기존 str의 내용을 복사해서 새 문자열 생성한다음, c의 문자를 뒤에 붙여서 새문자열을 생성하기 때문 (추가할때마다 작업 2번씩함)

사용법

Append만 사용해봐서 Append만 추가
using System.Text; 추가해야함

StringBuilder sb = new StringBuilder();
sb.Append("hello"); //추가
string str = sb.ToString(); // str에 sb의 내용 넣기

Append(): 문자열을 StringBuilder 객체의 끝에 추가합니다.
Insert(): 문자열을 지정된 인덱스에 삽입합니다.
Remove(): 지정된 인덱스에서 지정된 길이만큼 문자열을 삭제합니다.
Replace(): 지정된 문자열을 특정 문자열로 변경합니다.

string은 불변 타입이다.
한번 문자열을 변경 할때마다 새로운 문자열 객체가 생성되기때문에 아래 문제가 발생한다
불변성과 가변성이란?

string의 단점

  1. 많은 메모리 할당
    문자열 수정 시 마다 매번 힙에 새로운 데이터가 만들어짐
  2. GC부담 증가
    임시 문자열 객체들이 빠르게 사라지면 GC가 자주실행 (프레임 드랍, 일시적 정지 유발)
  3. 메모리 단편화
    잦은 할당과 해제가 힙 메모리의 단편화를 일으킴

StringBuilder의 장점

StringBuilder는 가변 타입이다.
한번 문자열을 변경 할 때마다 힙에 있는 데이터를 변경한다.

  1. 메모리 할당 횟수 감소
    문자열 수정 시 마다 힙에 있는 데이터가 수정되기때문에 재할당 되지않음 (메모리 신규할당되지않고 값수정)
  2. 용량(capacity) 예약 가능
    최대 크기가 지정된경우 미리 new StringBuilder(capacity)로
    버퍼 크기 지정해서 재할당 빈도 줄일 수 있음

StringBuilder의 단점

StringBuilder은 얕은복사, 참조한 곳이 같은 경우 값이 같이 바뀐다
string은 깊은복사, 서로 참조해도 각자의 고유한 값을 가진다

class Program
{
    static void Main(string[] args)
    {
		//1. String
		string str1 = "a";
		string str2 = str1;
		str1 = "edit";
		Console.WriteLine(str1); //출력: edit
		Console.WriteLine(str2); //출력: a    (서로 값이 다름)
		
		//2. StringBuilder
		StringBuilder sb1 = new StringBuilder("Hello");
		StringBuilder sb2 = sb1; //얕은복사
		sb1.Append(" !!"); //Hello !! 가 됨
		Console.WriteLine(sb1.ToString());  // 출력: Hello !!
		Console.WriteLine(sb2.ToString());  // 출력: Hello !! (얕은복사로 sb1과 값같아짐)
	}
}

게임에서 쓰이는 곳?

StringBuilder는 UI에서 텍스트에 유용하게 쓰일 것이라고 생각한다
UI에는 점수들이 실시간으로 갱신되어야 한다면?
많은 문자열이 수정될텐데 그때 사용하면 좋을 것이다

후기

이미 문자열은 string이라는 좋은 것이 있는데 StringBuilder가 왜 존재하는지는 생각해보지 못했다.

이번에 조사를 통해 고려해볼만한 StringBuilder를 알게되었다.

0개의 댓글