String.IndexOf() 메서드의 함정

[제목] String.IndexOf() 메서드의 함정

문자열 처리는 프로그래머들이 가장 먼저 배우는 영역이고 거의 모든 어플리케이션에 사용되므로 대부분 능숙하게 다루는 분야이다. 하지만, 그럼에도 불구하고 예기치 못한 버그가 잘 발생하는 분야이기도 하다. 이의 한 예로 String 클래스의 IndexOf() 메서드 사용에 있에 주의해야 할 점을 들어 보겠다.

아래의 예제에서 FilterData() 메서드는 문자열 리스트와 필터링할 문자열을 전달받아, 리스트 아이템 중 해당 필터링 문자열이 들어 있는 아이템 문자열을 출력하는 함수이다. 그리고 여기서는 String 클래스의 IndexOf()를 사용하여 구현하였다. (물론 다른 방식이 있지만, 예를 들기 위해)

void FilterData(IList list, string filter)
{
    foreach (var item in list)
    {
        if (item.IndexOf(filter) >= 0)
        {
            Console.WriteLine(item);
        }
    }
}

void Caller()
{
    List list = new List()
    {
        "Filename is Fs100.txt", 
        "Filename is fS100.txt", 
        "Filename is fs100.txt", 
        "Filename is TS100.txt", 
    };

    FilterData(list, "FS100.txt");
}

예상하는 결과는 처음 3개의 리스트 아이템이 출력되는 것인데, 언뜻 보기에 아무 문제가 없어 보이는 위의 코드는 실제 아무것도 출력하지 않는다.

원인은 생각보다 간단하다. IndexOf() 메서드가 대소문자를 구분해서 FS, Fs, fs, fS 를 서로 다른 문자열로 인식하기 때문이다. 따라서, 문자 비교전에 대소문자를 소문자나 대문자로 일괄 변경하거나 StringComparision 옵션을 사용하여야 한다. 아래 해결 예제는 StringComparison.OrdinalIgnoreCase 사용하여 문자열 비교에 있어 대소문자를 하지 말도록 옵션을 주고 있다.

  if (item.IndexOf(filter, StringComparison.OrdinalIgnoreCase) >= 0)



본 웹사이트는 광고를 포함하고 있습니다. 광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.