#2_StringBuilder와 StringBuffer의 차이

String / StringBuffer / StringBuilder

String 객체는 한번 생성되고나면 할당된 공간이 변하지 않는 불변(immutable)의 속성을 갖지만 StringBuffer와 StringBuilder의 경우 객체의 공간이 부족하게되면 버퍼의 크기를 늘리게된다.
이러한 이유로 String은 불변(immutable), StringBuffer와 StringBuilder는 가변(mutable)하다고 표현한다.



StringBuffer와 StringBuilder의 장점

String은 내부의 문자열을 수정할 수 없다. 따라서 문자열에 추가로 이어붙일 때
이는 수정이 되는것이 아닌 새로운 문자열을 생성하여 리턴하게 된다(이미지 참고)

String str = "ABC";
str += "DEF";
// 리턴 결과 : "ABCEDF"

위와 같이 리턴 결과는 의도한대로 ABCDEF가 리턴 되겠지만 Heap Memory 영역에서는 ABC -> ABCDEF 로 수정이 된 것이 아니라 ABC 라는 String 객체와 ABCDEF 라는 객체 2개가 생성된다.
따라서, String을 이용한다면 문자열의 수정이 빈번하게 발생하지 않는 경우에 사용하는 것이 적합하다. 수정이 빈번한 경우에 사용하게 되면 메모리가 부족하게 되는 상황이 벌어질 수 있다.

  • 참고로 같은 문자열을 추가로 생성하면 추가로 생성하지 않고 String constant pool 영역을 확인한 후 같은 문자열이 있다면 생성 없이 동일한 메모리 주소값을 리턴한다.
  • A라는 변수와 B라는 변수가 같은 주소를 가르킨다면 == 비교시 true가 리턴된다.
  • 이때 같은 문자열일지라도 new String을 통해 생성한다면 새로운 주소를 가르킨다.
StringBuffer sb = new StringBuffer("hello");
sb.append(" world");

불변성의 String 대신 가변성을 가진 StringBuffer나 StringBuilder를 이용하게되면 새로운 문자열을 생성하는 것이 아닌 문자열을 동일 객체 내에서 변경할 수 있게 된다. 따라서 문자열의 수정이 빈번한 경우에는 StringBuffer나 StringBuilder를 이용하는 것이 좋다.


StringBuffer와 StringBuilder의 차이

StringBuffer와 StringBuilder는 둘 다 크기가 유연하게 변하는 가변의 특성을 갖고있고 사용 방법도 동일하지만 둘의 가장 큰 차이점은 동기화의 유무StringBuffer는 동기화를 지원하기 때문에 멀티 쓰레드 환경에서 안전하지만, StringBuilder는 동기화를 지원하지 않기 때문에 만일 멀티 쓰레드(Multi-Thread) 환경에서 적합하지 않다. 추가로 String도 불변성을 갖기 떄문에 멀티 쓰레드 환경에서의 안정성을 갖고있다.



요약

  • String : 수정이 빈번하지 않은 경우에 사용
  • StringBuffer : 멀티 쓰레드인 경우에 사용, 동기화 지원, Buffer보다 빠름, 가변적
  • StringBuilder : 단일 쓰레드인 경우에 사용, 동기화 미지원, 속도 제일 느림, 가변적

  • StringBuffer와 StringBuilder는 버퍼에 문자열을 쌓기 때문에 출력시 toString() 메소드를 이용해 String으로 써야한다.

  • StringBuffer와 StringBuilder의 속도 차이는 append()연산이 약 1억 6천만번 일어날 때 약 2.6초 정도의 속도차이가 있다고 하니 수많은 연산이 발생하는 경우 싱글쓰레드라면 StringBuilder를 이용해서 보다 빠른 연산을, 그렇지 않다면 StringBuffer를 통해 빠른 연산을 하면 될 것 같다.

좋은 웹페이지 즐겨찾기