[JAVA] String vs StringBuffer vs StringBuilder

humblechoi·2021년 2월 14일
0

자바

목록 보기
2/8
post-thumbnail

String

  • String is immutable.
  • string은 변경이 불가능하며 메모리 공간이 변할 수 없다.
  • 복수 개의 string을 이어서 새로운 string을 만드는 방법인 + operator를 사용하면 메모리에 문자열이 병합되는 것이 아니라 새로운 메모리에 할당을 해준다. 연속적으로 +=연산자 혹은 문자열을 이어붙이는 동작이 일어나면 그만큼 string 객체가 새로 만들어진다. 불필요한 객체가 많이 만들어져서 성능에 영향을 미칠 수 있다. 간단한 + 나열은 컴파일러가 내부적으로 StringBuilder를 사용하여 처리한다. 하지만 loop 등의 코드 안에서는 그러하지 않는다.
  • 즉, 기존의 값은 사라지지 않고 기존의 값을 가리키는 변수가 새로 합쳐진 형태의 값을 가리키게 되는데, 기존의 값은 특정 시점에는 Garbage Collection에 의해 회수가 된다.
  • immutable객체는 thread-safe하다.
  • 여러 개의 thread가 동시에 접근하여 읽어도 변하지 않는 값이기 때문에 문제 x, 그러므로 동기화 문제를 고려하지 않고 내부 데이터를 자유롭게 공유할 수 있는 장점이 있다.

StringBuffer와 StringBuilder

  • StringBuffer와 StringBuilder는 String과는 다르게 mutable하다.
  • 새로운 객체를 생성하지 않고 기존 객체의 버퍼 크기를 늘리며 문자열을 변경한다.
  • 둘의 차이는 동기화에 있다.(like HashTable, HashMap)

StringBuffer

  • 각 메소드 별로 synchronized keyword가 존재한다.
  • 멀티스레딩 환경에서 thread-safe하다. 하지만, 멀티 스레딩 환경에 아닐 경우에 stringBuffer클래스를 사용한다면 성능이 나빠질 수 있다.
  • 동기화가 존재하여 스레드 환경에서 동기화를 지원한다.

StringBuilder

  • 동기화 처리를 하지 않지만 sychronized keyword가 없기 때문에 성능이 빠르다.
  • 최신 JDK 버전(1.5version 이후)에서는 String을 컴파일 단계에서 StringBuilder로 처리한다.

profile
지우의 블로그

0개의 댓글