본문 바로가기

C#/문자열

StringBuilder를 사용해 문자열 연결

문자열은 변하지 않는 객체이다.

일단 생성된 문자열은 두 번 다시 수정할 수 없다.

 

문자열이 변하지 않는 객체라는 사실은 안전이 확보된다는 관점에서 매우 좋은 일이지만

연결, 문자삽입, 문자 삭제와 같은 처리를 하려면 그때마다 새로운 인스턴스가 생성되므로 프로그램의 성능에 좋지 않은 영향을 준다.

var str = "ABC";
str = str + "XYZ";

문자열은 변하지 않는 객체이므로 기존 객체 "ABC" 뒤에 추가할 수 없다.
그래서 위와같은 코드가 실행되면 기존 객체 "ABC"는 더 이상 사용되지 않는 문자열이되고
새로 6자 만큼의 영역이 확보되고 거기에 "ABC"가 복사된 후 "XYZ"가 복사된다.

 

 

비효율적인 코드를 작성하지 않기 위해 .NET 프레임워크에는 StringBuilder라는 클래스가 마련돼 있다.

 

StringBuilder라는 클래스를 사용하면 문자열을 효율적으로 연결할 수 있다.

var sb = new StringBuilder(); //StringBuilder 객체 생성

foreach (var word in GetWords())
{
    sb.Append(word); //문자열 추가
}
var text = sb.ToString(); //문자열 변환
Console.WriteLine(text);

 

 

new로 StringBuilder 인스턴스를 생성할 때는 인스턴스의 초기 용량을 인수에 지정할 수 있다.

//처음에 200자만큼의 영역을 확보
var sb = new StringBuilder(200);

확보된 영역을 초과해서 문자를 추가하려고 했을 경우에도 자동으로 용량이 늘어난다.

 

만일 작성할 문자열의 크기를 대략적으로 알고 있을 경우에는 컴퓨터 내부에서 메모리를 확보하는 데 소모되는 비용을 절감하기 위해 생성자에서 용량을 지정해두는 것이 바람직하다.

 

생성자에서 인수를 생략할 경우에는 16자 만큼의 영역이 초기에 확보된다.

 

생성자에서는 초기화할 문자열을 지정할 수도 있고 최대 크기를 지정할 수도 있다.

 

Append메서드 외에도 AppendLine, AppendFormat, Insert, Remove, Replace와 같은 메서드가 마련돼 있다.

 

 

<어떤 상황에서 StringBuilder와 '+' 연산자를 각각 사용해야 할까?>

- StringBuilder를 사용하면 코드의 양이 늘어나고 가독성도 떨어지므로 너무 자주 사용하지 않도록 주의해야 한다.

 

  • 반복처리를 하지 않을 경우에는 '+' 연산자로 문자열을 연결한다.
  • foreach 문 등을 통해 반복해서 문자열을 연결할 경우에는 StringBuilder를 사용한다.
  • 단, 적은 횟수로 반복한다면 '+' 연산자를 사용한다.