C# 공부

[C#] 스트링빌더 (StringBuilder)

ogh4554 2025. 3. 15. 18:38

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는 엄청 빠른 반면에 하드디스크나 네트워크는 상대적으로 느리기 때문에 병목현상이 발생할 수 있음.

=> 버퍼를 사용하면 데이터를 모아두었다가 한번에 처리하기 때문에 성능을 향상 시킬 수 있음.