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#
내 답안 · 자동 저장

작성 후 위 해설 보기에서 모범 해설과 대조하세요.