[C#]String Builder
시작하세요! 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();
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