C#에서 **string**은 텍스트를 나타내는 불변(immutable) 참조 타입입니다. 문자열은 보간(interpolation), 풍부한 메서드 라이브러리, 그리고 성능상 중요한 — 반복적인 수정을 효율적으로 처리하는 StringBuilder를 지원합니다.
문자열 보간과 생성
string name = "Ann";
int age = 30;
// 문자열 보간($) — 표현식을 직접 삽입
string msg = $"Hello {name}, you are {age} years old";
string formatted = $"Price: {price:C2}"; // {값:형식} — C2 = 통화, 소수점 2자리
// verbatim 문자열(@) — 이스케이프 없음, 여러 줄
string path = @"C:\Users\Ann"; // 백슬래시 그대로, \\ 불필요
string multi = """
Raw string literal
preserves formatting (C# 11)
""";
문자열 보간($"...")은 값과 형식 지정자를 삽입해 문자열을 만드는 현대적이고 읽기 쉬운 방법입니다. verbatim(@) 문자열은 이스케이프를 비활성화하고(경로/정규식에 좋음), raw 문자열 리터럴(""")은 여러 줄 텍스트를 다룹니다.
문자열은 불변이다
string s = "Hello";
s.ToUpper(); // 새 문자열 "HELLO"를 반환; s는 변하지 않음
s = s + " World"; // 새 문자열을 만듦; 이전 "Hello"는 버려짐
문자열을 "수정"하는 모든 연산은 실제로는 새 문자열을 만듭니다(불변성). 이는 안전하지만 반복 수정 시 성능 비용이 있습니다.
효율적인 문자열 구성을 위한 StringBuilder
// ❌ 루프 안에서 문자열 연결 — 매 반복마다 새 문자열 생성(느림, O(n²))
string result = "";
for (int i = 0; i < 10000; i++) result += i;
// ✅ StringBuilder는 버퍼를 변경 — 효율적(O(n))
var sb = new StringBuilder();
for (int i = 0; i < 10000; i++) sb.Append(i);
string final = sb.ToString();
루프에서 문자열을 구성할 때 **StringBuilder**는 많은 중간 문자열 생성을 피합니다 — 핵심 성능 관행입니다.
흔한 문자열 메서드
s.Length; s.ToUpper(); s.Trim(); s.Substring(0, 5);
s.Contains("x"); s.IndexOf("x"); s.Replace("a", "b");
s.Split(','); string.Join(",", items);
string.IsNullOrEmpty(s); string.IsNullOrWhiteSpace(s);
왜 중요한가
문자열 조작은 프로그래밍 전반에 퍼져 있으므로(출력 구성, 입력 처리, 데이터 형식화) C# 문자열을 이해하는 것은 필수적인 일상 지식입니다.
현대적 기능은 생산성에 중요합니다. 문자열 보간($"...")은 값과 형식을 삽입해 문자열을 만드는 깔끔하고 읽기 쉬운 방법이며, verbatim/raw 문자열 리터럴은 경로와 여러 줄 텍스트를 우아하게 처리합니다.
결정적으로, 문자열이 불변(모든 "수정"이 새 문자열을 만듦)이라는 점을 이해하면 핵심 성능 고려 사항이 설명됩니다. 순진한 루프 내 문자열 연결은 낭비적이며(O(n²), 많은 중간 문자열 생성), 반복 수정에는 StringBuilder(내부 버퍼를 효율적으로 변경)를 사용해야 한다는 것을 아는 것은 불변성 이해로부터 직접 나오는 중요한 실용 최적화입니다.
풍부한 문자열 메서드 라이브러리(검색, 치환, 분할/결합, 형식화), 현대적인 보간 구문, 불변성에 기반한 StringBuilder 관행을 아는 것은 프로그래밍에 끊임없이 등장하는 문자열 작업을 위한 핵심 지식입니다. 여기에서의 유창함, 특히 보간의 편리함과 StringBuilder의 성능 개선은 깔끔하고 효율적인 C#을 작성하는 데 기본이 됩니다.
