Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

To Dare Is To Do!

StringBuffer, StringBuilder, string 본문

Java

StringBuffer, StringBuilder, string

Nick_Choi 2024. 8. 4. 10:51

개요

Java 에서 문자열을 다루는 대표적인 클래스로 연산이 많지 않을 때는 위에 나열된 어떤 동기화 방법을 사용하더라도 큰 문제가 발생할 가능성은 적으나 연산 횟수가 많아지거나 멀티스레드 환경에서 Race condition 등의 상황이 자주 발생한다면, 각 동기화 방법의 특징을 이해하고 상황에 맞는 적절한 방법을 사용해야 함

String

  • 불변 객체로 한 번 생성되면 그 값을 변경할 수 없음
    • 더하기 연산을 하여 문자를 이어 붙일 때는 새로운 객체가 생성되어 재 할당됨
    public class StringExample {
        public static void main(String[] args) {
            String str = "Hello";
            System.out.println(str.hashCode());  // 99162322
            str += " World"; // 새로운 객체 생성
            System.out.println(str); // Hello World
            System.out.println(str.hashCode());  // 1776255224
        }
    }
    
  • 불변성 때문에 여러 스레드에서 안전하게 사용할 수 있음
  • String 객체는 불변하기 때문에, 문자열 연산이 빈번하게 발생하는 상황에서는 성능 저하의 원인이 될 수 있음
    • String객체 새로 생성시 heap 메모리 사용량 증가, 가비지 컬렉션의 부하 커짐

(리터럴울 통해 생성될 시 인스턴스 메모리의 공간 절대 변하지 않음)

  • 문자열 리터럴은 String Pool에 저장되어 메모리 사용을 최적화 함
  • String Pool

사용 시기

  • 문자열 변경이 거의 없는 경우
  • 멀티스레드 환경에서 문자열을 안전하게 사용해야 하는 경우
  • 문자열 리터럴을 많이 사용하는 경우

String 클래스의 주요 메서드

length(), charAt(), substring(), indexOf(), lastIndexOf(), String.valueOf(), concat(), getBytes(), toCharArray()

StringBuilder

  • 문자열을 변경할 수 있는 가변객체
  • 동기화를 지원하지 않아 스레드에서 안전하지 않아 ****단일 스레드에서만 안전하게 사용할 수 있음
  • 동기화가 없으므로 StringBuffer보다 빠른성능을 보여줌
  • public class StringBuilderExample { public static void main(String[] args) { StringBuilder sb = new StringBuilder("Hello"); sb.append(" World"); // 동일 객체에서 변경 System.out.println(sb.toString()); // Hello World } }

사용 시기

  • 단일 스레드 환경에서 문자열을 빈번하게 변경해야 하는 경우
  • 문자열의 추가, 삭제, 변경이 자주 발생하는 경우
  • 웹 애플리케이션에서 사용자의 입력을 처리하거나, 파일에서 데이터를 읽어오는 경우와 같이 문자열의 변경이 빈번하게 발생하는 상황에서는 StringBuilder의 사용을 고려
  • 문자열 이어 붙이는 작업이 많을 시 사용

문자 이어 붙이기 append()

StringBuffer

  • 문자열을 변경할 수 있는 가변객체
  • 내부적으로 동기화를 지원하여 멀티스레드 환경에서 안전하게 사용할 수 있음
  • 동기화로 인한 오버헤드가 있을 수 있음 (성능문제)
    • 모든 메소드에 대해 synchronized를 통해 blocking을 거는 것은 성능 상으로 좋지 않음
    • 여러 동기화 메소드로 이루어진 하나의 메소드를 여러 스레드가 호출할 때는 스레드 안전하지 않을 수 있음
    public class StringBufferExample {
        public static void main(String[] args) {
            StringBuffer sb = new StringBuffer("Hello");
            sb.append(" World"); // 동일 객체에서 변경
            System.out.println(sb.toString()); // Hello World
        }
    }
    

사용 시기

  • 문자열 변경이 거의 없는 경우
  • 문자열 리터럴을 많이 사용하는 경우
  • 멀티스레드 환경에서 문자열을 안전하게 사용해야 하는 경우

각 클래스의 차이

특성  String  StringBuffer  StringBuilder
불변성 불변 가변 가변
쓰레드 안전성 안전 안전 안전하지 않음
성능 동기화 없음으로 빠름 동기화로 인해 느림 동기화 없음으로 매우 빠름
사용 시기 문자열 변경이 거의 없는 경우 멀티스레드 환경에서 문자열 변경 단일 스레드 환경에서 문자열 변경

'Java' 카테고리의 다른 글

thread pool  (3) 2024.08.06
hashcode(), equals()  (0) 2024.08.04
동일성과 동등성  (0) 2024.07.30
Call by value와 Call by reference  (0) 2024.07.29
추상클래스와 인터페이스  (0) 2024.07.27