String vs StringBuffer vs StringBuild

반응형
728x90
반응형

String, StringBuffer, StringBuild 비교

String, StringBuffer, StringBuild 는 모두 문자열 관련 클래스이다.

 

String은 불변함 (immutable)
StringBuffer, StringBuilder는 변함 (mutable)

 

String 객체의 불변함이 무슨뜻인지 알아보자.

String test = "a";  CASE1.  test += "b";   CASE2. test.concat("b");

 

위 간단한 코드에서, test String 객체는 Hip 메모리 영역에 생성된다. 따라서 두번째 코드에서 += 또는 concat 메소드를 사용하였을때 생성되었던 처음 메모리가 아닌, 새로운 메모리를 생성한다. + 연산자, concat 메소드를 통해 새로 생성된 String 객체를 참조하게 됨으로써 계속된 문자열 연산을 사용할 시, 메모리 낭비가 심하게 일어날 것이다.

 

StringBuffer는 'thread-safe' 라고도 합니다. 동기화를 보장한다. 따라서 멀티스레드 환경이 아닐경우에 StringBuffer을 사용한다면 성능이 나빠진다.

 

StringBuilder는 성능이 가장 좋다. StringBuilder는 동기화 처리를 하지 않으므로 속도가 빠르다.

 

자바에서 동기화란?
여러개의 스레드(thread)가 한 개의 자원을 사용할때, 해당 스레드만 제외하고 나머지는 접근하지 못하게하는 것

 

따라서, 동기화를 보장하는 StringBuffer는 오직 하나의 쓰레드만 접근이 가능하기 때문에 속도가 저하된다.

 

 

 

클래스 선택

이 3가지의 특징을 본 결과, 어떤 상황에서 어떤 클래스를 사용해야할는지 생각해보자.

 

  • (1) String 

= 문자열의 값이 변하지않을 상황에 사용

 

  • (2) StringBuffer

= 문자열의 값이 변할 수 있는 상황이고, 멀티쓰레드(multiple threads) 환경일때 사용 

 

  • (3) StringBuilder

= 문자열의 값이 변할 수 있는 상황이고, 문자열에 많은 연산이 사용되거나 싱글쓰레드(single thread) 환경일때 사용

 

 

* JDK 1.5 버전 이후부터, String 클래스를 사용하더라도 StringBuilder로 컴파일된다.

 

 

반응형

Designed by JB FACTORY