공부/C#

[C#]String Builder

개발의 피 2024. 7. 30. 18:35

시작하세요! C# 12 프로그래밍(정성태, 위키북스) 373~ 374p

 

string builder에 대해서 처음 들었을 때, 내 반응은 그런 게 있다고...? 였다 

내가 봤던 문법책에서는 본 적이 없던 것(알고 보니 클래스)이어서, 해당 내용을 다루고 있는 문법책을 찾아서 하나 더 구매했다 

이전에 공부한 책에서 접하지 못한 부분도 확실히 많은데, 그만큼 볼 엄두가 나지 않는 것도 사실이다 🥲 화이팅... 

 

* string 타입 : 불변 객체(immutable object) -> string에 대한 모든 변환은 새로운 메모리 할당을 발생시킴

- 특성 : string 타입은 한 번 생성되면 그 값을 변경할 수 없는 불변 객체

- 문제점 : string에 대한 모든 변환은 새로운 메모리 할당을 발생시킴. (System.String 클래스의 메서드를 사용할 때마다 메모리에 새 문자열 개체가 생성되는 것)

 

* StringBuilder : 문자열을 효율적으로 다룰 수 있도록 도와주는 클래스 

언제 사용? : 문자열을 자주 수정하거나 자주 조합할 때 

사용하는 이유 : 내부적으로 동적 배열을 사용하여 성능을 최적화 

사용하려면 : System.Text; 필요 

 

예제1. string.ToLower 메서드

string txt = "Hello World";
string lwrText = txt.ToLower();

 

https://www.sysnet.pe.kr/2/0/13142

1) txt 변수 : 힙에 있는 "Hello World"를 가리킴

2) ToLower 메서드 호출 : txt 변수에 담긴 문자열이 소문자로 변경되는 것 x, 원문("Hello World")이 통째로 복사된 다음, 소문자로 변경되어 반환 (= 새로운 메모리 할당 발생)

 

예제 2) 문자열 더하기 : 불변 타입의 string 클래스가 발생시키는 가장 큰 문제 

반복적으로 문자열을 결합하는 작업 수행 -> 문자열을 더할 때마다 새로운 문자열 생성 

string txt = "Hello World";

for (int i = 0; i < 30000; i++)
{
	txt = txt + "1";
}

온라인 컴파일러에서 실행 시, 110초 걸림 

 

1) 힙에 "Hello World" 문자열을 담은 공간을 할당

2) 스택에 있는 txt 변수에 1번 과정에서 할당된 힙의 주소를 저장

3) txt + "1" 동작을 수행하기 위해 txt.Length + "1".Length에 해당하는 크기의 메모리를 힙에 할당. 그 메모리에 txt 변수가 가리키는 힙의 문자열과 "1" 문자열을 복사 (끊임없이 메모리를 할당하고 이전의 문자열을 다시 복사하는 과정 = 문제)

4) 다시 스택에 있는 txt 변수에 3번 과정에서 새롭게 할당된 힙의 주소를 저장

5) 3~4 과정 30만 번 반복 

 

이런 문제를 해결하기 위해 추가된 클래스 : StringBuilder 

예제 3) 문자열 더하기 - String Builder 

string txt = "Hello World";

StringBuilder sb = new StringBuilder(); // StringBuilder 객체 생성
sb.Append(txt);

for (int i = 0; i < 30000; i++)
{
	sb.Append("1"); // 문자열을 특정 위치(맨 앞)에 삽입
}

string newText = sb.ToString(); // 객체의 내용을 최종 문자열로 변환

소요 시간 : 0.004초 (=획기적인 성능 향상)

1) StringBuilder는 내부적으로 일정한 양의 메모리를 미리 할당

2) Append 메서드에 들어온 인자를 미리 할당한 메모리에 복사

3) 2번 과정을 30만 번 반복. Append로 추가된 문자열이 미리 할당된 메모리보다 많아지면 새롭게 여유분의 메모리를 할당

4) ToString 메서드를 호출하면 연속적으로 연결된 하나의 문자열을 반환 

즉, 잦은 메모리 할당과 복사가 없어졌기 때문에 그만큼 성능이 향상된 것

-> 문자열을 연결하는 작업이 많을 때는 반드시 StringBuilder를 사용하기 ! 

 

* 주요 메서드 

- Append : 문자열을 StringBuilder의 끝에 추가

- AppendFormat : 문자열에 전달된 서식 지정자를 서식 있는 텍스트로 바꿈 

- Insert : 지정한 위치에 문자열 삽입

- Remove : 지정한 범위의 문자열을 제거

- Replace : 특정 문자열을 다른 문자열로 바꿈

- ToString : StringBuilder 객체의 내용을 문자열로 반환 

 

+) 추가 AppendLine : 문자열 추가 + 자동으로 줄바꿈 추가 ! 

cf. Append : 줄바꿈 x (같은 줄에 연결) 

https://learn.microsoft.com/ko-kr/dotnet/standard/base-types/stringbuilder

 

.NET에서 StringBuilder 클래스 사용 - .NET

.NET에서 StringBuilder 클래스를 사용하는 방법을 알아봅니다. 이 클래스를 사용하면 새 개체를 만들지 않고 문자열을 수정합니다.

learn.microsoft.com