문자열을 다루는 클래스 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()을 호출하면 쌓여있던 모든 데이터가 하나의 문자열로 반환된다.


참고
☕ 자바 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
'Java' 카테고리의 다른 글
| Java 메소드 정리 - BigInteger (0) | 2025.12.27 |
|---|---|
| Collections (클래스) / Collection (인터페이스) (0) | 2025.12.23 |
| 객체지향 프로그래밍 (OOP) (0) | 2025.12.17 |
| [Java] URLConnection / HttpURLConnection (0) | 2025.09.10 |
| [Java] 인터페이스 (Interface) (0) | 2025.09.10 |