C#/문법 정리

C# - String과 StringBuilder 차이

Khadra 2024. 7. 12. 08:06

String

  • 객체의 값은 한 번 만들면 변경할 수 없다. 이를 불변(immutable)이라 한다.
  • 객체가 변경될 때마다 새로운 string을 만들어서 변수명에 할당해 주는 것이다.
  • 빈번하게 변경되는 경우에는 쓸데없이 string이 많이 만들어지고, 그만큼 실행속도와 메모리 사용이 많아진다.

StringBuilder

  • C#에서 String클래스와 비슷하게 제공한다.
  • 가변(mutable)이다.
  • 문자열이 변경되면 자동으로 필요한 메모리를 동적으로 변경하고, 내용을 바꿀 수 있다.
  • 자주 변경되는 String을 다룰 때 효율적이다.

예시

string buffer = "The numbers are: ";
for (int i = 0; i < 3; i++) 
{
    buffer += i.ToString();
}
  • 3번 반복되는 루프 안에서는 정수 i를 string으로 만들고, buffer에 추가하여 buffer를 변경한다.
  • string은 변경될 때마다 새로운 string이 만들어지므로 이때 메모리 안에서는 다음예제와 같이 7개의 string이 만들어지게 된다.
  • 그 중 6개는 필요 없어지는 것이다.
1 - "The numbers are: "
2 - "0"
3 - "The numbers are: 0"
4 - "1"
5 - "The numbers are: 01"
6 - "2"
7 - "The numbers are: 012"
  • String객체가 자주 변경되는 경우에는 StringBuilder를 사용하는 것이 훨씬 좋다.
  • StringBuilder는 string을 추가,제거,수정하는 메소드들을 제공한다.

클래스의 속성 표

속성 동작
Capacity StringBuilder 객체에 할당된 메모리가 허용하는 최대 문자수를 가져오거나 설정한다.
Length StringBuilder 객체의 길이를 가져오거나 설정한다.


클래스의 메소드 표

메소드 동작
Append StringBuilder 객체의 끝에 문자열을 추가한다.
Clear StringBuilder 객체의 모든 문자들을 없애준다.
CopyTo string의 일부분을 문자 배열로 복사한다.
EnsureCapacity StringBuilder 객체의 용량을 최소한 지정된 값이 되도록 한다.
Equals 이 객체가 다른 객체와 같은 지를 Bool값으로 리턴한다.
Insert 특정한 위치에 지정한 문자열을 삽입한다.
Remove 특정 위치에 있는 문자열을 삭제한다.
Replace StringBuilder 객체에서 문자 혹은 substring을 다른 문자 혹은 substring으로 대체한다.
ToString StringBuilder 객체의 값을 String으로 변환한다.


예제 코드

StringBuilder의 다양한 메소드들을 사용해보고,
String과 StringBuilder의 성능차이가 얼마나 나는지 Stopwatch 실행속도를 체크해본다.

using System;
using static System.Console;//Console단어를 생략(코드길이줄어둠)
using System.Diagnostics;//Stopwatch를 사용하기 위해 System.Diagnostics 네임스페이스를 추가한다.
using System.Text;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            // StringBuilder 클래스의 객체 sb를 만들고 
            StringBuilder sb = new StringBuilder("This is a StringBuilder Test.");
            // 내용과 길이를 출력한다.
            WriteLine("{0} ({1} characters)", sb.ToString(), sb.Length);


            // sb.Clear()메소드는 sb를 초기화한다.
            sb.Clear();
            WriteLine("{0} ({1} characters)", sb.ToString(), sb.Length);


            // sb.Append() 메소드는 문자열을 뒤에 추가한다.
            sb.Append("This is a new string.");
            WriteLine("{0} ({1} characters)", sb.ToString(), sb.Length);


            // sb.Insert(5, "xyz ", 2)메소드는 sb의 5번째 위치에 "xyz "을 2번 삽입한다.
            sb.Insert(5, "xyz ", 2);
            WriteLine("{0} ({1} characters)", sb.ToString(), sb.Length);


            // sb.Remove(5, 4) 메소드는 sb의 5번째 위치에서 4개의 문자를 삭제한다.
            sb.Remove(5, 4);
            WriteLine("{0} ({1} characters)", sb.ToString(), sb.Length);


            // sb.Replace("xyz", "abc") 메소드는 sb에서 "xyz"를 "abc"로 대체한다.
            sb.Replace("xyz", "abc");
            WriteLine("{0} ({1} characters)", sb.ToString(), sb.Length);


            // Stopwatch 객체 time을 생성하여 Start()하고 Stop()할 때까지의 시간을 측정한다.
            Stopwatch time = new Stopwatch();
            // stirng test 를 생성한다.
            string test = string.Empty;
            time.Start();

            // 0~99,999까지 10만번 반복하면서 
            for(int i = 0; i < 100000; i++)
            {
                // test에 숫자를 문자열로 추가한다.
                test += 1;
            }
            time.Stop();
            WriteLine("String: " + time.ElapsedMilliseconds + " ms");


            // StringBuilder test1를 생성하여 
            StringBuilder test1 = new StringBuilder();
            time.Reset();
            time.Start();
            // 위와 같이 10만번 반복하면서 
            for (int i= 0; i< 100000; i++)
            {
                // test1 뒤에 숫자를 문자열로 추가하며 
                test1.Append(i);
            }
            time.Stop();
            // 시간을 측정한다.
            WriteLine("StringBuilder: " + time.ElapsedMilliseconds + " ms");
        }
    }
}

결과

This is a StringBuilder Test. (29 Characters)
 (0 characters)
This is a new string. (21 characters)
This xyz xyz is a new string. (29 characters)
This xyz is a new string. (25 characters)
This abc is a new string. (25 characters)
String: 1806 ms
StringBuilder: 3 ms