ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] String, StringBuffer, StringBuilder
    Java 2022. 1. 3. 20:11

    자바에서 문자열을 다루는 대표적인 클래스로 String, StringBuffer, StringBuilder가 있다.

    각 클래스의 특징을 이해하고 상황에 맞는 적절한 클래스를 사용하기 위해 각자의 특징과 장단점에 대해 알아보려고 한다.

    String vs StringBuffer/StringBuilder

    String과 StringBuffer/StringBuilder의 가장 큰 차이점은 String은 불변(immutable)의 속성을 갖는다는 점이다.

    다음과 같은 예를 들어보자.

    String str = new String("hello"); // "hello"
    str = str + " world"; // "hello world"

    우리는 위와 같이 String 객체에 문자열을 추가하여 사용한 경험이 있을 것이다. 우리는 이렇게 코드를 작성하면서 "hello"에 " word"를 더해 "hello world"가 된다고 논리적으로 생각한다.

    하지만 물리적으로는 다르다. 기존에 "hello"가 들어 있던 참조 변수 str이 "hello world"라는 값을 가지고 있는 새로운 메모리 영역을 가리키게 변경되고 "hello"로 값이 할당되어 있던 메모리 영역은 Garbage로 남아있다가 GC(garbage collection)에 의해 사라지게 된다.

    String 클래스는 불변하기 때문에 문자열을 수정하는 시점에 새로운 String 인스턴스가 생성된 것이다.

    출처: https://ifuwanna.tistory.com/221#google_vignette

    위에서 설명한 것과 같이 String은 불변성을 가지기 때문에 변하지 않는 문자열을 자주 읽어들이는 경우 String 클래스를 사용하면 좋은 성능을 기대할 수 있다. 하지만 문자열 추가, 수정, 삭제 등의 연산이 빈번하게 발생하는 로직에서 String 클래스를 사용할 경우 힙 메모리에 많은 Garbage가 생성되어 힙 메모리 부족으로 이슈가 발생할 수 있다.

     

    이를 해결하는 방법은 가변(mutable)의 속성을 가지는 StringBuffer/StringBuilder 클래스를 사용하는 것이다.

    StringBuffer와 StringBuilder는 mutable 객체이기 때문에 append, delete 등의 함수를 이용하여 동일 객체의 문자열 변경이 가능하다.

    따라서 문자열의 추가, 수정, 삭제 연산이 빈번하게 발생할 경우에는 String 클래스가 아닌 StringBuffer/StringBuilder 클래스를 사용해야 한다.

    StringBuffer sb = new StringBuffer("hello"); 
    sb.append(" world");

    출처: https://ifuwanna.tistory.com/221#google_vignette

    StringBuffer vs StringBuilder

    StringBuffer와 StringBuilder는 동일한 함수를 가지고 있다.

    그렇다면 두 클래스의 차이점은 무엇일까

    StringBuffer와 StringBuilder의 가장 큰 차이점은 동기화의 유무이다. StringBuffer는 동기화 키워드(synchronized)를 지원하여 멀티스레드 환경에서 안전하다(thread-safe). String 또한 불변성을 가지기 때문에 멀티스레드 환경에서 안전한다.

    반대로 StringBuilder는 동기화를 지원하지 않기 때문에 멀티스레드 환경에서 사용하는 것은 부적합하지만, 세 클래스 중 가장 성능이 뛰어나 때문에 동기화를 고려하지 않아도 되는 상황에 적합하다.

    결론

    String: 문자열 연산이 적고 멀티스레드 환경일 경우

    StringBuffer: 문자열 연산이 많고 멀티스레드 환경일 경우

    StringBuilder: 문자열 연산이 많고 단일스레드이거나 동기화를 고려하지 않아도 되는 경우

      String StringBuffer StringBuilder
    Storage String constant pool/Heap Heap Heap
    Modifiable ❌(immutable) ⭕(mutable) ⭕(mutable)
    Thread safe
    Synchronized
    Performance 👍 👎 👍

    Reference

    https://ifuwanna.tistory.com/221#google_vignette

     

    [Java] String, StringBuffer, StringBuilder 차이 및 장단점

    Java 에서 문자열을 다루를 대표적인 클래스로 String , StringBuffer, StringBuilder 가 있습니다. 연산이 많지 않을때는 위에 나열된 어떤 클래스를 사용하더라도 이슈가 발생할 가능성은 거의 없습니다

    ifuwanna.tistory.com

    'Java' 카테고리의 다른 글

    [Java] Singleton Pattern  (0) 2022.01.03
    [Java] Serialization과 Deserialization  (0) 2022.01.03
    [Java] Identity와 Equality  (0) 2022.01.03
    [Java] Primitive type과 Reference type  (0) 2022.01.03
    [Java] Shallow copy와 Deep copy  (0) 2022.01.02

    댓글

Designed by Tistory.