[C#] StringBuilder
◆ StringBuilder
변경할 수 있는 문자열
String과 StringBuilder은 둘다 문자열을 나타내지만, 내부적인 구현 방식이 다르다.
기본적으로 String은 변경할 수 없는 타입이다. 즉, String 객체를 수정하는 것처럼 보이는 작업들(+연산자 등)은 실제로 해당 객체를 수정하는 것이 아니라, 새 String 객체를 만드는 것과 같다.
빈번한 변경이 있는 문자열의 경우 이렇게 매번 새로운 메모리를 할당받는 방식은 비효율적이고, 가비지를 만들게 된다.
따라서 등장한 StringBuilder은, 처음에 문자열을 담아놓을 공간(기본 Capacity = 16)을 할당한 후,
Append를 한다면 공간이 꽉찰 때까지 해당 공간 내에 추가한다.
공간이 꽉차면, 새로운 StringBuilder를 할당 받아 값을 계속 채우고, Linked-List처럼 다른 객체를 가르키면서 하나의 체인을 형성한다.
◆ StringBuilder 사용법
- new 키워드를 사용해 생성할 수 있다. (StringBuilder은 ISerializable 인터페이스를 상속하는 클래스이다.)
StringBuilder a = new StringBuilder();
아래와 같은 종류의 생성자들이 존재한다.

- Append 메서드를 통해 문자열을 추가할 수 있다.
a.Append("hello");
- Clear 메서드를 통해 문자열을 초기화할 수 있다. (이때 지금까지 할당된 공간 용량은 초기화되지 않고 남아있다.)
a.Clear();
- Length 속성을 통해 문자열 길이를 확인할 수 있고, Capacity 속성을 통해 StringBuilder의 현재 용량을 확인할 수 있다.
Console.WriteLine(a.Length);
Console.WriteLine(a.Capacity);
※ Insert, Remove, Replace도 가능하다.
참고) https://learn.microsoft.com/ko-kr/dotnet/standard/base-types/stringbuilder
◆ String vs StringBuilder
String의 경우 포인터 형식으로 구현되어, 기존 문자열에 +연산자를 통해 문자열을 추가할 시 새로운 객체가 생성된다.
반면 StringBuilder의 경우 공간이 꽉찰 때까지 해당 공간 내에서 문자열을 추가한다.
예를들자면:
1) 우선 String의 동작을 살펴보자.
String a = "hello "를 하면 포인터가 hello를 가리키고 있다.

a += "world"를 한다면, 새로운 객체 "hello world"가 만들어지고, 포인터가 그 객체를 가리키도록 변경된다.

아주 작은 문자열을 추가하더라도 항상 이 작업이 일어나고, 그만큼의 오버헤드가 포함되어 있다.
2) 반면 StringBuilder의 동작을 살펴보자.
StringBuilder aa = new StringBuilder("hello "); 를 한 경우

aa.Append("world"); 를 한 경우

그만큼, 빈번한 추가가 있는 경우 성능 차이도 많이 난다.

이런 이유로 C#에서는 String보다 StringBuilder 사용을 권장한다.