[펌글] 자바 문자열 객체(String,StringBuffer,StringBuilder) 정규표현식…

By | 3월 2, 2009

- 출처 : http://hongsgo.egloos.com/2033998 -

내가 만든 코드를 튜닝(?)해 나가면서 가장 신경쓰이는 부분이
자주 쓰는 문자열과 관련된 객체의 자원이다.
문자열에 대해서 변경이 잦다면 String이 아니라 StringBuffer나 StringBuilder를 써야 할 것이다.
보통 StringBuffer는 알지만 StringBuilder는 .NET에만 있는 객체라고 잘못 알고 있는 사람이 많다.
하지만, 엄연히 자바에도 StringBuilder 객체가 있으며 문자열을 다루는 이 세가지 객체의 차이는
크게 연산속도와 메모리 공간으로 볼 수 있다.
과연 어떤 특징이 있는지, 동일한 연산을 반복하고, 최종적으로 String 객체로 리턴 해서 비교해보자.

연산속도 : String 95초 , StringBuffer 0.24초 StringBuilder 0.17초
메모리 용량 : String 약 95GB , StringBuffer 약 28MB,9.5MB(String으로변환), StringBuilder 약 28MB,9.5MB(String으로변환)

정리 응답시간은 String보다 StringBuffer가 약 367배 빠르며, StringBuilder가 약 512배 빠르다. 메모리 용량은 StringBuffer와 StringBuilder보다 String이 약 3,390배 더 사용한다.

*여기서 잠깐.. 이글루스는 표만드는 기능도 없냐(내가 만들고 있는 사이트에는 있는데.. 음화화화)

여튼,

그럼 어떨때 String,StringBuffer,StringBuilder를 사용해야 할까?

 

  • String은 짧은 문자열을 더할 경우 사용한다.
  • StringBuffer는 스레드에 안전한 프로그램이 필요할 때나, 개발중인 시스템의 부분이 스레드에 안전한지 모를 경우 사용하면 좋다.
  • StringBuilder는 스레드에 안전한지 여부가 전혀 관계없는 프로그램을 개발 할 때 사용하면 좋다.

(와 문단 형식 다르게 잡았는데 실제론 안나타난다. 이글루스 개발 포기했나 이거뭥미 ㅜ.ㅜ)

* 버젼에 따라 다른 차이

개발자가 String객체를 사용하더라도 WAS가 JDK 5.0 이상의 버젼을 사용한다면 결과가 약간 달라진다.
왜냐하면 코드상에서 String객체를 사용하여 연산하였더라도 WAS에 탑재된 JDK가 컴파일시 StringBuilder로 변환하여 컴파일 하기 때문이다.

정규표현식과 문자열 객체,
퍼포먼스 측면이나 메모리 관리 측면에서 String 객체를 많이 안만들고 싶었으나
현실적으로 String객체에서 제공해주는 메서드가 막강하기 때문에 자주 쓰게 된다.
따라서, 어떻게하면 보다 더 적은 String객체를 사용할 수 있게 비즈니스 로직을 설계 하는것이 중요한 요소라고 생각한다.
그 해답 가운데 한가지가 정규표현식이라고 생각한다. 자바 String객체에 replaceAll이라는 메서드에 일반적인 문자열이 아닌
정규표현식을 사용하여 한번에 원하는 문자열을 탐색하거나 지우는것이 좋은 해답이라고 생각한다.

Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments