2023. 10. 13. 15:54ㆍC#
불변 객체 String
Value타입이 아닌 Ref타입입니다. 즉, 문자열을 조합할때마다 새로운 Class가 생성되며 이전의 데이터는 GC(가비지 콜렉터)에 의해 수집된다. 따라서 문자열을 조합할때마다 부하가 발생하게 된다.
이 경우 총 3개의 string 인스턴스가 생성되고 조합 과정에서 앞서 2개의 인스턴스는 GC에 의해 언젠가 수집될 것이다. 따라서 메모리 낭비가 발생하며 비효율적인 코드가 생성되는 것이다.
String은 왜 불변 객체가 되었을까?
(https://www.c-sharpcorner.com/UploadFile/230635/why-string-are-immutable-in-dotnet/) 외국 String Immutable 이유 번역





가변 객체 StringBuilder
Stringbuilder를 사용하면 문자열을 조합할때마다 새로운 변수를 생성할 필요가 없다. Stringbuilder 내부 자체적으로 함수를 가지고 있어서 값들을 조합하고 삭제할때 인스턴스를 추가발생시키지 않는다.
StringBuilder는 가비지가 정말 없는 것인가?
일단 string을 변경하면 새 객체가 생성되어 이전 객체는 가비지가 된다. 그럼 stringbuilder는 어떤 식이라 가비지 생성이 없는 걸까?
일단 stringbuilder는 16문자 크기의 자리를 잡게 된다. 일단 기본적으로 제공되는 16크기의 문자를 만들고 이를 꽉 채웠다고 하면 이동안 stringbuilder에서 가비지를 생성하지 않는다.
이제 꽉 채운 상태에서 append를 하게 되면 더 큰 용량의 버퍼가 잡히게 되고 원래 버퍼의 데이터가 새 버퍼에 복사되는 과정이 필요하게 된다. 이 과정에서 이전의 버퍼는 GC의 수거대상이 되는 것이다.
여기까지가 닷넷 4.0까지의 이야기라고 한다. 지금은 새 버퍼를 할당한 뒤 링크를 구성한다고 합니다. 때문에 복사, 이전 버퍼가 가비지가 되는 등의 일은 없어져 성능이 이전보다 좋아졌다는 것입니다.
출처: https://husk321.tistory.com/357 [껍데기방:티스토리]
결론
이와같은 String과 StringBuilder를 그러면 언제 사용해야 하는지가 가장 중요할 것이다.
문자열의 추가, 수정, 삭제에 있어 빈번하게 발생할 경우 string보다 stringbuilder가 더 효율적일 것이다.
String
- 문자열 수정이 적고 반복적인 작업이 아닌 경우 (성능 향상)
- 문자열의 수가 적을 경우 (stringbuilder는 string에 비해 무시해도 좋을 정도의 성능향상을 보이거나 전혀 없을수가 있다)
- 문자열을 작성하는 동안 광범위한 검색 작업이 예상될때 (왜냐하면 stringbuilder에는 IndexOf 또는 StartWith같은 함수가 없기 때문이다)
StringBuilder
- 문자열 수정이 빈번하고, 반복적인 작업일 경우
- 많은 수의 문자열 조합 또는 결합이 필요한 경우
- 응용 프로그램이 설계시에 알 수 없는 횟수의 문자열을 변경해야 할 때 (사용자의 입력등으로 문자열 조합이 이루어질 때)
'C#' 카테고리의 다른 글
프로퍼티 (Property) (0) | 2023.10.10 |
---|---|
C# 작동 방식 .Net Framework, CLR (0) | 2023.10.09 |
C# LINQ(Language-Integrated Query) (0) | 2023.10.08 |
C# 콜백, 델리게이트, 이벤트 (0) | 2023.10.07 |