String vs String Builder vs String Buffer

2024. 12. 3. 23:02·Language/Java
반응형

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
반응형

'Language > Java' 카테고리의 다른 글

Promotion(자동형변환)과 Casting(명시적형변환), Upcasting vs Downcasting  (0) 2024.12.05
String Interning  (1) 2024.12.04
Stream API  (0) 2024.12.02
Java는 Call by Reference가 존재하지 않는다.  (0) 2024.12.01
JVM(Java Virtual Machine)과 Java 컴파일 과정  (0) 2024.11.29
'Language/Java' 카테고리의 다른 글
  • Promotion(자동형변환)과 Casting(명시적형변환), Upcasting vs Downcasting
  • String Interning
  • Stream API
  • Java는 Call by Reference가 존재하지 않는다.
settong
settong
    250x250
  • settong
    개 발 자 국
    settong
  • 전체
    오늘
    어제
    • 전체보기 (202)
      • Computer Science (50)
        • Network (7)
        • Operating System (18)
        • Data Structure (9)
        • Database (11)
        • Algorithm (5)
      • Language (17)
        • Java (17)
        • Javascript (0)
        • Python (0)
      • Devops (20)
        • AWS (0)
        • Naver Cloud (16)
        • CICD (3)
        • 웹 서버 관리 (1)
      • Front (0)
        • React (0)
      • Backend (5)
        • Spring (5)
      • 코딩 테스트 정복기 (110)
        • 백준 (51)
        • 프로그래머스 (53)
        • 기타 (6)
      • etc (0)
      • 경제 상식 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    완전탐색
    BFS
    DFS
    ncp200
    Spring Boot
    벨만포드
    해시
    github actions
    ncp
    분할정복
    ncp202
    CI/CD
    백트래킹
    프로그래머스
    lcs
    다이나믹프로그래밍
    다익스트라
    백준
    Network
    집합
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
settong
String vs String Builder vs String Buffer
상단으로

티스토리툴바