
Java에서 문자열을 다루는 방법은 다양하며, 대표적으로 String
, StringBuilder
, StringBuffer
가 있습니다.
이 세 가지 클래스는 각각의 특징과 성능이 다르기 때문에, 사용 상황에 따라 적합한 것을 선택하는 것이 중요합니다.
이번 포스트에서는 String
, StringBuilder
, StringBuffer
의 차이점과 장단점을 비교해 보겠습니다.
1. String, StringBuilder, StringBuffer란?
Java에서는 문자열을 다루기 위한 여러 가지 클래스가 제공됩니다:
- String: 불변(immutable) 객체로, 한 번 생성되면 수정할 수 없습니다.
- StringBuilder: 가변(mutable) 객체로, 동기화를 지원하지 않아 싱글 스레드 환경에서 빠르게 동작합니다.
- StringBuffer: 가변(mutable) 객체로, 동기화를 지원하여 멀티스레드 환경에서 안전하게 사용할 수 있습니다.
2. String의 특징
String
은 불변 객체로, 문자열을 변경하려면 새로운 객체를 생성해야 합니다. 이로 인해 메모리를 더 많이 사용할 수 있으며, 반복적인 수정이 있을 경우 성능 저하가 발생할 수 있습니다. 그러나 불변성 덕분에 멀티스레드 환경에서 안전하게 사용할 수 있습니다.
장점
- 스레드 안전성: 불변 객체이기 때문에 멀티스레드 환경에서도 안전하게 사용할 수 있습니다.
- 메모리 효율성: 동일한 문자열은 String Pool에 저장되어 재사용됩니다.
단점
- 성능 저하: 문자열을 수정할 때마다 새로운 객체가 생성되기 때문에, 대량의 문자열 조작 작업에는 비효율적입니다.
예제 코드
String str = "Hello";
str += " World"; // 새로운 String 객체가 생성됨
3. StringBuilder의 특징
StringBuilder
는 Java 1.5에서 도입된 가변 문자열 클래스입니다. String
의 성능 문제를 해결하기 위해, 문자열을 조작할 때 기존 객체를 수정할 수 있도록 설계되었습니다. 또한, 동기화를 지원하지 않기 때문에 싱글 스레드 환경에서 가장 빠르게 동작합니다.
장점
- 빠른 성능: 동기화가 필요 없기 때문에,
StringBuffer
보다 빠르게 문자열을 조작할 수 있습니다. - 메서드 체이닝 지원: 메서드를 연결해서 사용할 수 있어 코드가 간결해집니다.
단점
- 멀티스레드 안전성 없음: 동기화를 지원하지 않으므로, 멀티스레드 환경에서는
StringBuffer
를 사용하는 것이 안전합니다.
예제 코드
StringBuilder sb = new StringBuilder("Hello");
sb.append(" World").append("!");
System.out.println(sb.toString()); // 출력: Hello World!
4. StringBuffer의 특징
StringBuffer
는 Java 1.0부터 존재하는 클래스입니다. StringBuilder
와 유사하지만, 동기화(synchronization)를 지원하여 멀티스레드 환경에서 안전하게 사용할 수 있습니다.
장점
- 멀티스레드 안전성: 동기화를 지원하여 멀티스레드 환경에서도 안전하게 사용할 수 있습니다.
- 가변성: 문자열을 조작할 때 기존 객체를 수정하여 메모리와 성능을 최적화합니다.
단점
- 성능: 동기화가 추가되어 있어, 싱글 스레드 환경에서는
StringBuilder
보다 성능이 떨어질 수 있습니다.
예제 코드
StringBuffer sb = new StringBuffer("Hello");
sb.append(" World").append("!");
System.out.println(sb.toString()); // 출력: Hello World!
5. String, StringBuilder, StringBuffer 비교
특성 | String | StringBuilder | StringBuffer |
---|---|---|---|
가변성 | 불변(Immutable) | 가변(Mutable) | 가변(Mutable) |
멀티스레드 안전성 | 안전(Thread-safe) | 안전하지 않음 | 안전(Thread-safe) |
성능 | 느림(새 객체 생성) | 빠름 | 상대적으로 느림 |
동기화 | 없음 | 없음 | 있음 |
요약
- String: 변경이 적고, 안정성이 중요한 경우 사용합니다.
- StringBuilder: 싱글 스레드 환경에서 반복적인 문자열 조작이 필요한 경우 사용합니다.
- StringBuffer: 멀티스레드 환경에서 문자열 조작이 필요한 경우 사용합니다.
6. 성능 비교
다음은 String
, StringBuffer
, StringBuilder
의 성능을 비교를 직접 해봤습니다.

- String: 25ms (문자열을 계속 생성하기 때문에 가장 느립니다.)
- StringBuffer: 2ms (
StringBuilder
보다 느리지만, 멀티스레드 환경에서 안전합니다.) - StringBuilder: 1ms (가장 빠른 성능을 보여줍니다.)


7. 언제 무엇을 사용해야 할까?
- 변경이 적은 문자열:
String
을 사용하여 메모리 효율성과 안정성을 유지할 수 있습니다. - 싱글 스레드 환경에서 반복적인 문자열 조작:
StringBuilder
를 사용하여 빠르고 효율적으로 문자열을 처리할 수 있습니다. - 멀티스레드 환경에서 문자열 조작:
StringBuffer
를 사용하여 스레드 안전성을 보장합니다.
[Reference]
https://javaocean.in/string-vs-stringbuilder-vs-stringbuffer-in-java/
What is String vs StringBuilder vs StringBuffer in Java - Java Ocean
In Java, String, StringBuilder and StringBuffer are three different classes used for handling text data, but they have distinct characteristics and are used
javaocean.in
'Java > Java' 카테고리의 다른 글
[Java] StringBuilder 메서드 정리 (2) | 2024.10.11 |
---|

Java에서 문자열을 다루는 방법은 다양하며, 대표적으로 String
, StringBuilder
, StringBuffer
가 있습니다.
이 세 가지 클래스는 각각의 특징과 성능이 다르기 때문에, 사용 상황에 따라 적합한 것을 선택하는 것이 중요합니다.
이번 포스트에서는 String
, StringBuilder
, StringBuffer
의 차이점과 장단점을 비교해 보겠습니다.
1. String, StringBuilder, StringBuffer란?
Java에서는 문자열을 다루기 위한 여러 가지 클래스가 제공됩니다:
- String: 불변(immutable) 객체로, 한 번 생성되면 수정할 수 없습니다.
- StringBuilder: 가변(mutable) 객체로, 동기화를 지원하지 않아 싱글 스레드 환경에서 빠르게 동작합니다.
- StringBuffer: 가변(mutable) 객체로, 동기화를 지원하여 멀티스레드 환경에서 안전하게 사용할 수 있습니다.
2. String의 특징
String
은 불변 객체로, 문자열을 변경하려면 새로운 객체를 생성해야 합니다. 이로 인해 메모리를 더 많이 사용할 수 있으며, 반복적인 수정이 있을 경우 성능 저하가 발생할 수 있습니다. 그러나 불변성 덕분에 멀티스레드 환경에서 안전하게 사용할 수 있습니다.
장점
- 스레드 안전성: 불변 객체이기 때문에 멀티스레드 환경에서도 안전하게 사용할 수 있습니다.
- 메모리 효율성: 동일한 문자열은 String Pool에 저장되어 재사용됩니다.
단점
- 성능 저하: 문자열을 수정할 때마다 새로운 객체가 생성되기 때문에, 대량의 문자열 조작 작업에는 비효율적입니다.
예제 코드
String str = "Hello";
str += " World"; // 새로운 String 객체가 생성됨
3. StringBuilder의 특징
StringBuilder
는 Java 1.5에서 도입된 가변 문자열 클래스입니다. String
의 성능 문제를 해결하기 위해, 문자열을 조작할 때 기존 객체를 수정할 수 있도록 설계되었습니다. 또한, 동기화를 지원하지 않기 때문에 싱글 스레드 환경에서 가장 빠르게 동작합니다.
장점
- 빠른 성능: 동기화가 필요 없기 때문에,
StringBuffer
보다 빠르게 문자열을 조작할 수 있습니다. - 메서드 체이닝 지원: 메서드를 연결해서 사용할 수 있어 코드가 간결해집니다.
단점
- 멀티스레드 안전성 없음: 동기화를 지원하지 않으므로, 멀티스레드 환경에서는
StringBuffer
를 사용하는 것이 안전합니다.
예제 코드
StringBuilder sb = new StringBuilder("Hello");
sb.append(" World").append("!");
System.out.println(sb.toString()); // 출력: Hello World!
4. StringBuffer의 특징
StringBuffer
는 Java 1.0부터 존재하는 클래스입니다. StringBuilder
와 유사하지만, 동기화(synchronization)를 지원하여 멀티스레드 환경에서 안전하게 사용할 수 있습니다.
장점
- 멀티스레드 안전성: 동기화를 지원하여 멀티스레드 환경에서도 안전하게 사용할 수 있습니다.
- 가변성: 문자열을 조작할 때 기존 객체를 수정하여 메모리와 성능을 최적화합니다.
단점
- 성능: 동기화가 추가되어 있어, 싱글 스레드 환경에서는
StringBuilder
보다 성능이 떨어질 수 있습니다.
예제 코드
StringBuffer sb = new StringBuffer("Hello");
sb.append(" World").append("!");
System.out.println(sb.toString()); // 출력: Hello World!
5. String, StringBuilder, StringBuffer 비교
특성 | String | StringBuilder | StringBuffer |
---|---|---|---|
가변성 | 불변(Immutable) | 가변(Mutable) | 가변(Mutable) |
멀티스레드 안전성 | 안전(Thread-safe) | 안전하지 않음 | 안전(Thread-safe) |
성능 | 느림(새 객체 생성) | 빠름 | 상대적으로 느림 |
동기화 | 없음 | 없음 | 있음 |
요약
- String: 변경이 적고, 안정성이 중요한 경우 사용합니다.
- StringBuilder: 싱글 스레드 환경에서 반복적인 문자열 조작이 필요한 경우 사용합니다.
- StringBuffer: 멀티스레드 환경에서 문자열 조작이 필요한 경우 사용합니다.
6. 성능 비교
다음은 String
, StringBuffer
, StringBuilder
의 성능을 비교를 직접 해봤습니다.

- String: 25ms (문자열을 계속 생성하기 때문에 가장 느립니다.)
- StringBuffer: 2ms (
StringBuilder
보다 느리지만, 멀티스레드 환경에서 안전합니다.) - StringBuilder: 1ms (가장 빠른 성능을 보여줍니다.)


7. 언제 무엇을 사용해야 할까?
- 변경이 적은 문자열:
String
을 사용하여 메모리 효율성과 안정성을 유지할 수 있습니다. - 싱글 스레드 환경에서 반복적인 문자열 조작:
StringBuilder
를 사용하여 빠르고 효율적으로 문자열을 처리할 수 있습니다. - 멀티스레드 환경에서 문자열 조작:
StringBuffer
를 사용하여 스레드 안전성을 보장합니다.
[Reference]
https://javaocean.in/string-vs-stringbuilder-vs-stringbuffer-in-java/
What is String vs StringBuilder vs StringBuffer in Java - Java Ocean
In Java, String, StringBuilder and StringBuffer are three different classes used for handling text data, but they have distinct characteristics and are used
javaocean.in
'Java > Java' 카테고리의 다른 글
[Java] StringBuilder 메서드 정리 (2) | 2024.10.11 |
---|