본문 바로가기
BackEnd/Java

[Java] StringBuilder, StringBuffer 사용 목적 및 차이점

by ryuneng 2025. 1. 15.
반응형

# 목적

: String의 특징을 이해하고 StringBuilder, StringBuffer의 사용 목적과 차이점에 대해 알아보기




String 이란?

: StringBuilder와 StringBuffer를 이해하기 위해서는 먼저 String에 대해 알아야 한다.
String은 문자열을 표현하는 불변객체로, 한 번 생성된 문자열은 절대로 변하지 않는다.

즉, String 객체 최초 생성 후에는 추가나 변경이 발생할 경우 새로운 객체가 생성된다.

쉬운 이해를 위해 예시를 들어 설명해보자.

int no = 100;
String name = "홍길동";
String email = "hong@gamil.com";
String tel = "010-1234-5678";

String text1 = "번호:" + no + ", 이름:" + name + ", 연락처:" + tel;
System.out.println(text1);
// 출력 결과 - 번호:100, 이름:홍길동, 연락처:010-1234-5678

/*
 * 결과가 나오기까지의 과정
 *  과정1   - 번호:
 *  과정2   - 번호:100
 *  과정3   - 번호:100, 이름:
 *  과정4   - 번호:100, 이름:홍길동
 *  과정5   - 번호:100, 이름:홍길동, 연락처:
 *  최종결과 - 번호:100, 이름:홍길동, 연락처:010-1234-5678
 */

위처럼 출력결과만 보면 하나의 객체로만 이루어진 결과같지만,
실제로는 +연산자를 통해 이어질 때마다 새로운 객체가 생성되는 6번의 과정을 걸쳐 나온 결과라는 것이다.

이런 경우에는 불필요한 객체 생성과 함께 실행 성능이 저하되고, 메모리 효율이 떨어진다.

이를 보완하기 위해 사용하는 것이 바로 StringBuilder와 StringBuffer라고 할 수 있다.




StringBuilder, StringBuffer를 사용하는 이유

: 두 클래스는 객체 내부에 임시저장소(버퍼)를 가지고 있어서 새로운 객체 생성 없이 임시저장소에 데이터를 저장할 수 있다.

append(값) 메소드를 사용해서 값을 추가하면 임시저장소에 저장될 뿐, 새로운 객체가 생성되지는 않는다.

* StringBuilder와 StringBuffer의 코드 및 사용법은 모두 동일하다.




StringBuilder와 StringBuffer의 차이점

1. StringBuilder
: A thread unsafe, 동기화처리 X
→ 단일스레드 환경에서는 StringBuilder를 사용하는 것이 좋다.

2. StringBuffer
: A thread safe, 동기화처리 O
→ 멀티쓰레드 환경에서 사용한다.




StringBuilder 사용 예시1

- 기본적인 사용법

int no = 100;
String name = "홍길동";
String email = "hong@gamil.com";
String tel = "010-1234-5678";

StringBuilder sb = new StringBuilder();
sb.append("번호:");
sb.append(no);
sb.append(", 이름:");
sb.append(name);
sb.append(", 전화번호:");
sb.append(tel);

String text2 = sb.toString();
System.out.println(text2);
// 출력 결과 - 번호:100, 이름:홍길동, 연락처:010-1234-5678

StringBuilder 사용 예시2

- Method Chaining(메소드 체이닝)을 이용한 방법

int no = 100;
String name = "홍길동";
String email = "hong@gamil.com";
String tel = "010-1234-5678";

StringBuilder sb = new StringBuilder();

// StringBuilder의 append() 메소드는 StringBuilder 객체를 반환한다.
// 따라서, append() 메소드의 실행 결과가 StringBuilder 객체이기 때문에
// append() 메소드에 이어서 다시 append() 메소드를 실행하는 것이 가능하다.
// 이런 식의 실행방식을 Method Chaining 이라고 한다.
String text3 = sb.append("번호:")
                 .append(no);
			     .append(", 이름:");
			     .append(name);
			     .append(", 전화번호:");
			     .append(tel);
                 .toString();

System.out.println(text3);
// 출력 결과 - 번호:100, 이름:홍길동, 연락처:010-1234-5678

* StringBuffer의 사용법 또한 StringBuilder의 사용법과 모두 동일하기 때문에 생략함


 


< 해당 글은 velog에서 이전하며 옮겨온 글로, 가독성이 좋지 않을 수 있는 점 양해 부탁드립니다. >

🔗 velog 버전 보기 : https://velog.io/@ryuneng2/Java-StringBuilder-StringBuffer