StringBuffer vs StringBuilder

Jaeuk Oh·2021년 8월 3일
1

Java

목록 보기
2/6
post-thumbnail
  1. String

    • String의 특징 중 하나는 불변성(immutable)을 갖는다는 점.

    • 문자열 추가,수정,삭제 등의 연산이 빈번하게 발생하는 알고리즘에 String 클래스를 사용하면 힙 메모리(Heap)에 많은 임시 가비지(Garbage)가 생성되어 힙메모리가 부족으로 어플리케이션 성능에 치명적인 영향을 끼치게 됨. (공간복잡도)

      • String name = new String("우코");
        name += " 학생";
        /*
        "우코 학생" 이라는 출력물이 나올 것이다.
        그러나 이를 위해 String은 "우코"이라는 데이터를 갖는 name을 두 번 생성해서 "우코 학생"이라는 데이터를 만들고  기존의 name = "우코"을 지우는 것이다. 즉 name이 쓸데없이 2번이나 생성됐다.
        지금같이 간단한 코드는 상관없지만 기업의 대규모 프로그램에서 하루에 셀수도 없이 많은 String이 생겼다가 없어진다면
        공간복잡도, 시간복잡도 측면에서 굉장히 비효율적인 프로그램이 될 것이다. 이를 해결하기 위해 "StringBuffer/StringBuilder"를 이용한다
        */
      • 하지만, immutable한 객체는 간단하게 사용가능하고, 동기화에 대해 신경쓰지 않아도 되기때문에(Thread-safe), 내부 데이터를 자유롭게 공유 가능.

    • String 저장 예시

      • String str1 = "Arsenal";
        String str2 = "Arsenal";
        String str3 = "FC Seoul";
        String str4 = new String("Arsenal");
        /*
        생성된 String 객체는 Stack 영역에 저장되고, 
        Heap 영역에는 "Arsenal", "FC Seoul"과 같은 data들이 들어가게 되는데, 
        str4는 str1, str2와 같은 데이터("Arsenal")를 저장했지만 주소값이 다른 것을 볼 수 있다. 
        이를 통해 String literal로 생성하면 해당 String 값은 
        Heap 영역 내 "String Constant Pool"에 저장되고, 
        new 연산자로 생성하면 Heap영역에 저장되는 것을 알 수 있다.
        */



  1. 공통점

    • 가변성(mutable)

      • 이를 타파하기 위해 '가변성(mutable)'을 가진 StringBuffer/StringBuilder을 이용해서 동일 객체 내에서 문자열을 변경하는게 가능.
      • 따라서 문자열의 추가,수정,삭제가 빈번하게 발생한다면 StringBuffer/StringBuilder를 사용하는 것을 추천.



  2. 차이점

    • 동기화의 유무

      • StringBuffer는 동기화 키워드를 지원해서 멀티-스레드(Multi-Thread) 환경에서 안전.


      • StringBuilder는 동기화를 지원하지 않기 때문에 멀티-스레드(Multi-Thread) 환경에서 적합하지 않지만, 싱글-스레드(Single-Thread) 환경에서는 StringBuffer보다 빠른 성능을 보장.

        • StringBuffer와 호환되는 API를 제공하지만 동기화를 보장하지는 않습니다. 이 클래스는 StringBuffer가 싱글-스레드에서 사용되는 위치에서 StringBuffer에 대한 드롭인 교체로 사용하도록 설계되었습니다(일반적인 경우와 같이). 가능하면 이 클래스를 StringBuffer보다 우선적으로 사용하는 것이 좋습니다. 대부분의 구현에서 더 빠르기 때문입니다.
        • (오라클 자바 문서 참조:https://docs.oracle.com/en/java/javase/14/docs/api/java.base/java/lang/StringBuilder.html)

1개의 댓글

comment-user-thumbnail
2021년 8월 4일

문자열을 자유롭게 수정, 삭제할 수 있는 StringBuffer와 StringBuilder의 특징 잘 알고가요!
다음에도 도움이 될 만한 자바 관련 글 기대하겠습니다. 🐤🐣

답글 달기

관련 채용 정보