개요
C#에서 문자열(string)은 불변(immutable) 객체입니다. 즉, 문자열을 수정하는 모든 작업(예: 문자열 연결, 삽입, 삭제 등)은 새로운 문자열 객체를 생성합니다. 이러한 특성 때문에 문자열을 빈번하게 수정하는 경우, 불필요한 메모리 할당과 해제가 반복되어 성능 저하를 초래할 수 있습니다.
StringBuilder는 이러한 문제를 해결하기 위해 도입된 가변(mutable) 문자열 클래스입니다. StringBuilder 객체는 내부적으로 문자 배열을 사용하여 문자열을 저장하며, 문자열을 수정하는 작업을 효율적으로 수행할 수 있도록 설계되었습니다.
StringBuilder의 특징
- 가변성(Mutability): 문자열을 수정해도 새로운 객체를 생성하지 않고 내부적으로 변경합니다.
- 성능 향상: 문자열을 빈번하게 수정하는 작업에서 string 클래스보다 훨씬 뛰어난 성능을 보입니다.
- 다양한 메서드 제공: 문자열 추가, 삽입, 삭제, 치환 등 다양한 문자열 조작 메서드를 제공합니다.
StringBuilder의 주요 메서드
Append()
: 문자열을StringBuilder
객체 뒤에 추가합니다.Insert()
: 지정된 위치에 문자열을 삽입합니다.Remove()
: 지정된 위치에서 지정된 개수의 문자를 삭제합니다.Replace()
: 특정 문자 또는 문자열을 다른 문자 또는 문자열로 치환합니다.ToString()
:StringBuilder
객체의 내용을 string 객체로 변환합니다.
StringBuilder의 활용 시점
- 반복적인 문자열 수정: 루프 안에서 문자열을 추가, 삽입, 삭제하는 경우
- 많은 문자열 연결: 여러 개의 문자열을 하나로 연결하는 경우
- 문자열 포맷팅: 복잡한 문자열 형식을 만드는 경우
예시 코드
using System;
using System.Text; // StringBuilder를 사용하기 위해 추가
public class StringBuilderExample
{
public static void Main(string[] args)
{
// StringBuilder 객체 생성
StringBuilder sb = new StringBuilder("Hello");
// Append() 메서드: 문자열 추가
sb.Append(", World!");
Console.WriteLine(sb.ToString()); // 출력: Hello, World!
// Insert() 메서드: 문자열 삽입
sb.Insert(5, " C#");
Console.WriteLine(sb.ToString()); // 출력: Hello C#, World!
// Remove() 메서드: 문자열 삭제
sb.Remove(5, 3); // " C#" 삭제
Console.WriteLine(sb.ToString()); // 출력: Hello, World!
// Replace() 메서드: 문자열 치환
sb.Replace("World", "C# Programming");
Console.WriteLine(sb.ToString()); // 출력: Hello, C# Programming!
// 여러 줄의 문자열 추가
sb.AppendLine(); // 새 줄 추가
sb.AppendLine("This is a new line.");
Console.WriteLine(sb.ToString());
/* 출력:
Hello, C# Programming!
This is a new line.
*/
// 초기 용량 설정
StringBuilder sbWithCapacity = new StringBuilder(100); // 초기 용량을 100으로 설정
Console.WriteLine($"Capacity: {sbWithCapacity.Capacity}"); // 출력: Capacity: 100
// 최대 용량 설정
StringBuilder sbWithMaxCapacity = new StringBuilder(10, 50); // 초기 용량 10, 최대 용량 50으로 설정
Console.WriteLine($"MaxCapacity: {sbWithMaxCapacity.MaxCapacity}"); // 출력: MaxCapacity: 50
}
}
string과 StringBuilder의 성능 비교
using System;
using System.Diagnostics; // Stopwatch를 사용하기 위해 추가
using System.Text;
public class PerformanceComparison
{
public static void Main(string[] args)
{
int iterations = 10000;
string str = "";
StringBuilder sb = new StringBuilder();
// string을 사용한 문자열 연결 시간 측정
Stopwatch sw = Stopwatch.StartNew();
for (int i = 0; i < iterations; i++)
{
str += "a";
}
sw.Stop();
Console.WriteLine($"string concatenation: {sw.ElapsedMilliseconds}ms");
// StringBuilder를 사용한 문자열 연결 시간 측정
sw.Restart();
for (int i = 0; i < iterations; i++)
{
sb.Append("a");
}
sw.Stop();
Console.WriteLine($"StringBuilder append: {sw.ElapsedMilliseconds}ms");
}
}