나의개발일지

[java] String, StringBuilder, StringBuffer 본문

기본기를 다지자/자료구조

[java] String, StringBuilder, StringBuffer

아. 이렇게 하면 될거 같은데.. 2025. 5. 21. 22:43
728x90


 


📌 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를 많이 사용해야 겠다.

 

 

 

728x90
반응형

'기본기를 다지자 > 자료구조' 카테고리의 다른 글

[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