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 으로 변환하고 싶은 경우에는, 간단히 StringBuilderToString() 메소드를 불러주기만 하면 된다.

물론, 이는 StringBuilder 가 가지고 있는 유일한 최적화 기능은 아니다. 더욱 최적화된 기능 수행을 위하여, 성능 향상을 가져올 수 있는 다른 속성들의 도움을 받을 수 있다.

StringBuilder sb = new StringBuilder(10000); // 저장소 최대치 (capacity) 를 10000 으로 초기화한다

사용하고자 하는 StringBuilder 의 내용물의 길이값이 얼마나 될 지 미리 알 수 있다면, 해당하는 크기를 미리 지정해 두어, 내부적으로 문자 배열의 크기를 필요시마다 재조정하는 작업을 방지할 수 있다.

sb.Append('k', 2000);

비록 StringBuilder 를 사용하는 것만으로도 string 사용시보다 빠른 속도로 문자열 이어붙이는 작업을 수행할 수 있지만, 위와 같이 하나의 문자를 여러번 붙여 넣어야 하는 경우 더욱 빠르게 작업을 수행할 수 있는 메소드도 제공한다.

원하는 문자열을 생성하는 작업을 모두 마친 이후에는, StringBuilderToString() 메소드를 이용하여 이를 기본 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/

반응형

+ Recent posts