나의개발일지
[java] String, StringBuilder, StringBuffer 본문
📌 String, StringBuilder, StringBuilder
Java를 공부하다 보면 문자열을 다루는 세 가지 대표 클래스인 String, StringBuffer, StringBuilder를 만나게 됩니다. 이들은 모두 문자열을 다루지만 내부 동작 방식, 성능, 쓰레드 안정성에서 차이를 보입니다. 오늘은 이 세 가지의 차이점과 언제 어떤 것을 사용해야 하는지 정리해보겠습니다.
String은 따로 이전 포스트에 정리해놓았습니다.
2025.05.14 - [기본기를 다지자/자료구조] - [java] String
String, StringBuffer, StringBuilder 비교 한눈에 보기
특징 | String | StringBuffer | StringBuilder |
변경 가능 여부 | 불변 (Immutable) | 가변 (Mutable) | 가변 (Mutable) |
쓰레드 안전성 | 안전 (하지만 의미 없음) | ✅ 동기화 (Thread-safe) | ❌ 비동기 (Thread-unsafe) |
성능 | 느림 (변경 시마다 새 객체 생성) | 중간 (동기화로 인한 오버헤드) | 빠름 (비동기, 단일 스레드에 적합) |
사용 추천 상황 | 문자열이 자주 바뀌지 않는 경우 | 멀티스레드 환경 | 단일 스레드 환경에서 문자열 조작 많을 때 |
📌 StringBuilder, StringBuffer 설명
StringBuffer
StringBuffer는 가변 객체로, 문자열을 수정할 때마다 새 객체를 만들지 않고 기존 객체 내에서 수정합니다. 또한 StringBuffer는 내부적으로 동기화 처리가 되어 있어서 멀티스레드 환경에서 안전하게 사용할 수 있습니다.
- 동기화(Synchronized) 기능을 제공하기 때문에, 여러 스레드가 동시에 StringBuffer 객체를 접근하더라도 데이터의 일관성을 보장할 수 있다.
- 주로 멀티스레드 환경에서 안전하게 문자열을 조작해야 할 때 사용한다.
- 예: 로그 기록, 서버 응답 조립 등 여러 스레드가 동시에 문자열을 다룰 가능성이 있는 상황
StringBuffer sb = new StringBuffer("Hello");
sb.append(" World");
System.out.println(sb); // 출력: Hello World
StringBuilder
StringBuilder는 StringBuffer와 거의 동일한 기능을 제공하지만, 동기화 처리가 되어 있지 않기 때문에 더 빠릅니다. 단일 스레드 환경 또는 동기화가 필요 없는 경우에 사용하면 성능 측면에서 유리합니다.
- 사용 예: 반복문에서 문자열을 누적해서 조립할 때, 간단한 텍스트 처리 프로그램 등
- 동기화가 필요 없거나 성능이 중요한 경우에 적합
StringBuilder sb = new StringBuilder("Hello");
sb.append(" World");
System.out.println(sb); // 출력: Hello World
📌 StringBuilder, StringBuffer 메서드
StringBuffer와 StringBuilder는 대부분 동일한 메서드를 가진다. 둘다 AbstractStringBuilder라는 추상 클래스를 상속 받아 구현되어 있기 때문에 기능과 메서드가 거의 완전히 동일하다.
메서드 | 설명 | 예시 |
append(String str) | 문자열 끝에 추가 | sb.append("World"); → "HelloWorld" |
insert(int offset, String str) | 특정 위치에 문자열 삽입 | sb.insert(5, ","); → "Hello,World" |
replace(int start, int end, String str) | 지정 범위 문자열 교체 | sb.replace(0, 5, "Hi"); → "Hi,World" |
delete(int start, int end) | 지정 범위 문자열 삭제 | sb.delete(2, 3); → "HiWorld" |
deleteCharAt(int index) | 지정 인덱스 문자 삭제 | sb.deleteCharAt(2); → "Hiorld" |
reverse() | 문자열을 뒤집음 | sb.reverse(); → "dlroW,iH" |
toString() | 최종 문자열 반환 | String s = sb.toString(); |
length() | 현재 문자열 길이 반환 | sb.length(); |
capacity() | 현재 버퍼의 용량 반환 | sb.capacity(); |
setLength(int newLength) | 문자열 길이를 강제로 조정 (자르면 잘림) | sb.setLength(3); |
charAt(int index) | 특정 인덱스 문자 반환 | char c = sb.charAt(0); |
setCharAt(int index, char ch) | 특정 위치 문자 변경 | sb.setCharAt(0, 'K'); |
🤔 느낀점
오늘은 StringBuilder와 StringBuffer에 대해 자세히 알아보았는데 처음안 사실도 있었고, 원래 알던 사실도 있었다. 이번 공부로 StringBuilder와 StringBuffer를 많이 사용해야 겠다.
'기본기를 다지자 > 자료구조' 카테고리의 다른 글
[java] String (1) | 2025.05.14 |
---|---|
[java] Set (HashSet) (0) | 2025.04.29 |
레드-블랙 트리 (삭제) (0) | 2025.04.28 |
레드-블랙 트리 (개념 + 삽입) (0) | 2025.04.01 |
[java] TreeMap (0) | 2025.03.27 |