알고리즘 문제를 풀다가 String으로는 시간이 너무 오래 걸려, StringBuilder와 StringBuffer를 골라 사용해야 하는 경우가 있었다.
문득 그 두 클래스의 차이가 궁금해졌다.
StringBuilder와 StringBuffer는 둘 다 문자열을 변경 가능하게 다룰 수 있는 Java 클래스이다.
이 둘의 기본적인 용도와 동작은 유사하지만 다음과 같은 몇 가지 차이가 있다.
- 동기화(Synchronization)
- StringBuilder
- 동기화되지 않음 (Non-synchronized).
- 따라서, 멀티스레드 환경에서 안전하지 않을 수 있지만, 단일 스레드 환경에서 StringBuffer보다 더 빠름.
- StringBuffer
- 동기화됨 (Synchronized)
- 멀티스레드 환경에서 여러 스레드가 안전하게 사용할 수 있지만, 이에 따라 성능 저하 우려.
- StringBuilder
- 성능
- StringBuffer는 동기화되어 스레드 안전성을 지원하는 반면, StringBuilder는 동기화를 제공하지 않아서 상대적으로 더 빠름.
- 스레드 안전성
- StringBuilder는 단일 스레드 환경에서 안전하지만, 멀티스레드 환경에서 안전하지 않음.
- StringBuffer는 멀티스레드 환경에서 스레드 안전성을 제공하여 여러 스레드가 동시에 접근할 때 데이터 일관성을 보장.
따라서, 단일 스레드 환경에서 작업하는 경우에는 StringBuilder를 사용하는 것이 더 효율적이다.
하지만 멀티스레드 환경에서 작업하거나 스레드 안전성이 필요한 경우에는 StringBuffer 사용을 추천한다.
StringBuilder | StringBuffer | |
동기화 | X | O |
성능 | 상대적으로 빠름 | 상대적으로 느림 |
스레드 안정성 | 멀티 스레드 환경에서는 안전하지 않음 | 멀티 스레드 환경에서 안전성 제공 (데이터 일관성 보장) |
StringBuilder 사용 방법
// StringBuilder 인스턴스 생성
StringBuilder stringBuilder = new StringBuilder();
// 문자열 추가 (append 메서드 사용)
stringBuilder.append("Hello");
// 문자열 삽입 (insert 메서드 사용)
stringBuilder.insert(5, " World");
// 문자열 삭제 (delete 메서드 사용)
stringBuilder.delete(5, 11);
// 문자열 업데이트 (replace 메서드 사용)
stringBuilder.replace(0, 5, "Hi");
// StringBuilder를 String으로 변환
String finalString = stringBuilder.toString();
StringBuffer 사용 방법
StringBuffer는 기본적으로 StringBuilder와 비슷하지만 동기화된 메소드로 스레드 안전성을 제공한다.
// StringBuffer 인스턴스 생성
StringBuffer stringBuffer = new StringBuffer();
// 문자열 추가 (append 메서드 사용)
stringBuffer.append("Hello");
// 문자열 삽입 (insert 메서드 사용)
stringBuffer.insert(5, " World");
// 문자열 삭제 (delete 메서드 사용)
stringBuffer.delete(5, 11);
// 문자열 업데이트 (replace 메서드 사용)
stringBuffer.replace(0, 5, "Hi");
// StringBuffer를 String으로 변환
String finalString = stringBuffer.toString();
위 코드에서 사용된 주요 메서드
- append(): 문자열 끝에 문자열을 추가
- insert(): 지정된 위치에 문자열을 삽입
- delete(): 지정된 범위 내의 문자열을 삭제
- replace(): 지정된 범위 내의 문자열을 다른 문자열로 대체
- toString(): StringBuilder 또는 StringBuffer 객체를 String으로 변환
주의할 점은, StringBuilder는 스레드 안전성을 제공하지 않기 때문에 멀티스레드 환경에서 사용 시 동기화에 대한 고려가 필요하다.
반면에, StringBuffer는 동기화되어 있어 멀티스레드 환경에서 스레드 안전성을 제공하지만, 성능상의 이슈가 있을 수 있다.
요약
StringBuilder와 StringBuffer는 다양한 문자열 변경을 지원하는 java의 클래스이다.
StringBuilder와 다르게 StringBuffer는 동기화를 지원한다.
따라서 StringBuilder가 StringBuffer보다 단일 스레드에서는 빠르지만 멀티 스레드 환경에서는 안전하지 않을 수 있다.
또한 StringBuffer는 멀티 스레드 환경에서 안전하게 사용할 수 있지만, 성능 저하가 발생할 수 있다.
StringBuilder와 StringBuffer의 특징을 정확하게 파악하고 목적에 맞춰 사용하는 것이 중요하다.
'프로그래밍 언어 > Java 기초' 카테고리의 다른 글
[Java/Kotlin]Iterator (0) | 2023.05.11 |
---|