기존 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) 타입이기 때문이다.
값을 변경하면 해당 위치 메모리의 데이터를 바꾸는 것이 아닌 그냥 새로운 내용의 객체를 참조해버리는 식으로 값을 바꾸는 것이다.
int
와 char
같은 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!");
생성자에 넣어주는 string
은
StringBuilder
를 주어진 문자열로 초기화하기 위함이고,
int값을 넣어주는 것은
StringBuilder
의 Capacity
를 초기화하기 위함이다.
MaxCapacity
는 int
의 최댓값이다.
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
'개발 > Unity 내일배움캠프 TIL' 카테고리의 다른 글
C# Enumerable 인터페이스 (0) | 2023.08.30 |
---|---|
C# Action으로 종속성 없애기..? (0) | 2023.08.29 |
C# LINQ 간단 정리 (0) | 2023.08.25 |
C# 값 vs 참조 형식 (Value vs Reference) (0) | 2023.08.24 |
C# Sort() 메서드 다루기 (0) | 2023.08.23 |