Section 17.1: StringBuilder 의 간략한 소개와 사용이 필요한 경우에 대한 설명
StringBuilder
는 문자 (character) 들의 연속된 집합을 나타내며, 일반적인 string
객체와는 다르게 가변적인 특성을 갖는다. 종종 이미 생성되어 있는 string
객체를 수정 혹은 변경할 필요가 생길 수 있으나, 표준 string
객체는 가변성을 지원하지 않는다. 이것이 의미하는 바는, string
객체가 수정되어야 할 때마다 새로운 string
객체가 생성되고, 내용 문자열이 복사된 후 객체의 재할당 작업이 이루어진다는 것이다.
string myString = "Apples";
mystring += " are my favorite fruit";
위 예제에서, myString
은 최초에는 "Apples" 라는 값만을 가지고 있다. 그러나, " are my favorite fruit" 이라는 문자열을 이어 붙이려 할 때, string
클래스는 내부적으로 다음과 같은 작업을 처리해 주게 된다:
myString
과 덧붙이려는 문자열의 길이 합 만큼의 문자 배열을 새로 생성한다.myString
의 모든 문자들을 새로운 배열의 시작 위치에 복사하고 이후 추가될 문자열을 배열의 뒷부분에 복사한다.- 새로운
string
객체를 메모리상에 생성하고 이 객체를myString
변수에 재할당한다.
이어 붙이는 작업이 일회성에 그친다면, 이러한 작업은 비교적 사소한 부분일 수 있을 것이다. 그러나, 만약 반복문에서의 사용과 같이 문자열에의 추가 작업 횟수가 늘어날 경우 문제는 달라질 수 있다.
String myString = "";
for (int i = 0; i < 10000; i++)
myString += " ";
// 문자열에 10,000 개의 공백 문자를 추가한다
반복된 객체 생성과 문자열 복사로 인해, 위와 같은 예제는 프로그램에 심각한 성능 저하를 초래할 수 있을 것이다. 이러한 문제를 피하기 위하여, StringBuilder
사용을 고려해 볼 수 있다.
StringBuilder myStringBuilder = new StringBuilder();
for (int i = 0; i < 10000; i++)
myStringBuilder.Append(' ');
동일한 반복문을 수행한 경우, 이와 같이 수정한 프로그램의 속도는 일반 string
을 이용했을 때보다 상당한 개선이 이루어질 것이다. StringBuilder
를 일반 string
으로 변환하고 싶은 경우에는, 간단히 StringBuilder
의 ToString()
메소드를 불러주기만 하면 된다.
물론, 이는 StringBuilder
가 가지고 있는 유일한 최적화 기능은 아니다. 더욱 최적화된 기능 수행을 위하여, 성능 향상을 가져올 수 있는 다른 속성들의 도움을 받을 수 있다.
StringBuilder sb = new StringBuilder(10000);
// 저장소 최대치 (capacity) 를 10000 으로 초기화한다
사용하고자 하는 StringBuilder
의 내용물의 길이값이 얼마나 될 지 미리 알 수 있다면, 해당하는 크기를 미리 지정해 두어, 내부적으로 문자 배열의 크기를 필요시마다 재조정하는 작업을 방지할 수 있다.
sb.Append('k', 2000);
비록 StringBuilder
를 사용하는 것만으로도 string
사용시보다 빠른 속도로 문자열 이어붙이는 작업을 수행할 수 있지만, 위와 같이 하나의 문자를 여러번 붙여 넣어야 하는 경우 더욱 빠르게 작업을 수행할 수 있는 메소드도 제공한다.
원하는 문자열을 생성하는 작업을 모두 마친 이후에는, StringBuilder
의 ToString()
메소드를 이용하여 이를 기본 string
으로 변환시킬 수 있다. StringBuilder
클래스가 string
으로부터 상속을 받고 있지 않기 때문에, 이러한 작업이 필요한 경우가 종종 발생할 것이다.
StringBuilder
를 사용하여 string
객체를 생성해내는 예제가 아래에 소개되어 있다:
string RepeatCharacterTimes(char character, int times) {
StringBuilder builder = new StringBuilder("");
for (int counter = 0; counter < times; counter++) {
// 한개의 문자를 StringBuilder 에 추가한다.
builder.Append(character);
}
// 최종 결과를 string 객체로 만들어 반환한다.
return builder.ToString();
}
결론적으로, StringBuilder
는 문자열에 많은 수정이 이루어져야 하는 경우, 성능 저하가 우려될 때 string
을 대신하여 사용하는 것이 바람직하다고 할 수 있다.
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.
[출처] https://books.goalkicker.com/CSharpBook/
'번역 > C# Notes for Professionals' 카테고리의 다른 글
18: Regex 를 통한 파싱 (parsing) (0) | 2021.03.11 |
---|---|
17.2: StringBuilder 를 이용하여 많은 수의 데이터 항목으로부터 문자열을 생성하는 예제 (0) | 2021.03.11 |
16.4: 식별자 (identifier) 내에서 이스케이프 시퀀스 (escape sequence) 사용하기 (0) | 2021.03.09 |
16.3: 문자 리터럴에서 특수 문자 escape 처리하기 (0) | 2021.03.08 |
16.2: 문자열에서 유니코드 문자를 처리하기 위한 이스케이프 시퀀스 (escape sequence) (0) | 2021.03.08 |