센로그

[C#] StringBuilder 본문

게임/Unity, C#

[C#] StringBuilder

seeyoun 2023. 7. 11. 13:55

◆ 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 사용을 권장한다.

Comments