※ 아래 내용은 http://www.simpleisbest.net/archive/2005/05/16/147.aspx 내용을 공부 목적으로 요약한 것 입니다.


About StringBuilder Class





1. 문자열 버퍼의 사용

- StringBuilder 클래스는 내부적으로 문자열 버퍼를 가지고 문자열을 관리한다.
- Append, AppendFormat 메소드가 호출될 때 마다 내부 버퍼에 연결 하고자 하는 문자열을 복사한다.
- 내부 버퍼는 System.String 타입이다.
- StringBuilder 는 내부 버퍼가 부족할 때 마다 새로운 내부 버퍼를 생성하며, 그 크기는 기본 버퍼 크기의 2배가 된다.
  (따라서 새로운 내부 버퍼를 생성이 많아지면 성능이 나빠진다.)


2. StringBuidler의 내부 동작

- StringBuilder 객체가 생성되면 디폴트로 16 문자를 담을 내부 문자열 버퍼를 생성한다.
- 내부 퍼버가 부족하면 기존 크기의 2배 크기로 버퍼를 생성하고, 기존 버퍼의 내용을 새 버퍼에 복사한다.
   기존 버퍼는 가비지 컬렉터가 처리한다.
- StringBuilder.ToString() 메소드는 새로운 문자열을 할당하고, 내부 문자열 버퍼의 내용을 새로운 문자열에 복사.
- StringBuilder.ToString() 호출된 이후에는 StringBuilder는 버퍼를 초기화 하여 StringBuiler 객체가 재사용 되게 함.
- StringBuilder 는 내부적으로 관리 작업이 많아 생각보다 빠르지 않다.


3. StringBuilder 클래스를 사용하는 경우

- 반복적으로 다수 문자열을 연결하는 경우
- 가급적 StringBuilder 객체를 선언할 때, 버퍼의 크기를 명시하는 것이 좋다.
- 많은 경우 String.Concat() 와 String.Join()는 StringBuilder 보다 효율적이다.
- C#, VB.NET 컴파일러가 문자열의 + 연산자를 String.Concat() 호출로 컴파일 해준다.


- 또다른 예로 SQL 쿼리 문을 만들 때 StringBuilder 보다 + 연산자를 사용하는 것이 났다.
  문자열 상수를 + 연산자로 묶으면 컴파일러는 컴파일 타임에 하나의 문자열 상수로 만든다.
  + 연산자의 피연산자가 변수라면 String.Concat() 를 호출한다.


4. Summary

- StringBuilder 는 내부 문자열 버퍼를 유지하며 그 초기 값은 16이다.
- StringBuilder 는 내부 버퍼가 부족하게 되면 새로운 버퍼를 할당하며, 기존 버퍼의 내용을 복사하는 오버헤드 갖음.
- StringBuilder.ToString() 은 문자열을 새로이 생성하여 반환하므로 또 다른 오버헤드를 유발할 수 있다.
Posted by six605
,