'String'에 해당되는 글 1건

  1. 2008.11.25 String의 모든것!

요즘 저는 우리 제품의 코드 리뷰를 하고 있고 거기서 성능 이슈를 야기하는 문제점 몇 가지를 발견하였습니다. 그래서 코딩 표준화로 시스템의 성능을 형상시키는 방법을 공유하고 싶습니다.

 

1. String vs StringBuilder 

요즘 String은 개발자에게 일반적인 타입이 되었고 이것은 문자의 수를 표현합니다. 사실, String은 문자의 배열입니다.

 

String은 많은 개발자들이 다음과 같이 사용합니다.

 

String output = "";

output += "Hello";

output += " ";

output += "World";

 

System.Diagnostics.Debug.WriteLine(output);

 

 

output+=“xx" 을 호출했을 때 백엔드에서 어떻게 실행될까요? 실행해 봅시다.

 

Char[] tempValue = new Char[output.Length + "Hello".Length];

tempValue = output + "Hello";

Array.Clear(output, 0, output.Length);

output = null;

output = new Char[tempValue.Length];

output = tempValue;

Array.Clear(tempValue);

 

 

위 코드 처럼 Char 배열을 길이를 설정하고 문자열을 넣고 그 전의 문자열을 지우게 됩니다. 이런 작업을 문자열 연산이 있을 때 마다 진행합니다. 그러므로 문자열 연산이 자주 일어날 시에는 += 방법은 추천하지 않습니다.

 

StringBuilder는 동적 배열로 런타임에서 메모리에 할당됩니다. 여러분이 문자를 끝에서 추가 할 때 그 추가한 변수 값은 메모리에 할당되어서 문자열을 출력할 때 병합됩니다. 컴파일러는 StringBuilder를 제공하며, 이는 Append 메서드를 통한 변경은 지원합니다.

 

 

2. 문자열 추가

 String = “xxx” + yyy + “ “ + zzz

때때로 당신은 상기와 같은 형식으로 문자열이 필요합니다.

이 아티클을 읽은 후에는 다음과 같은 문자열 포맷을 이용하기를 바랍니다.

String.Format("xxx{0} {1}", yyy, zzz);

 

String.Format는 문자열을 포맷하는데 도움이 됩니다.

하지만 여러분이 다른 문자열 변수에 어떤 문자열을 추가하기를 원한다면 String.Format보다 String.Concat을 사용하는 게 성능상 효율적입니다.

String.Concat("xxx ", yyy, zzz); 

 

3. String.Equals vs String == CompareValue 

당신이 두 문자열을 비교할 경우, 정상적으로 당신은 String == CompareValue을 사용할 것입니다. 그러나 어떤 경우에는 원래의 문자열 비교 값과 같지 않는 경우가 있을 것입니다.( 대소문자를 구분하기때문에..) 
그래서 이런 경우는 저는 다음과 같이 사용했습니다.
 

String source = "abcdef";

String compareValue = "Abcdef";

if (source.ToLower() == compareValue.ToLower())

{

    //Do something

}

 

 

ToLower() or ToUpper() 둘 다 좋은 방법이긴 하지만 이는 가상 변수를 만드는 것으로 ToLower()를 호출 시에 다른 가상의 변수를 만들고 비교 값을 저장하게 됩니다. 비교하고 다시 그 가상변수를 없애는 작업을 하게 됩니다.

 

그러므로 개인적으로 다음 방법을 추천합니다.

이는 Object를 비교하는 방법으로 당신의 코드를 업데이트 시킬 수 있습니다. 

if (source.Equals(compareValue, StringComparison.OrdinalIgnoreCase))

  

4. String != null && String != “”  

내가 보는 것 중에 또 다른 것은 문자열을 확인하는 것입니다.

String source = "";

if  ((source != null) && (String != ""))

{

    //Do something

}

 

이는 다음과 같이 String.IsNullOrEmpty()을 사용할 수 있습니다.

if (String.IsNullOrEmpty(source))

{

    //Do something

}

 

StringBuilder에서 MaxCapacity속성을 통해 더 빠른 성능을 나타낼 수 있습니다. (MaxCapacity보유할 수 있는 최대 문자 수를 지정하는 것입니다.)

 

다음에는 배열(Array)에 대해 알아보겠습니다.

읽어 주셔서 감사합니다.

 
===============================================================================================
출처 : http://www.hoons.kr/Board.aspx?Name=cshaptip&Mode=2&BoardIdx=17164&Key=&Value=

신고
Posted by 사나에
TAG