[JAVA] String, StringBuffer, StringBuilder 차이

이도훈·2021년 8월 25일
0

자바

목록 보기
2/3

안녕하세요.
이번 글에서는 String, StringBuffer, StringBuilder 의 차이와 특징에 대해 알아보겠습니다.


  • String, StringBuffer, StringBuilder는 자바에서 문자열을 표현하기 위해 사용하는 대표적인 클래스들입니다.

String 과 StringBuffer, StringBuilder 의 차이점

  • String은 (immutable) 불변성을 지니고 StringBuffer/StringBuilder 는 가변성을 가지고 있다는 점입니다.
String str = "Hello";  
// 1111 이라는 heap memory에 적재된다고 가정한다.  
str = str + "World";
// str 은 immutable인 특징에 따라 새로운 메모리로 할당받습니다. (새로운 객체 생성)
// str = "Hello World" 은 2222 라는 heap memory에 적재된다고 가정하고 
// 1111 heap memory의 "Hello"는 가비지 컬랙터에 의해서 이후 삭제된다.
  • String 과 반대로 StringBuffer/StringBuilder 는 가변성을 가지기 때문에 동일 객체 내에서 문자열을 변경하는 것이 가능합니다.

    그러므로 문자열의 추가, 수정, 삭제가 자주 발생하는 경우에는 String 클래스가 아닌 StringBuffer/StringBuilder 를 사용해야 합니다.

StringBuffer sb = new StringBuffer("Hello");
// 3333 이라는 heap memory에 적재된다고 가정한다.
sb.append("World");
// StringBuffer 는 가변성을 가지기 때문에 동일하게 3333 이라는 heap memory를 가진다. 
// 즉, 새로운 객체가 생성되지 않고 동일 객체 내 문자열 변경이 가능하다. 
// -> 메모리 낭비를 줄일 수 있다.

StringBuffer vs StringBuilder

그렇다면 StringBuffer 와 StringBuilder 와의 차이점은 무엇일까요?
가장 큰 차이점은 동기화의 유무로 StringBuffer는 동기화 키워드를 지원하므로 멀티쓰레드 환경에서 안전하는 점 (thread-safe) 입니다.

** String은 불변성을 가지기 때문에 마찬가지로 멀티쓰레드 환경에서 안전합니다.

반대로 StringBuilder 는 동기화를 지원하지 않기 때문에 멀티쓰레드 환경에서 사용하는 것은 적합하지 않습니다.
하지만 동기화를 고려하지 않았기에 단일쓰레드에서의 성능은 StringBuffer 보다 뛰어납니다.

최종 정리

각 클래스 별로 사용하는 상황에 대해 정리하겠습니다.

  • String : 문자열 연산이 적고 멀티쓰레드 환경일 경우
  • StringBuffer : 문자열 연산이 많고 멀티쓰레드 환경일 경우
  • StringBuilder : 문자열 연산이 많고 단일쓰레드 환경일 경우


    이번 글에서는 String, StringBuffer, StringBuilder 의 차이점과 각 특징에 대해 알아보았습니다.
    감사합니다.
profile
back-end developer

0개의 댓글