C#에서 문자열은 변경할 수 없습니다. 즉, 문자열이 생성되면 수정할 수 없습니다. 문자열을 수정하면 수정 사항이 포함된 새 문자열이 반환되며 원래 문자열은 그대로 유지됩니다.
string word = "aaabbbccc"; string newWord = word.Replace('b', 'd'); Console.WriteLine(word); // prints aaabbbccc Console.WriteLine(newWord); // prints aaadddccc
StringBuilder 클래스는 수정할 수 있는 문자열과 유사한 개체, 즉 변경 가능한 문자열을 나타냅니다. 변경할 수 없는 문자열을 나타내는 문자열 유형과 다르게 구현됩니다.
문자열 개체를 수정하면 복사본이 생성되므로 문자열 개체를 반복적으로 수정하면 성능이 저하될 수 있습니다. 작은 반복의 경우 무시할 수 있지만 거대한 루프의 경우 중요할 수 있습니다. StringBuilder는 문자를 추가, 제거, 교체 또는 삽입하여 문자열을 수정하는 효율적인 대안을 제공합니다.
StringBuilder는 문자를 보관할 내부 버퍼를 유지 관리합니다. 버퍼에 사용 가능한 공간이 있으면 새 데이터를 추가합니다. 그렇지 않으면 새 버퍼를 만들고 이전 데이터를 새 버퍼에 복사한 다음 데이터를 추가합니다.
var sb = new StringBuilder(); for (int i = 0; i < 10; i++){ sb.Append("a"); } Console.WriteLine(sb.ToString()); // prints aaaaaaaaaa
다음은 StringBuilder 개체를 구성하는 다양한 방법입니다.
// Initialize a new instance of StringBuilder var sb1 = new StringBuilder(); // Initialize a new instance of StringBuilder using the given capacity var sb2 = new StringBuilder(capacity: 10); // Initialize a new instance of StringBuilder with the given string var sb3 = new StringBuilder(value: "Hello World"); // Initialize a new instance of StringBuilder with the given capacity and the maximum capacity it can grow to var sb4 = new StringBuilder(capacity: 20, maxCapacity: 10); // Initialize a new instance of StringBuilder with the given string and capacity var sb5 = new StringBuilder(value: "Hello", capacity: 20); // Initialize a new instance of StringBuilder from the given substring and capacity var sb6 = new StringBuilder(value: "Hello World", startIndex: 0, length: 5, capacity: 20);
StringBuilder 클래스에는 현재 개체에 있는 문자 수를 나타내는 Length 속성이 있습니다. 개체에 더 많은 문자를 추가하면 개체가 현재 포함할 수 있는 최대 문자 수를 정의하는 용량에 도달할 때까지 길이가 늘어납니다.
추가된 문자 수로 인해 길이가 현재 용량을 초과하는 경우 클래스는 용량을 결합하여 새 메모리를 할당합니다. 그런 다음 새 문자가 개체에 추가되고 개체의 Length 속성이 조정됩니다.
StringBuilder는 MaxCapacity 속성 값에 도달할 때까지 동적으로 추가 메모리를 계속 추가합니다. 그 후에는 개체에 더 이상 메모리를 할당할 수 없습니다. 개체에 더 많은 데이터를 추가하려고 하면 ArgumentOutOfRangeException 또는 OutOfMemoryException 예외가 발생합니다.
StringBuilder는 문자열을 쉽게 수정할 수 있도록 다음과 같은 메서드를 제공합니다.
-
추가 − 이 인스턴스에 지정된 개체의 문자열 표현을 추가합니다.
-
AppendFormat − 0개 이상의 형식 항목을 포함하는 복합 형식 문자열을 처리하여 반환된 문자열을 이 인스턴스에 추가합니다. 각 형식 항목은 해당 개체 인수의 문자열 표현으로 대체됩니다.
-
AppendJoin − 각 구성원 사이에 지정된 구분 기호를 사용하여 제공된 객체 배열에 있는 요소의 문자열 표현을 연결한 다음 문자열 작성기의 현재 인스턴스에 결과를 추가합니다.
-
AppendLine − 현재 StringBuilder 개체의 끝에 기본 줄 종결자를 추가합니다.
-
지우기 − 현재 StringBuilder 인스턴스에서 모든 문자를 제거합니다.
-
복사 대상 − 대상 문자 범위 또는 문자 배열에 문자를 복사합니다.
-
용량 보장 − 이 StringBuilder 인스턴스의 용량이 지정된 값 이상인지 확인합니다.
-
같음 − 이 인스턴스와 제공된 인스턴스의 문자열, 용량 및 MaxCapacity 값이 같으면 true를 반환합니다.
-
GetChunks − 문자 청크를 반복하는 데 사용할 수 있는 개체를 반환합니다.
-
삽입 − 이 인스턴스의 지정된 문자 위치에 지정된 개체의 문자열 표현을 삽입합니다.
-
제거 − 이 인스턴스에서 지정된 문자 범위를 제거합니다.
-
교체 − 이 인스턴스에서 지정된 문자 또는 문자열의 모든 발생을 다른 지정된 문자 또는 문자열로 대체합니다.
-
ToString − 현재 인스턴스를 문자열로 변환합니다.
예시
using System; using System.Text; class Program{ static void Main(string[] args){ string word = "aaabbbccc"; string newWord = word.Replace('b', 'd'); Console.WriteLine(word); // prints aaabbbccc Console.WriteLine(newWord); // prints aaadddccc var sb = new StringBuilder(); for (int i = 0; i < 10; i++){ sb.Append("a"); } Console.WriteLine(sb.ToString()); // prints aaaaaaaaaa // Initialize a new instance of StringBuilder var sb1 = new StringBuilder(); // Initialize a new instance of StringBuilder using the given capacity var sb2 = new StringBuilder(capacity: 10); // Initialize a new instance of StringBuilder with the given string var sb3 = new StringBuilder(value: "Hello World"); // Initialize a new instance of StringBuilder with the given capacity and the maximum capacity it can grow to var sb4 = new StringBuilder(capacity: 20, maxCapacity: 50); // Initialize a new instance of StringBuilder with the given string and capacity var sb5 = new StringBuilder(value: "Hello", capacity: 20); // Initialize a new instance of StringBuilder from the given substring and capacity var sb6 = new StringBuilder(value: "Hello World", startIndex: 0, length: 5, capacity: 20); } }
출력
aaabbbccc aaadddccc aaaaaaaaaa