Light Blue Pointer
본문 바로가기
Developing/TIL(Develop)

String과 StringBuilder, StringBuffer의 차이

by Greedy 2024. 5. 31.

Java에서 String, StringBuilder, StringBuffer는 문자열을 다루기 위한 클래스들로, 각각의 특성과 사용 목적이 다르다.

이 클래스들의 차이점은 주로 불변성, 성능, 그리고 동기화 여부에 있다.

아래에서 각 클래스의 특징과 차이점을 상세히 설명하겠다.

String

주요 특징

불변성 (Immutability)

String 객체는 한 번 생성되면 수정할 수 없다

문자열을 변경하는 모든 작업은 새로운 String 객체를 생성한다

불변성의 장점

불변성 덕분에 String 객체는 스레드 안전(thread-safe)하며, 해시 코드가 캐시되기 때문에 효율적으로 사용할 수 있다

성능

문자열 결합과 같은 작업에서 많은 새로운 객체를 생성하게 되어 성능이 떨어질 수 있다

예제

public class StringExample {
    public static void main(String[] args) {
        String str1 = "Hello";
        String str2 = str1 + " World";
        System.out.println(str2); // "Hello World"
    }
}

StringBuilder

주요 특징

가변성 (Mutability)

StringBuilder 객체는 생성 후에도 내용을 수정할 수 있다.

즉, 문자열 변경 작업이 가능하며, 새로운 객체를 생성하지 않고도 문자열을 수정할 수 있다.

비동기적 (Not synchronized)

StringBuilder는 동기화되지 않아서 멀티스레드 환경에서 안전하지 않지만, 단일 스레드에서 사용 시 성능이 우수하다.

성능

문자열 결합이나 수정 작업에서 성능이 우수하다

예제

public class StringBuilderExample {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder("Hello");
        sb.append(" World");
        System.out.println(sb.toString()); // "Hello World"
    }
}

StringBuffer

주요 특징

가변성 (Mutability)

StringBuffer 객체도 생성 후 내용을 수정할 수 있다

동기화 (Synchronized)

StringBuffer는 모든 메서드가 동기화되어 있어서 멀티스레드 환경에서 안전하게 사용할 수 있다

성능

StringBuilder보다 성능이 떨어질 수 있지만, 멀티스레드 환경에서는 안전하다

예제

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 StringBuilder StringBuffer

불변성 불변 (Immutable) 가변 (Mutable) 가변 (Mutable)
동기화 동기화되지 않음 동기화되지 않음 동기화됨 (Synchronized)
스레드 안전성 안전 (Thread-safe) 안전하지 않음 (Not thread-safe) 안전 (Thread-safe)
성능 문자열 변경 시 성능 저하 단일 스레드에서 가장 우수 멀티스레드 환경에서 안전
사용 예 변경되지 않는 문자열 단일 스레드에서 문자열 변경 멀티스레드에서 문자열 변경

사용 권장 사항

String 문자열이 변경되지 않는 경우 사용. 불변성이 필요한 경우나 문자열 리터럴을 사용할 때 적합.

StringBuilder 단일 스레드 환경에서 문자열을 자주 변경해야 하는 경우 사용. 성능이 중요한 경우.

StringBuffer 멀티스레드 환경에서 문자열을 자주 변경해야 하는 경우 사용. 스레드 안전성이 필요한 경우.

이처럼 각 클래스는 사용 목적과 상황에 따라 선택적으로 사용되어야 하며, 성능과 스레드 안전성 요구 사항에 따라 적절한 클래스를 사용하는 것이 중요하다

'Developing > TIL(Develop)' 카테고리의 다른 글

ktlint 자동적용 안 되는 경우 해결법  (0) 2024.06.02
제네릭(Generic)이란  (0) 2024.05.31
Java volatile / synchronized  (0) 2024.05.31
JavaBean  (1) 2024.05.31
Java의 다형성(Polymorphism)  (0) 2024.05.31