1. 공통점
StringBuilder 클래스와 StringBuffer 클래스는 모두 가변 문자열 클래스입니다.가변 구조이기 때문에 내부적으로 버퍼를 사용하여 문자열을 저장합니다. 즉, 새로운 문자열을 만들지않고 버퍼안에서 값을 수정하는 것입니다. 따라서 문자열을 합치거나 수정할때 불변 문자열처럼 새로운 객체를 생성하지않기 때문에 메모리 효율적입니다. 이러한 점 때문에 문자열을 자주 변경할 경우에 많이 사용합니다. 그리고 두개의 클래스는 거의 대부분의 메서드가 동일합니다.
주 사용 메서드는 아래와 같습니다.
append(String str) : 주어진 문자열(str)을 현재 StringBuilder 객체의 끝에 추가합니다.
insert(int offset, String str) : 주어진 문자열(str)을 지정된 위치(offset)에 삽입합니다.
delete(int start, int end) : 지정된 범위(start부터 end-1까지)에 해당하는 문자열을 삭제합니다.
replace(int start, int end, String str) : 지정된 범위(start부터 end-1까지)에 해당하는 문자열을 주어진 문자열(str)로 대체합니다.
reverse() : StringBuilder 객체에 있는 문자열을 뒤집습니다.
length() : StringBuilder 객체의 문자열의 길이를 반환합니다.
toString() : StringBuilder 객체에 있는 문자열을 String 타입으로 변환하여 반환합니다.
이 두개의 클래스의 시간복잡도와 공간복잡도는 모두 O(n)입니다.
2. 차이점
이 두개의 클래스는 차이점도 있습니다.
먼저 StringBuilder클래스는 동기화를 하지않습니다. 이러한 점 때문에 단일스레드 환경에서 효율적입니다. 동기화를 하지않기 때문에 멀티스레드 환경에서 사용한다면 데이터 불일치가 발생할 수 있습니다.
반면에 StringBuffer클래스는 모든 주요메서드에 동기화가 되어있습니다. 따라서 멀티스레드 환경에서 유리하지만 동기화때문에 오버헤드가 발생하여 단일스레드 환경에서는 StringBuilder보다 효율이 좋지 않습니다.
3. 예제 코드
public class Main {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("Hello");
StringBuffer sf = new StringBuffer("Hello");
sb.append(" World!"); //문자 열 끝에 추가
sf.append(" World!");
System.out.println("StringBuilder 문자열 추가::"+sb.toString()); // StringBuilder 문자열 추가::Hello World!
System.out.println("StringBuffer 문자열 추가::"+sf.toString()); // StringBuffer 문자열 추가::Hello World!
sb.delete(5,6); //문자열 5번째부터 6번째까지 삭제
sf.delete(5,6);
System.out.println("StringBuilder 문자열 삭제::"+sb.toString()); // StringBuilder 문자열 삭제::HelloWorld!
System.out.println("StringBuffer 문자열 삭제::"+sf.toString()); // StringBuffer 문자열 삭제::HelloWorld!
sb.insert(0, "me"); //0번째 인덱스에 문자열 'me' 추가
sf.insert(0, "me");
System.out.println("StringBuilder 문자열 삽입::"+sb.toString()); // StringBuilder 문자열 삽입::meHelloWorld!
System.out.println("StringBuffer 문자열 삽입::"+sf.toString()); // StringBuffer 문자열 삽입::meHelloWorld!
sb.delete(0, 2);//문자열 0번재부터 2번째까지 삭제
sf.delete(0, 2);
System.out.println("StringBuilder 문자열 중간 삭제::"+sb.toString()); // StringBuilder 문자열 중간 삭제::HelloWorld!
System.out.println("StringBuffer 문자열 중간 삭제::"+sf.toString()); // StringBuffer 문자열 중간 삭제::HelloWorld!
sb.replace(1,5, "i");//1번 인덱스부터 5번째 인덱스까지 문자열을 'i'로 교체
sf.replace(1,5, "i");
System.out.println("StringBuilder 문자열 교체::"+sb.toString()); // StringBuilder 문자열 교체::HiWorld!
System.out.println("StringBuffer 문자열 교체::"+sf.toString()); // StringBuffer 문자열 교체::HiWorld!
sb.reverse();//문자열 뒤집기
sf.reverse();
System.out.println("StringBuilder 문자열 뒤집기::"+sb.toString()); // StringBuilder 문자열 뒤집기::!dlroWiH
System.out.println("StringBuffer 문자열 뒤집기::"+sf.toString()); // StringBuffer 문자열 뒤집기::!dlroWiH
}
}
'JAVA Programming > Java' 카테고리의 다른 글
| [JAVA] 래퍼클래스 (0) | 2025.09.11 |
|---|---|
| [JAVA] 컬렉션 프레임워크 (0) | 2025.09.10 |
| [JAVA] 좋은 객체지향 설계의 5가지 원칙(SOLID) (0) | 2024.12.12 |
| [JAVA] 키보드 입력 받기(Scanner) (0) | 2024.07.14 |
| [JAVA] 메소드 (0) | 2024.07.10 |