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