Quick Reference
string은 불변입니다. Trim, Replace, ToUpper 같은 호출은 원본을 바꾸지 않고 결과 문자열을 반환합니다. 식별자·프로토콜 값은 StringComparison.Ordinal 또는 OrdinalIgnoreCase를 명시해 비교하고, null·공백 입력은 string.IsNullOrWhiteSpace로 먼저 구분합니다.
string raw = " Mina, Jin, ";
string[] names = raw
.Split(',', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries);
bool sameUser = string.Equals(
names[0], "mina", StringComparison.OrdinalIgnoreCase);text = text.Trim()처럼 반환값을 받아야 내용이 바뀝니다.Contains,StartsWith,EndsWith도 비교 규칙을 받는 오버로드를 우선 사용합니다.- 화면에 보이는 글자 수와
string.Length는 다를 수 있습니다.Length는 UTF-16 code unit 수입니다.
불변성, null, 빈 값
string은 참조 타입이지만 내용은 변경할 수 없습니다. 같은 문자열을 여러 변수가 참조해도 한 쪽의 Replace가 다른 쪽을 바꾸지 않습니다. 반환값을 버리면 아무 변화도 없습니다.
string title = " RefDock ";
title.Trim(); // title은 그대로
title = title.Trim(); // "RefDock"
bool missing = string.IsNullOrWhiteSpace(title);
string display = title ?? "Untitled";인스턴스 메서드는 receiver가 null이면 호출할 수 없습니다. null도 허용하는 입력은 정규화 전 IsNullOrWhiteSpace, string.Equals, string.Compare 같은 static API로 처리하거나 명확한 guard clause를 둡니다. 빈 문자열 "", 공백만 있는 문자열, null은 업무 규칙상 서로 다른 값일 수 있으므로 하나로 뭉개기 전에 정책을 정합니다.
분리, 결합, 검색
Split은 새 배열과 부분 문자열을 만들 수 있으므로 대량 입력을 반복 처리할 때 비용을 의식합니다. 빈 토큰을 버리고 공백을 정리하는 입력 파싱에는 StringSplitOptions를 함께 지정합니다.
string csv = " red, , blue ,green ";
string[] colors = csv.Split(
',',
StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries);
string joined = string.Join("/", colors); // red/blue/green
string normalized = csv.Trim().Replace(" ", "");검색에는 Contains, IndexOf, StartsWith, EndsWith를 사용합니다. 단순 텍스트 검색에서 대소문자 규칙이 중요하면 StringComparison 오버로드를 선택합니다.
bool isReadme = fileName.EndsWith(".md", StringComparison.OrdinalIgnoreCase);
bool hasError = message.Contains("error", StringComparison.OrdinalIgnoreCase);
int separator = value.IndexOf(':', StringComparison.Ordinal);몇 조각만 결합할 때는 보간 또는 string.Concat, 컬렉션 결합에는 string.Join이 읽기 좋습니다. 반복적으로 많은 조각을 추가하는 경우는 StringBuilder가 맞습니다.
비교 규칙
문자열 비교는 “어떤 문자가 같은가”와 “어떤 문화권의 언어 규칙을 따르는가”를 함께 정하는 일입니다. 파일 확장자, 프로토콜 토큰, 키, 사용자명처럼 언어학적 정렬이 아닌 값은 보통 Ordinal 또는 OrdinalIgnoreCase를 사용합니다.
bool isJson = extension.Equals(".json", StringComparison.OrdinalIgnoreCase);
int order = string.Compare(left, right, StringComparison.CurrentCulture);사용자에게 표시하는 정렬·검색처럼 언어 규칙이 의미 있는 경우에는 CurrentCulture 또는 명시한 culture의 비교 규칙을 사용합니다. 양쪽에 ToLower()나 ToUpper()를 먼저 적용해 비교하면 할당이 늘고 문화권 의도가 숨습니다. 비교 API에 규칙을 직접 넘깁니다.
Unicode와 길이
Length와 인덱서는 UTF-16 code unit을 기준으로 합니다. 이모지, 결합 문자, 일부 보충 평면 문자는 사람이 보는 글자 하나가 두 개 이상의 code unit일 수 있습니다.
string emoji = "😀";
Console.WriteLine(emoji.Length); // 2텍스트를 표시 폭, 사용자 입력 글자 수, grapheme cluster 단위로 다뤄야 한다면 Length나 char 반복만으로 처리하지 않습니다. Unicode scalar value는 System.Text.Rune, 사람이 인식하는 text element는 System.Globalization.StringInfo처럼 요구에 맞는 API를 검토합니다.
자주 틀리는 부분
Trim,Replace,PadLeft는 원본을 변경하지 않습니다.ToLower()뒤==비교로 대소문자 규칙을 우회하지 않습니다.Split결과의 빈 항목과 공백을 입력 검증 정책 없이 그대로 사용하지 않습니다.Length == 1이 사용자에게 보이는 문자 하나라는 보장은 없습니다.
참고 링크
3 sources