결국 코딩테스트에서 시간 복잡도로 인해 사용하게 되었다
StringBuilder 시간복잡도 n
string 시간복잡도 n^2
for문안에서 string str에 str += c; 형식으로 넣어줬는데
넣어줄때마다 계속 재할당을 해서 시간복잡도 n^2라고 한다
이유는 기존 str의 내용을 복사해서 새 문자열 생성한다음, c의 문자를 뒤에 붙여서 새문자열을 생성하기 때문 (추가할때마다 작업 2번씩함)
Append만 사용해봐서 Append만 추가
using System.Text; 추가해야함
StringBuilder sb = new StringBuilder();
sb.Append("hello"); //추가
string str = sb.ToString(); // str에 sb의 내용 넣기
Append(): 문자열을 StringBuilder 객체의 끝에 추가합니다.
Insert(): 문자열을 지정된 인덱스에 삽입합니다.
Remove(): 지정된 인덱스에서 지정된 길이만큼 문자열을 삭제합니다.
Replace(): 지정된 문자열을 특정 문자열로 변경합니다.
string은 불변 타입이다.
한번 문자열을 변경 할때마다 새로운 문자열 객체가 생성되기때문에 아래 문제가 발생한다
불변성과 가변성이란?
StringBuilder는 가변 타입이다.
한번 문자열을 변경 할 때마다 힙에 있는 데이터를 변경한다.
StringBuilder은 얕은복사, 참조한 곳이 같은 경우 값이 같이 바뀐다
string은 깊은복사, 서로 참조해도 각자의 고유한 값을 가진다
class Program
{
static void Main(string[] args)
{
//1. String
string str1 = "a";
string str2 = str1;
str1 = "edit";
Console.WriteLine(str1); //출력: edit
Console.WriteLine(str2); //출력: a (서로 값이 다름)
//2. StringBuilder
StringBuilder sb1 = new StringBuilder("Hello");
StringBuilder sb2 = sb1; //얕은복사
sb1.Append(" !!"); //Hello !! 가 됨
Console.WriteLine(sb1.ToString()); // 출력: Hello !!
Console.WriteLine(sb2.ToString()); // 출력: Hello !! (얕은복사로 sb1과 값같아짐)
}
}
StringBuilder는 UI에서 텍스트에 유용하게 쓰일 것이라고 생각한다
UI에는 점수들이 실시간으로 갱신되어야 한다면?
많은 문자열이 수정될텐데 그때 사용하면 좋을 것이다
이미 문자열은 string이라는 좋은 것이 있는데 StringBuilder가 왜 존재하는지는 생각해보지 못했다.
이번에 조사를 통해 고려해볼만한 StringBuilder를 알게되었다.