프로그래밍/Tip Posting

String, Stringbuilder, StringBuffer 차이

InTheStorm 2014. 5. 16. 14:56
반응형
SMALL

일단

Stringbuilder,  StringBuffer 차이는 쓰레드에 대한 동기화 보장성을 버퍼는 해주고 빌더는 못한다는 점.

이라고 하니 성능상 차이는 없는 것으로 간주하고

 

문자열 연산을 할때 주로 사용하는 것은

 

스트링의 + 연산자 , concat함수, 스트링빌더의 append 함수....

 

<스트링과 빌더의 차이>

string 연산은 새로운 문자열을 생성하여 복사하는 형식인데, 문자열 생성에는 new가 호출된다.

이 new가 많이 호출되면 당연히 성능상 느리다. 그런점에서 빈번하게 발생하는 코드나 반복문 내에 사용되는 경우 한번만 new를 호출하는 빌더를 사용하는 것이 유리하다. (이 빈번함의 기준은 500회~1200회 이상일 경우에나 성능차이가 난다고 하는데, 그냥 코딩하면서 생각하기에 빈번하게 발생하는지는 본인이 판단할수 있을듯)

스트링빌더의 장점은 new로 인한 오버헤드 횟수를 줄이자는 취지인데 , 스트링빌더의 메모리배열은(기본 16글자 저장공간으로 생성된다) 가득찬 문자열이 아니라면  그 자체로 오버헤드인건 아이러니...


결론 : 빈번하게 호출되는 함수속 코드나 반복문 안의 코드의 경우를 제외하면 스트링은 충분히 빌더만큼 빠르고 가독성이나 코딩에 장점이 많다. 상황에 맞춰 사용하자.

 


<스트링의 두방법을 비교해보면>

1) +의 경우 빌더를 호출하여 new할당하고 합친다는 이야기도 있고 (이 경우 +보다 concat이 두배정도 빠른것으로 구글링)

2) C#, VB.NET 컴파일러가 문자열의 + 연산자를 String.Concat 메쏘드 호출로 컴파일 해준다??는 글을 본적이 있는데 맞다면 +연산이나 concat을 동일하게 생각하고 쓸수 있을것같다.

 

2)의 경우 솔깃한 내용이긴 한데, 컴파일러가 어떻게 해주느냐는 컴파일러마다 다르고 예상할수 없으므로... 상황에 따라 명시적인 코드를 짜야할듯하고, 1)의 경우로 생각해도 상황별 대응은 같은것으로 판단.

 

* +연산자에 대해 C#에서 문자열 상수+ 문자열 상수 에 대해서는 컴파일러에서 concat 호출을 하지않고 그냥 연결된 문자열상수로 인식한다고 한다. 

 

 

참조 : http://www.simpleisbest.net/post/2013/04/24/Review-StringBuilder.aspx

 

 

 

반응형
LIST