본문 바로가기
Java

String / StringBuilder / StringBuffer / StringWriter

by sgyeong 2025. 12. 18.

문자열을 다루는 클래스 String / StringBuilder / StringBuffer / StringWriter

 

 

String 

 

변경 가능성 : 불변

특징 : 문자열을 수정하거나 더할 때 기존 객체가 변하는 것이 아니라 새로운 String 객체가 메모리에 생성된다.

장점 : 변하지 않기 때문에 멀티쓰레드 환경에서 안전하며, 캐싱을 통해 메모리를 효율적으로 사용할 수 있다.

단점 : 문자열 연산이 빈번하게 일어나는 경우 계속해서 새로운 객체가 만들어지므로 성능저하와 메모리 낭비가 발생한다.

 

 

StringBuffer

 

변경 가능성 : 가변

특징 : 객체 내부의 값을 직접 수정할 수 있다. 문자열을 추가하거나 삭제할 때 새로운 객체를 만들지 않는다.

동기화 지원 : 메서드별로 동기화 처리가 되어있어 멀티쓰레드 환경에서 안전하다.

용도 : 여러 쓰레드가 동시에 같은 문자열 객체에 접근해야 할때 사용한다.

공간의 낭비가 없고, 문자열 연산 속도도 빠르다.

 

주요 메소드

.append("a") : 문자열 a 추가

.insert(n, "a") : 특정 위치에 a 삽입

.replace(n, m, "a") : n부터 m미만까지 범위 태체

.reverse() : 문자열 뒤집기

 

 

StringBuilder

 

변경 가능성 : 가변

특징 : 객체 내부의 값을 직접 수정할 수 있다. 문자열을 추가하거나 삭제할 때 새로운 객체를 만들지 않는다.

동기화 미지원 : 동기화를 고려하지 않기 때문에 StringBuffer보다 속도가 빠르다.

용도 : 단일 쓰레드 환경이나 멀티쓰레드 환경이더라도 특정 지역 변수 내에서만 문자열을 다룰 때 권장된다.

 

주요 메소드

.append("a") : 문자열 a 추가

.delete(n, m) : n부터 m까지 범위 삭제

.setCharAt(n, "b") : 인덱스 n의 문자를 b로 변경

.setLength(n) : 문자열 길이 강제 조정

 

 

구분 String StringBuffer StringBuilder
가변성 불변 가변 가변
동기화 해당 없음 지원 미지원
사용 시점 문자열 연산이 적을때 멀티쓰레드 환경 단일쓰레드 / 성능 중시

 

 

메모리 할당 방식의 차이

String은 Heap 영역 내의 String Constant Pool이라는 공간을 활용해서 동일한 문자열의 중복 생성을 방지하지만,

StringBuffer / StringBuilder는 일반적인 Heap 영역에 생성된다.

 

 

많은 양의 문자열 데이터 연산시 String 데이터를 + 연산하면 성능과 메모리 효율이 떨어지게 되어 좋지 않다. 그렇기 때문에  StringBuffer나 StringBuilder의 append() 메소드를 통해 문자열 데이터를 추가하는 것이 좋다고 한다. 

 

 

변하지 않는 문자열을 주로 쓴다면 > String

문자열 수정이 빈번하고 멀티 쓰레드 환경이라면 > StringBuffer
문자열 수정이 빈번하고 성능이 중요하다면 > StringBuilder

 

 

StringWriter 

 

문자열 출력을 위한 스트림이다. 문자열을 출력 스트림(stream) 형태로 쌓아두었다가 나중에 한꺼번에 문자열을 꺼낼때 사용한다.

내부적으로 StringBuffer를 사용하여 데이터를 저장한다.

writer.toString()을 호출하면 쌓여있던 모든 데이터가 하나의 문자열로 반환된다.

 

 

 

 

 

 

 

 

 

 

참고

https://inpa.tistory.com/entry/JAVA-%E2%98%95-String-StringBuffer-StringBuilder-%EC%B0%A8%EC%9D%B4%EC%A0%90-%EC%84%B1%EB%8A%A5-%EB%B9%84%EA%B5%90#thankYou

 

☕ 자바 String / StringBuffer / StringBuilder 차이점 & 성능 비교

자바에서는 대표적으로 문자열을 다루는 자료형 클래스로 String, StringBuffer, StringBuilder 라는 3가지 자료형을 지원한다. 위 3가지 클래스 자료형은 모두 문자열을 다루는데 있어 공통적으로 사용되

inpa.tistory.com

https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/StringBuffer.html

 

StringBuffer (Java SE 17 & JDK 17)

All Implemented Interfaces: Serializable, Appendable, CharSequence, Comparable A thread-safe, mutable sequence of characters. A string buffer is like a String, but can be modified. At any point in time it contains some particular sequence of characters, bu

docs.oracle.com

https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/StringBuilder.html

 

StringBuilder (Java SE 17 & JDK 17)

All Implemented Interfaces: Serializable, Appendable, CharSequence, Comparable A mutable sequence of characters. This class provides an API compatible with StringBuffer, but with no guarantee of synchronization. This class is designed for use as a drop-in

docs.oracle.com