1. StringBuilder란?
: C# 에서 문자열을 효율적으로 다룰 수 있도록 제공하는 클래스.
string과 달리 불변(Immutable)이 아닌 가변(Mutable) 특성을 가지며, 문자열을 변경할 때 새로운 객체를 생성하지 않고 기존 객체를 수정할 수 있다는 점에서 string과 차이점이 있음.
문자열을 반복해서 변경해야 하는 경우 (ex : += 연산을 자주 사용해야 할 때, 반복문)에 주로 사용하며 System.Text 네임스페이스를 선언해야 함.
2. 사용법
① 객체 생성 및 문자열 추가 (Append)
using System;
using System.Text;
class Program
{
static void Main()
{
StringBuilder sb = new StringBuilder("Hello");
sb.Append(" World!"); // 문자열 추가
sb.AppendLine("My Name Is Won"); // 줄바꿈 포함 추가
Console.WriteLine(sb.ToString());
// 출력: Hello World!
// My Name Is Won
}
}
② 문자열 삽입 (Insert)
sb.Insert(5, ","); // 인덱스 5에 "," 삽입
Console.WriteLine(sb.ToString());
// 출력: Hello, World!
③ 문자열 삭제 (Remove)
sb.Remove(5, 2); // 인덱스 5부터 2글자 삭제
Console.WriteLine(sb.ToString());
// 출력: HelloWorld!
④ 문자열 변경 (Replace)
sb.Replace("World", "C#");
Console.WriteLine(sb.ToString());
// 출력: Hello, C#!
⑤ 문자열 길이 조절 (Capacity, Length)
Console.WriteLine(sb.Length); // 현재 문자열 길이 확인
Console.WriteLine(sb.Capacity); // 내부 버퍼 크기 확인
sb.Capacity = 100; // 버퍼 크기 조정
- Capacity : 내부 버퍼 크기를 의미 (자동 확장 됨)
- Length : 현재 문자열 길이
3. 언제 사용하는가?
① String
- 문자열 변경이 적을 때
- 작고 단순한 문자열 처리
- 가독성이 중요한 경우
- 문자열 연결이 많지 않은 경우
② StringBuilder
- 반복적인 문자열 변경이 필요할 때
- 큰 문자열을 다룰 때
- 루프내에서 문자열을 자주 추가할 때
- 성능이 중요한 경우
static void Main()
{
int iterations = 10000;
// string 사용
string str = "";
for (int i = 0; i < iterations; i++)
{
str += i.ToString(); // 매번 새로운 객체 생성
}
// StringBuilder 사용
StringBuilder sb = new StringBuilder();
for (int i = 0; i < iterations; i++)
{
sb.Append(i); // 기존 객체에 추가
}
}
- String을 사용할 경우 시간이 오래 걸림 (객체를 계속 생성하기 때문)
- StringBuilder를 사용할 경우 훨씬 빠름 (객체를 수정하기 때문)
4. 주의할 점
- 그렇다면 무조건 String 대신에 StringBuilder를 사용하면 되지 않느냐?
- 정답은 No. StringBuilder는 내부적으로 버퍼(Buffer) 관리 비용이 추적으로 듬.
- 즉, 아주작은 문자열을 한 두번만 변경하는 경우 오히려 String을 사용하는 것이 더 가볍고 빠를 수 있음.
*** 버퍼(Buffer)란? ***
더보기
데이터를 임시로 저장하는 공간
주로 속도차이가 나는 두 시스템 간의 데이터 전송을 원활하게 하기위해 사용.
ex) CPU는 엄청 빠른 반면에 하드디스크나 네트워크는 상대적으로 느리기 때문에 병목현상이 발생할 수 있음.
=> 버퍼를 사용하면 데이터를 모아두었다가 한번에 처리하기 때문에 성능을 향상 시킬 수 있음.
'C# 공부' 카테고리의 다른 글
[C#] 가비지 컬렉터 (Garbage Collector) (1) | 2025.04.11 |
---|---|
[C#] 소숫점 반올림, 올림, 내림 (Mathf.Round /Mathf.Ceil / Mathf.Floor) (0) | 2025.03.30 |
인터페이스(Interface) (1) | 2024.11.15 |
string 메서드 (0) | 2024.11.09 |