C#

2024 내일 배움캠프(Unity_6기) _ 사전캠프 7일차(08.21) : String 과 StringBuilder에 대해 알아보자

근본넘치는개발자 2024. 8. 21. 17:45

오늘은 String과 StringBuilder에 대해 알아보고자 합니다.

 

 

String 클래스에서 메서드 중 하나를 사용할 때마다

메모리에 새 문자열 개체가 생성되므로, 새 개체에 대한 공간을 새로 할당해야 합니다.

 

이는 한번 값이 정해진 뒤 수정할 수 없기 때문입니다.

 

그럼 왜 string이 변경 불가능하게 설계가 되었을까요?

찾은 자료를 요약하자면 다음과 같습니다.

 

1 . 같은 값을 가진 여러 문자열 변수를 가지고 있다면

같은 문자열 값에 대한 메모리를 여러 번 할당하지 않아도 된다. 

 

2. 멀티스레드 애플리케이션에서 경쟁 조건을 제거하여 빠르게 변경할 수 있다.

 

3.  해시테이블에서 문자열을 키로  잘 적용하기 위해서이다.

 

-> 해시 값이 계산되는 객체는 해시 값이 시간에 따라 일정하도록

보장하기 위해 불변성이어야 한다.

 

 

왜 string이 변경 불가능한지와 그 원리에 대해 설명하는 내용이 담긴 원본 글입니다.

그림 설명을 보면 이해가 더 쉽습니다.

 

https://www.c-sharpcorner.com/UploadFile/230635/why-string-are-immutable-in-dotnet/

 

Why Strings Are Immutable in .Net

Explore the concept of immutable strings in .NET, understanding how strings are allocated in memory, and why they are immutable. Learn how immutability enhances memory management, prevents race conditions in multi-threaded applications, and optimizes hash

www.c-sharpcorner.com

 

 

문자열을 반복적으로 수정해야 하는 경우

새로운 string 개체 생성과 관련된 오버헤드로 인해 비용이 증가할 수 있습니다.

 

이를 해결하기 위해 StringBuilder를 사용하는 방법이 있습니다.

 

 

사용 방법은 다음과 같습니다.

 

주요 메서드


Append: 문자열을 뒤에 추가합니다.
Insert: 문자열을 지정한 위치에 삽입합니다.
Remove: 지정한 위치에서 문자열을 제거합니다.
Replace: 문자열의 일부를 다른 문자열로 대체합니다.
Clear: StringBuilder의 내용을 모두 지웁니다.

 


// 개체 인스턴스화 하여 사용
StringBuilder myStringBuilder = new StringBuilder(); 


// 용량 및 길이 설정 
// 길이를 넘어갈 경우, 새 공간이 자동으로 할당 : 용량이 두배 증가 
// 버퍼를 연결리스트로 관리하기에 String과 달리 동적 할당 가능

StringBuilder myStringBuilder = new StringBuilder("Hello World!", 25); 


//일반적으로 append를 사용해 문자열 끝에 텍스트 추가로 주로 사용

StringBuilder myStringBuilder = new StringBuilder("Hello World!");
myStringBuilder.Append(" What a beautiful day.");
Console.WriteLine(myStringBuilder);

//output: Hello World! What a beautiful day.

 

 

 

다음은 참고한 마이크로 소프트의 문서입니다.

https://learn.microsoft.com/ko-kr/dotnet/standard/base-types/stringbuilder#modifying-the-stringbuilder-string

 

.NET에서 StringBuilder 클래스 사용 - .NET

.NET에서 StringBuilder 클래스를 사용하는 방법을 알아봅니다. 이 클래스를 사용하면 새 개체를 만들지 않고 문자열을 수정합니다.

learn.microsoft.com

 

 

https://im-first-rate.tistory.com/145

 

[C#] StringBuilder를 사용해야 하는 이유

문자열을 사용하다 보면, 예제로 자주 등장하는 StringBuilder 클래스를 한 번쯤은 봤을 것이다. 그리고 그 것을 응용해서 우리가 프로그래밍을 하면서도 사용해 봤을 것이다. 나도 그렇지만 다른

im-first-rate.tistory.com

 

위 블로그 내용을 보니 시간적인 측면에서도 차이가 꽤 나는걸 알 수 있었습니다.

 

 

물론 그렇다고 무조건 StringBuilder만 사용하는 게 좋은 건 아닌 것 같습니다.

 

효율성 및 StringBulder에 대해 자세하게 정리해 놓은 블로그 내용을 찾았는데,

무단으로 복제하지 말라고 명시하셔서 링크를 남깁니다.

 

http://www.simpleisbest.net/post/2013/04/24/Review-StringBuilder.aspx

 

SimpleIsBest.NET | StringBuilder 다시 보기

최근 구글 웹로그 분석에서 이 블로그의 방문자를 살펴보다가 아주 오래된 문서들이 여전히 참조되고 있다는 것을 알았습니다. 그래서 시간이 날 때마다 이전 글 중에서 업데이트가 필요한 글

www.simpleisbest.net

 

 

예전 글이긴 하나 원리에 대해 세세하게  설명하고 있어서

이해하는데 도움이 많이 되었습니다.

꼭 한번 읽어보시길 추천합니다.

 

 

결론

기억해두었다가 필요할때  상황에 맞게 적절하게 사용하자.