C#에는 문자열 데이터를 저장하기 위한 타입 string이 존재한다.
오늘 게시글에선 C# string의 특징에 대해 자세히 알아보려고 한다.
참조형(Reference Type)
string은 int, float와 같은 기본형 타입으로 제공하는 것이 아닌,
namespace System.String의 별칭이다.
기본적으로 참조값 형태로 데이터가 저장되며, 그로 인해 스택 영역이 아닌 힙 영역에 데이터가 저장된다.
string이 참조형으로 설계된 이유는 데이터의 크기가 가변적이기 때문이다.
크기가 작을 경우 값 형식으로 설계하는 것이 맞지만,
앞서 말했듯이 크기가 가변적이기 때문에 크기가 클 수가 있다.
크기가 클 경우 복사 비용의 부담이 커 비효율적이기 때문에 참조형식을 통해 메모리의 효율성을 높였다.
불변성(Immutable)
string은 한 번 생성된 문자열을 변경할 수 없는 불변 객체(Immutable object)이다.
즉, 문자열 일부를 변경하게 될 경우 기존 문자열에서 수정되는 것이 아닌 새로운 문자열 객체를 생성하는 것이다.
string str1 = "ABC"; // ABC
string str2 = str1; // ABC
str1 = "CCC";
// str1 : CCC
// str2 : ABC
string이 불변성으로 설계된 이유는 문자열 interning이라는 최적화 기법을 사용하기 위해서이다.
이 최적화 기법은 동일한 문자열에 대해 여러 번 사용될 경우,
새로운 객체를 생성하는 것이 아닌 기존 동일한 문자열 객체를 재사용하는 기법이다.
string str1 = "Hello";
string str2 = "Hello";
bool ObjectEqual = Object.ReferenceEquals(str1, str2); // true
마무리
기본적으로 string 타입(클래스)은 최적화를 위해 설계가 되어있으나,
사용하는 방식에 따라 전체적인 성능에 있어 악영향을 끼칠 수 있다.
문자열 데이터를 변경할 때 마다 새로운 객체를 생성(동일한 문자열이 메모리에 없을 시)을 하게될 것 이고,
그로 인해 이전 데이터 같은 경우 더 이상 참조하지 않으면 GC(Garbage Collector)에 의해 수집될 것 이다.
이러한 현상이 반복되면 잦은 GC 호출을 초래하게 되고,
그로 인한 프레임 드랍과 같은 영향을 끼칠 수 있기 때문에
StringBuilder 혹은 String.Format 메소드와 같은 최적화 기법을 통해 효율적으로 사용하는 것이 좋다.
참고 문서 : https://learn.microsoft.com/ko-kr/dotnet/csharp/programming-guide/strings/
'C#' 카테고리의 다른 글
[C#] 가비지 컬렉터(Garbage Collector) (0) | 2024.07.13 |
---|