[Java] String, StringBuffer, StringBuilder

hyunoi·2024년 11월 24일
0

Java

목록 보기
15/20
post-thumbnail

자바에서는 대표적으로 문자열을 다루는 자료형 클래스로 String, StringBuffer, StringBuilder 이 세 가지를 사용한다.

이 세 가지는 사용 목적에 따라 쓰임새가 달라지게 되는데 이에 대해 알아보자

String


문자열을 다루는 가장 기본적인 클래스

  • 불변성
    객체 생성 후 수정이 불가능
  • 스레드 안전
    자주 사용하는 문자열의 경우 String pool에 저장되어 메모리 효율성을 높인다.

StringBuffer


  • 가변성
    객체 생성 후 문자열 수정 시 동일한 객체에서 수정
    삽입, 삭제, 변경 등의 작업에서 성능이 유리하다.
  • 동기화
    내부 메소드들이 synchronized로 동기화 처리되어서 멀티 스레드 환경에서 안정적으로 동작

StringBuilder


StringBuffer와 동일한 기능 제공

  • 가변성
    StringBuffer와 동일
  • 비동기화
    동기화 처리를 못하므로 멀티 스레드 환경에서는 사용하지 못한다.
    단일 스레드 환경의 경우 StringBuffer보다 빠르다.

불변성과 가변성?


불변성

  • 한 번 생성되면 수정 불가능
  • 불변객체를 변경하면 새로운 객체를 만든다.
  • String

가변성

  • 수정이 기존 객체에서 이루어짐
  • 수정 작업이 잦은 경우 불변객체보다 더 나은 성능을 제공한다.
  • StringBuffer, StringBuilder

성능 비교


public class PerformanceTest {
    public static void main(String[] args) {
        int iterations = 100_000;

        // String
        long start = System.currentTimeMillis();
        String str = "";
        for (int i = 0; i < iterations; i++) {
            str += i;
        }
        long end = System.currentTimeMillis();
        System.out.println("String Time: " + (end - start) + " ms");

        // StringBuffer
        start = System.currentTimeMillis();
        StringBuffer stringBuffer = new StringBuffer();
        for (int i = 0; i < iterations; i++) {
            stringBuffer.append(i);
        }
        end = System.currentTimeMillis();
        System.out.println("StringBuffer Time: " + (end - start) + " ms");

        // StringBuilder
        start = System.currentTimeMillis();
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i < iterations; i++) {
            stringBuilder.append(i);
        }
        end = System.currentTimeMillis();
        System.out.println("StringBuilder Time: " + (end - start) + " ms");
    }
}

> Output
String Time: 1201 ms
StringBuffer Time: 2 ms
StringBuilder Time: 2 ms

위 성능 비교를 한 결과를 보면

String이 확연하게 시간이 오래 걸리는 것을 볼 수 있다.
그리고 StringBuffer, StringBuilder는 거의 비슷하다.

결론


특징StringStringBufferStringBuilder
불변성 (Immutable)불변성가변성가변성
동기화 지원 여부비동기, 스레드 안전하지 않음동기, 스레드 안전비동기, 스레드 안전하지 않음
성능느림중간빠름
사용 환경문자열이 변경되지 않는 상황멀티스레드 환경에서 문자열 변경이 필요한 경우단일 스레드 환경에서 문자열 변경이 많은 경우
적합한 상황상수 문자열, 로그 메시지 등스레드 간 문자열 데이터 공유반복적인 문자열 조작, 성능이 중요한 경우

보통 아래 이유 때문에 StringBuilder를 더 많이 사용한다!

  • 대부분의 어플리케이션은 단일 스레드를 사용
  • 성능이 빠르다.

0개의 댓글