Language/Java

String vs String Builder vs String Buffer

settong 2024. 12. 3. 23:02
반응형

Java에서는 문자열을 다루기 위한 클래스로 String, StringBuilder, StringBuffer가 있다.
각각 특성에 따라 상황에 맞게 선택하여 사용해야한다.

 


String

예시

String str1 = "Hello";
String str2 = "World";
String str3 = str1 + " " + str2; // 새로운 문자열 객체가 생성됨

 

특징

  • 불변성
    String객체는 불변(imuutable) 특징을 갖고 있다. 즉, 한번 생성된 String객체의 값은 변경할 수 없다.
    만약 새로운 문자열을 만들려면 기존 문자열을 기반으로 새로운객체를 생성해야 한다.
  • 리터럴 풀
    문자열 리터럴은 JVM의 문자열 풀에 저장되어 메모리 효율성을 높인다.
    이는 동일한 값을 가지는 문자열 리터럴은 동일한 객체를 참조하게끔 한다.

 

장단점

  • 장점
    • 불변성이므로 멀티스레드 환경에서 안전하다.
    • 문자열 리터럴 풀을 통해 메모리 사용량을 줄일 수 있다.
  • 단점
    • 문자열을 자주 변경해야 하는 경우, 만들때마다 새로운 객체를 생성하기 때문에 성능이 저하된다.

 

적절한 사용 시기

  • 문자열이 자주 변경되지 않는 경우.
  • 문자열 상수를 사용할 때.
  • 멀티스레드 환경에서 문자열을 사용할 때.




StringBuilder

예시

StringBuilder sb = new StringBuilder("Hello");
sb.append(" World");
sb.insert(5, ",");
sb.reverse();
String result = sb.toString();

 

특징

  • 가변성
    StringBuilder는 가변(mutable) 문자열을 제공한다.
    내부 버퍼를 사용하여 문자열을 변경할 수 있다.
  • 비동기성
    StringBuilder는 동기화 되지 않는다. 때문에 멀티스레드 환경에서는 적절치 않다

 

장단점

  • 장점
    • 문자열을 자주 변경해야 하는 경우 성능이 뛰어나다.
    • 동기화를 지원하지 않기 때문에 싱글 스레드 환경에서 더 빠르다.
  • 단점
    • 동기화를 지원하지 않기 때문에 멀티스레드 환경에서는 안전하지 않다.

 

적절한 사용 시기

  • 단일 스레드 환경에서 문자열을 자주 변경해야 할 때
  • 문자열 결합이나 수정 작업이 빈번히 일어날 때




StringBuffer

예시

StringBuffer sb = new StringBuffer("Hello");
sb.append(" World");
sb.insert(5, ",");
sb.reverse();
String result = sb.toString();

예시와 같이 StringBuilder와 같은 메서드를 사용할 수 있다.

특징

  • 가변성
    StringBuffer도 가변(mutable) 문자열을 제공한다.
    내부 버퍼를 사용하여 문자열을 변경할 수 있다.
  • 동기성
    StringBuffer는 모든 메서드가 동기화 되어있다. 따라서 멀티스레드 환경에서 안전하다.

 

장단점

  • 장점
    • 문자열을 자주 변경해야 하는 경우 성능이 뛰어나다.
    • 동기화를 지원하기 때문에 StringBuilder와 달리 멀티스레드 환경에서는 안전하다.
  • 단점
    • 동기화로 인해 단일 스레드 환경에서는 StringBuilder보다 느리다.

 

적절한 사용 시기

  • 단일 스레드 환경에서 문자열을 자주 변경해야 할 때
  • 문자열 결합이나 수정 작업이 빈번히 일어날 때




한번에 비교하기

특징 String StringBuilder StringBuffer
가변성 불변(immutable) 가변(mutable) 가변(mutable)
동기화 비동기적 비동기적 동기적
멀티스레드 안전성 안전 안전하지 않음 안전
성능 문자열 변경이 적은 경우 효율적 단일 스레드 환경에서 가장 빠름 멀티스레드 환경에서 비교적 빠름
주요 사용 시기 문자열 상수, 변경이 적은 경우, 멀티스레드 단일 스레드 환경에서 빈번한 문자열 변경 멀티스레드 환경에서 빈번한 문자열 변경

 

728x90
반응형