44. 문자열 비교·정렬·대소문자 변환의 문화권 의존성 (Ordinal vs Culture)
난이도 중 해설 보기 →
결함을 모두 찾고 원인·수정안·더 나은 설계를 제시하라. 마커
(A)(B) 는 주목 위치 힌트다.
결함 코드 · C#
// [주제] 문자열 비교·정렬·대소문자 변환의 문화권(culture) 의존성
//
// [과제]
// 1. 아래 프로그램의 각 출력 지점(A~F)에서 무엇이 출력될지 예측하시오. 실행 환경의
// CurrentCulture 가 "en-US" 인 경우와 "tr-TR"(터키어) 인 경우를 나누어 답하시오.
// 2. string.Equals, ==, CompareTo, IndexOf, StartsWith, ToUpper 각각이 기본으로 어떤
// 비교 방식을 사용하는지 정리하고, 그 기본값이 왜 그렇게 정해졌는지 설명하시오.
// 3. Ordinal 비교와 Culture-sensitive 비교가 내부적으로 어떻게 다르게 동작하는지
// (정렬 키 생성, 유니코드 정규화, 가중치) 설명하시오.
// 4. Dictionary<string, T> 의 키 비교자로 무엇을 써야 하는지, 잘못 선택하면 어떤 문제가
// 생기는지 설명하시오.
//
// 게임서버 맥락: 캐릭터명 중복 검사, 채팅 금칙어 필터, 아이템 코드 조회, 명령어 파싱,
// 서버 간 정렬된 목록 동기화에서 이 차이가 버그로 이어진다.
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Threading;
class Program
{
static void Run(string cultureName)
{
Thread.CurrentThread.CurrentCulture = new CultureInfo(cultureName);
Console.WriteLine($"--- culture = {cultureName} ---");
string a = "INDIGO";
string b = "indigo";
Console.WriteLine($"A: {a.ToLower() == b}");
Console.WriteLine($"B: {string.Equals(a, b, StringComparison.OrdinalIgnoreCase)}");
Console.WriteLine($"C: {string.Equals(a, b, StringComparison.CurrentCultureIgnoreCase)}");
string cmd = "FILE_UPLOAD";
Console.WriteLine($"D: {cmd.ToLower().StartsWith("file")}");
string s1 = "co-op";
string s2 = "coop";
Console.WriteLine($"E: {string.Compare(s1, s2)} {string.CompareOrdinal(s1, s2)}");
var names = new List<string> { "Zulu", "apple", "Ápple", "Banana" };
names.Sort();
Console.WriteLine("F: " + string.Join(",", names));
}
static void Main()
{
Run("en-US");
Run("tr-TR");
}
} 내 리뷰 · C#
내 답안 · 자동 저장
작성 후 위 해설 보기에서 모범 해설과 대조하세요.