ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] String, StringBuilder, StringBuffer의 차이점 알아보기
    프로그래밍 언어/JAVA 2023. 4. 26. 10:51

     

    📑 String이란? 

     

    String과 다른 (StringBuilder, StringBuffer)의 차이는 String은 immutable(불변), 다른 클래스는 mutable(변함)에 있다. String은 문자열을 대표하는 것으로 문자열을 조작하는 경우 유용하게 사용할 수 있다. + 연산자 또는 concat 메서드를 통해 기존에 생성된 String 클래스 객체에 다른 문자열을 붙이면 기존 객체에 문자열이 추가되는 걸까??

     

    아니다! 기존에 생성되어 있는 String 객체는 그대로 있고 추가로 새로운 String 객체를 만든 후 새 String 객체에 연결된 문자열을 저장하고 그 객체를 참조하도록 한다. 즉) String 클래스 객체는 Heap 메모리 영역(가비지 컬렉션이 동작하는 영역)에 생성되는 것이다. 기존에 객체가 제거되면 JAVA GC에 의해 제거되던가 만일 참조되지 않고 있는 경우 GC가 순회하다 언젠가 그 객체를 제거한다. 이는 필요 없는 메모리를 차지하게 되는 것이다. 

     

    따라서 String 객체는 문자열 연산이 많은 경우 성능이 좋지 않다. 하지만 immutable한 객체는 간단하게 사용이 가능하고, 동기화에 대해 신경쓰지 않아도 되기 때문에 내부 데이터를 자유롭게 공유 가능하다. 

     

     

     

     

    📑 StringBuilder란?

     

    Java의 StringBuilder 클래스는 문자열을 수정하거나 조작하기 위한 유틸리티 클래스입니다. 문자열을 직접 수정할 수 있는 가변(mutable) 문자열 버퍼를 제공합니다. 즉, 문자열의 일부 또는 전체를 변경하고 저장할 수 있습니다.

    StringBuilder 클래스는 java.lang 패키지에 속해 있으며, 다음과 같은 생성자를 사용하여 객체를 생성할 수 있습니다:

    public StringBuilder()
    public StringBuilder(int capacity)
    public StringBuilder(String str)

     


    첫 번째 생성자는 초기 용량(capacity)이 16인 빈 문자열 버퍼를 생성합니다. 두 번째 생성자는 지정된 용량을 가진 빈 문자열 버퍼를 생성합니다. 세 번째 생성자는 지정된 문자열로 초기화된 문자열 버퍼를 생성합니다.

    StringBuilder 클래스는 다음과 같은 메서드를 제공합니다:

    append() : 문자열을 끝에 추가합니다.
    insert() : 문자열을 지정된 위치에 삽입합니다.
    delete() : 지정된 위치에서 문자열 일부 또는 전체를 삭제합니다.
    replace() : 지정된 위치에서 문자열 일부 또는 전체를 다른 문자열로 대체합니다.
    reverse() : 문자열을 역순으로 뒤집습니다.
    length() : 문자열의 길이를 반환합니다.
    예를 들어, 다음과 같은 코드를 사용하여 StringBuilder를 사용할 수 있습니다:


     

    StringBuilder sb = new StringBuilder("Hello");
    sb.append(" World");
    sb.insert(5, ",");
    sb.delete(5, 6);
    sb.replace(6, 11, "Java");
    sb.reverse();
    System.out.println(sb.toString());

     

     


    위 코드는 "avaJ olleH"라는 문자열을 출력합니다. 이와 같이 StringBuilder는 문자열을 동적으로 생성하고 수정하는 데 사용할 수 있습니다. 그리고 String 클래스와 달리 StringBuilder 클래스는 가변(mutable)하므로 문자열의 수정이 자주 일어나는 상황에서는 성능상 이점이 있습니다.

     

     


     

    StringBuffer도 StringBuilder와 제공하는 메서드는 서로 동일하다. 두 클래스의 차이점은 바로 동기화 여부이다. 

     

    StringBuffer는 각 메서드 별로 Synchronized keyword가 존재하며, 멀티스레드 환경에서도 동기화를 지원한다. 그러나 StringBuilder는 동기화를 보장하지 않는다.

     

    따라서 각각 다음과 같은 상황에서 사용하면 된다.

     

    🎈 String : 짧은 문자열을 더할 경우 사용한다.
    🎈 StringBuffer : 스레드에 안전한 프로그램이 필요하거나, 개발 중인 시스템의 부분이 스레드에 안전한지 모를 경우 사용하면 좋다.
    🎈 StringBuilder : 스레드에 안전한지 여부가 전혀 관계없는 단일 스레드를 개발할 때 사용하면 좋다. 

     

     


     

    참고로 JDK 1.5 버전 이전에는 문자열연산 (+, concat)을 할때 조합된 문자열을 새로운 메모리에 할당하여 참조함으로 인해 성능사 이슈가 있었다. 그러나 JDK1.5 이후 버전에서는 컴파일 단계에서 String 객체를 사용하더라도 StringBuilder로 컴파일 되도록 변경되었다. 따라서 String과 StringBuilder의 성능차이가 없는것이다. 

     

    그러나 만약 String으로 무한루프를 이용해 계속해서 문자열을 조합한다면 객체를 계속 추가한다는 사실에는 변함이 없으므로 String을 쓰기 보다는 StringBuilder를 쓰는 것을 더 권장한다. 

    반응형

    댓글

Designed by Tistory.