소프트웨어/C# & ASP.NET

문자열 비교 - 팁

falconer 2009. 12. 9. 09:51
유경상님에 문자열 비교 팁

Tip about String Compare

문자열 비교에서 팁 하나를 소개하고자 한다. 문자열을 비교할 때 효율성을 고려해야 할 것이 한두 가지가 아닐 것이지만 흔히 지나치는 것 중 하나가 대소문자 구별 없이 비교를 하는 경우이다. 기본적으로 String.Equals 메소드는 대소문자를 구별하여 비교를 수행한다. 그리고 VB.NET 에서 = 연산자를 이용하여 문자열 비교를 하는 경우도 마찬가지다. 이 때문에 대소문자에 관계 없이 문자열을 비교하고자 할 때 흔히 사용하는 방법은 비교 대상을 모두 대문자로 바꾸거나 모두 소문자로 바꾸어 비교하곤 한다.

// 대소문자에 관계없는 문자열 비교 C# 코드 예제
if (s1.ToUpper() == s2.ToUpper()) {
    // 동일한 문자열
}
else {
    // 동일하지 않은 문자열
}

위 코드는 잘 작동하지만 효율적이라고 볼 수 없다. 왜냐면 ToUpper() 메쏘드 호출은 대문자로 변경된 새로운 문자열 객체를 반환한다는 점이다. 문자열은 변경되지 않는 immutable 임을  잊지 말자. 따라서 위 코드는 불필요하게 문자열 객체 2개를 만들어 내며 이 문자열 객체는 곧바로 GC 의 대상이 되는 쓰레기로 전락한다.

보다 효율적인 것은 String.Compare 메쏘드를 사용하는 것이다. 이 메쏘드는 비교 옵션을 매개변수로 취할 수 있다. 이 옵션 중에 IgnoreCase 옵션을 사용하면 대문자/소문자에 관계 없이 비교를 해준다. 물론 앞서의 예제처럼 불필요한 문자열 객체를 생성하는 일은 없다.

// 보다 효율적인 코드 예제
if (String.Compare(s1,s2, CompareOptions.IgnoreCase) == 0) {
    // 동일한 문자열
}
else {
    // 동일하지 않은 문자열
}

출처 : http://www.simpleisbest.net/archive/2005/06/08/158.aspx