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

+ Recent posts