본문 바로가기
카테고리 없음

자바 String, StringBuilder, StringBuffer 차이

by 기록하는 거부기 2025. 9. 2.

자바에서 문자열을 다루는 가장 기본적인 방법은 String 클래스를 사용하는 것입니다. 하지만 문자열이 자주 변경되는 상황에서는 StringBuilderStringBuffer를 활용하는 것이 더 효율적입니다. 이번 글에서는 이 세 가지 클래스의 특징과 차이점을 정리해 보겠습니다.


1. 자바에서 문자열을 다루는 방식

자바는 문자열을 단순한 데이터가 아닌 **객체(Object)**로 취급합니다.

  • 문자열 리터럴 "hello"는 내부적으로 String 객체로 관리됩니다.
  • 자바에서 문자열을 다루는 대표적인 클래스는 String, StringBuilder, StringBuffer 세 가지입니다.

각각의 클래스는 메모리 사용 방식과 쓰레드 안전성(Thread Safety)에서 차이가 있습니다.


2. String 클래스의 특징과 한계

String 클래스는 불변(Immutable) 객체입니다.

 
String str = "Hello";
str = str + " World"; // 새로운 String 객체가 생성됨
  • 특징: 한 번 생성된 문자열은 변경 불가능
  • 장점: 불변 객체이므로 메모리 안정성이 높고, 멀티스레드 환경에서도 안전하게 사용할 수 있음
  • 단점: 문자열을 자주 수정하는 경우 성능 저하 발생

즉, 변경이 거의 없는 문자열 데이터에 적합합니다.


3. StringBuilder의 특징과 활용

StringBuilder는 가변(Mutable) 문자열 클래스입니다.

StringBuilder sb = new StringBuilder("Hello");
sb.append(" World"); // 같은 객체 내부에서 문자열 변경
  • 특징: 문자열 수정 시 새로운 객체를 생성하지 않음
  • 장점: 문자열을 자주 연결하거나 수정할 때 성능이 매우 뛰어남
  • 단점: 멀티스레드 환경에서 안전하지 않음

따라서 단일 스레드 환경에서 문자열 처리를 최적화할 때 적합합니다.


4. StringBuffer의 특징과 차이점

StringBuffer는 StringBuilder와 거의 동일한 기능을 제공하지만, **쓰레드 안전(Thread-Safe)**합니다.

StringBuffer sbf = new StringBuffer("Hello");
sbf.append(" World");
  • 특징: 내부 메서드가 동기화(Synchronized)되어 있음
  • 장점: 멀티스레드 환경에서 안전하게 문자열 처리 가능
  • 단점: 동기화 처리로 인해 성능이 StringBuilder보다 다소 느림

즉, 멀티스레드 환경에서는 StringBuffer를, 단일 스레드 환경에서는 StringBuilder를 선택하는 것이 바람직합니다.


5. String, StringBuilder, StringBuffer 비교 정리

클래스 불변 여부 쓰레드 안전성 성능 사용 적합 환경
String 불변 안전 느림 문자열 변경이 적은 경우
StringBuilder 가변 안전하지 않음 빠름 단일 스레드 환경에서 문자열 자주 수정
StringBuffer 가변 안전 보통 멀티스레드 환경에서 문자열 수정

 

✅ 마무리

자바에서 문자열을 다룰 때 **변경 빈도와 실행 환경(단일/멀티스레드)**에 따라 적절한 클래스를 선택하는 것이 중요합니다.

  • 변경이 거의 없으면 String
  • 단일 스레드에서 성능이 중요하면 StringBuilder
  • 멀티스레드 환경이라면 StringBuffer

이렇게 선택하면 메모리 효율성과 실행 성능을 모두 잡을 수 있습니다.