숏컷 코드
string title = "RefDock";
int length = title.Length;
bool hasDock = title.Contains("Dock");
string upper = title.ToUpper();
string raw = " apple,banana,orange ";
string cleaned = raw.Trim();
string[] items = cleaned.Split(',');문법
어떤 문자열 작업이 먼저 나오나
| 작업 | 먼저 떠올릴 것 |
|---|---|
| 앞뒤 공백 제거 | Trim() |
| 포함 여부 확인 | Contains() |
| 시작/끝 비교 | StartsWith(), EndsWith() |
| 쪼개기 | Split() |
| 이어 붙이기 | $"", string.Concat, StringBuilder |
| 대소문자 무시 비교 | StringComparison.OrdinalIgnoreCase |
문자열은 불변(immutable)이다
string은 참조 타입이지만 한 번 만들어지면 내용을 바꿀 수 없습니다. Trim(), ToUpper(), Replace() 같은 메서드는 원본을 수정하지 않고 새 문자열을 반환합니다. 따라서 반환값을 변수에 담지 않으면 아무 효과가 없습니다.
string s = " hello ";
s.Trim(); // ❌ 반환값을 버림 — s는 그대로
s = s.Trim(); // ✅ 결과를 다시 s에 대입해야 반영불변성 덕분에 문자열을 여러 변수가 공유해도 한쪽이 바뀔 걱정이 없습니다. 대신 루프 안에서 +로 문자열을 계속 이어 붙이면 매번 새 객체가 만들어져 성능 문제가 생깁니다.
루프 안 연결에는 StringBuilder를 쓴다
// ❌ 매 반복마다 새 string 객체 생성 → O(n²) 복사 비용
string result = "";
foreach (var word in words)
result += word + " ";
// ✅ StringBuilder는 내부 버퍼를 재사용 → O(n)
var sb = new StringBuilder();
foreach (var word in words)
sb.Append(word).Append(' ');
string result = sb.ToString();단순히 몇 개를 이어 붙이는 경우라면 $"" 보간이나 string.Concat이 더 간결합니다. StringBuilder가 의미 있는 것은 반복 횟수가 클 때입니다.
비교는 방식을 명시한다
==는 서수(ordinal) 비교를 하므로 대소문자를 구분합니다. 사용자 입력, 파일 경로, 설정 키처럼 문화권·대소문자를 고려해야 하는 비교는 StringComparison을 직접 지정하는 편이 안전합니다.
// 대소문자 무시 비교
bool match = string.Equals(a, b, StringComparison.OrdinalIgnoreCase);
// 정렬에는 문화권 인식 비교
int order = string.Compare(a, b, StringComparison.CurrentCulture);// ❌ 문화권/대소문자 의도를 숨긴 비교
if (input.ToLower() == "yes")
{
Approve();
}
// ✅ 비교 규칙을 직접 지정
if (string.Equals(input, "yes", StringComparison.OrdinalIgnoreCase))
{
Approve();
}자주 쓰는 메서드
string s = "Hello, World!";
s.Length // 13
s.Contains("World") // true
s.StartsWith("Hello") // true
s.IndexOf(',') // 5
s.Substring(7) // "World!"
s.Replace("World", "C#") // "Hello, C#!"
s.ToLower() // "hello, world!"
s.Trim() // 앞뒤 공백 제거
s.Split(", ") // ["Hello", "World!"]
string.IsNullOrWhiteSpace(s) // false체크포인트
| 상황 | 권장 방법 |
|---|---|
| 짧은 연결 (수 개) | $"" 보간 또는 + |
| 루프 안 반복 연결 | StringBuilder |
| 대소문자 무시 비교 | StringComparison.OrdinalIgnoreCase |
| null·빈 문자열 동시 확인 | string.IsNullOrWhiteSpace() |
| 메서드 결과 반영 | 반환값을 반드시 변수에 대입 |
주의할 점
메서드 반환값을 버리면 아무 일도 일어나지 않습니다. s.Trim()은 s를 직접 바꾸지 않습니다. 반드시 s = s.Trim()처럼 결과를 받아야 합니다.
+로 문자열을 수백 번 이어 붙이는 루프는 이차 복잡도(O(n²)) 문제를 일으킵니다. 처음에는 괜찮아 보여도 데이터가 커지면 급격히 느려지므로, 반복 횟수가 예측 가능하지 않다면 StringBuilder를 먼저 검토하는 편이 좋습니다.
ToLower()나 ToUpper()로 양쪽 문자열을 미리 바꾼 뒤 비교하는 습관은 불필요한 문자열 할당을 만듭니다. 비교 규칙만 필요하면 StringComparison 인자를 넘기는 쪽이 더 직접적이고 안전합니다.
참고 링크
3 sources