C#에서의 string은 string MSDN
변경불가능한 데이터 형식으로 수정할 수 없다.
MSDN의 설명에서 그러하듯
string은 immutable 데이터 형식으로 수정할 수 없다.
따라서
string str = "Hello";
str += "World";
위 처럼 수정하는건 사실 수정이 아니라 새로운 문자열 개체를 생성한다.
str 문자열을 수정하는 += "World"; 에서는 Hello에 World를 포함한
실제로 새로운 문자열 개체가 생성되며, 기존의 "Hello" 문자열 개체는 GC에 의해 해제된다.
따라서 string은 문자열 조작 작업이 많다면 string보단 StringBuilder를 사용하는 것이 올바른 방법으로 보인다.
StringBuilder MSDN
그러면 StringBuilder는 어떻게 새 문자열 개체를 만들지 않고 생성될까?
바로 StringBuilder는 내부적으로 버퍼(설정을 하지 않을 시 기본16의 버퍼)를 갖고 이를 통해 문자열을 수정하기 때문이다.
아래와 같이 5글자를 넣는다면
StringBuilder sb = new StringBuilder("Hello");
Console.WriteLine($"StringBuilder의 Capacity {sb.Capacity}");
StringBuilder의 Capacity 16
기본 16의 Capacity가 설정된다.
그러하다면 16의 크기를 넘어가게된다면?
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 100; ++i)
{
sb.Append("Hello");
Console.WriteLine($"StringBuilder의 Capacity {sb.Capacity}");
}
capacity의 값이 2배씩 늘어남을 확인할 수 있다
(버퍼의 크기가 변하는 알고리즘은 .NET 버전에 따라 달라질 수 있음)
결국 string처럼 매번 문자열을 수정할때만큼은 아니지만
StringBuilder도 버퍼의 값이 수정될때마다 메모리 할당이 발생한다.
이는 마찬가지로 가비지컬렉터에 의해 해제된다.
하지만!
그래도 문자열을 수정할 때 StringBuidler가 메모리 할당 횟수를 줄일 수 있다는 면에서 우월하다는건 확실하다.
따라서
문자열 조작이 많이 필요하다 : StringBuidler
간단한 문자열 조작만 하거나 혹은 상수로 사용한다 : string
알맞게 사용하는 것이 바람직해보인다.
'프로그래밍 > C#' 카테고리의 다른 글
Static 클래스 (0) | 2023.07.31 |
---|---|
C# Array, List, ArrayList 차이 (0) | 2023.04.23 |
우선순위 큐? - 근데 이제 SortedDictionary 를 곁들인... (0) | 2023.04.15 |
C# 8.0의 달라진 Switch문 (2) | 2021.12.28 |
C# 확장함수 (Extension Method) (0) | 2020.05.25 |