본문 바로가기
개발/Unity 내일배움캠프 TIL

C# StringBuilder 정리

by 석시 2023. 8. 28.



기존 string의 문제점

사실 StringBuilder의 메서드들을 잘 보다보면, 기존 string에도 이미 있는 기능들이다.

그러면 StringBuilder를 왜 쓰느냐? 하면 C#의 string은 조작을 가하기에는 매우 부적절한 자료형이기 때문이다.

다음 코드를 보자.

string s = "a" + "b";

s“ab”가 저장되는 아주 간단한 코드이다.

이 간단한 코드에 객체 선언이 몇 번이나 될까?

  • string s를 선언할 때
  • “a”를 위한 string
  • “b”를 위한 string
  • “a” + “b”의 결과를 저장하기 위한 string

마지막 string이 뭔가 이상하지 않은가?

그렇다. string에 변형이 가해질 때마다 그냥 새로운 string 객체를 만들어버린다!

string은 대표적인 불변(Immutable) 타입이기 때문이다.

값을 변경하면 해당 위치 메모리의 데이터를 바꾸는 것이 아닌 그냥 새로운 내용의 객체를 참조해버리는 식으로 값을 바꾸는 것이다.

intchar 같은 byte 단위의 자료형이라면 크게 문제가 없겠지만, string은 여러 char의 집합으로 이루어져 있기 때문에 메모리가 낭비될 우려가 존재한다.

StringBuilder

따라서 동적으로 크기를 결정하는 StringBuilder가 등장했다.

변경 사항이 생기면 객체를 새로 선언해버리는 string과 다르게, StringBuilder의 값들은 모두 힙 메모리에서 동적으로 존재하기 때문에 내용을 변경해도 추가적인 객체 선언 없이 값을 삽입 및 제거할 수 있다.

이러한 가변성과 효율성 때문에 string 조작 시 추가적인 메모리 할당이 발생하지 않고, 메모리 할당 및 해제에 필요한 오버헤드도 없어지게 된다.

처음부터 잘만들지 왜 이렇게 만들었나요? 라고 물어볼 수 있겠다.

사실 기존의 string도 장점이 있는데, 정적으로 선언하기 때문에 성능이 더 좋다.

배열 vs List 때 이야기와 비슷하지 않은가?

따라서 변경 사항이 적은 경우는 기존의 string을, 변경을 자주해줘야 하는 문자열의 경우는 StringBuilder의 사용이 권장되고 있다.

StringBuilder 생성자

using System.Text;

StringBuilder sb1 = new StringBuilder();
StringBuilder sb2 = new StringBuilder(13);
StringBuilder sb3 = new StringBuilder("Hello, World!");
StringBuilder sb4 = new StringBuilder("Hello, World!");

생성자에 넣어주는 stringStringBuilder를 주어진 문자열로 초기화하기 위함이고,

int값을 넣어주는 것은 StringBuilderCapacity를 초기화하기 위함이다.

MaxCapacityint의 최댓값이다.

StringBuilder 메서드

  • Append: 문자열을 뒤에 추가합니다.
StringBuilder myStringBuilder = new StringBuilder("Hello World!");
myStringBuilder.Append(" What a beautiful day.");
Console.WriteLine(myStringBuilder);
// The example displays the following output:
//       Hello World! What a beautiful day.

  • Insert: 문자열을 지정한 위치에 삽입합니다.
StringBuilder myStringBuilder = new StringBuilder("Hello World!");
myStringBuilder.Insert(6,"Beautiful ");
Console.WriteLine(myStringBuilder);
// The example displays the following output:
//       Hello Beautiful World!

  • Remove: 지정한 위치에서 문자열을 제거합니다.
StringBuilder myStringBuilder = new StringBuilder("Hello World!");
myStringBuilder.Remove(5,7);
Console.WriteLine(myStringBuilder);
// The example displays the following output:
//       Hello

  • Replace: 문자열의 일부를 다른 문자열로 대체합니다.
StringBuilder myStringBuilder = new StringBuilder("Hello World!");
myStringBuilder.Replace('!', '?');
Console.WriteLine(myStringBuilder);
// The example displays the following output:
//       Hello World?

  • Clear: StringBuilder의 내용을 모두 지웁니다.

골때리는 것이 검색 관련 메서드가 없다!

따라서 해당 부분은 기존의 string을 사용하는 것이 좋다.


Uploaded by N2T