본문 바로가기
Java

Java 문자열 처리 이해: String vs. StringBuffer vs. StringBuilder

by 우 석 2024. 1. 10.

자바에서 문자열을 다룰 때 String, StringBuffer, 그리고 StringBuilder 세 가지 주요 클래스가 사용됩니다. 각 클래스의 역할을 이해하고  장단점을 파악하여, 각각을 언제 사용해야 하는지를 정리해 보았습니다.

 

1. String

장점:

  • 불변성: String 클래스의 인스턴스는 불변성을 가지고 있어, 생성 후에는 값을 변경할 수 없습니다.
  • 보안성: 값을 변경할 수 없음으로 의도하지 않은 수정을 방지하여 보안을 향상합니다.
  • 문자열 풀: 리터럴 문자열을 위한 문자열 풀을 유지하여 메모리 소비를 줄입니다.

단점:

  • 비효율적인 수정: 자주 발생하는 문자열 연결 또는 수정은 많은 임시 객체의 생성으로 이어져 메모리 공간이 낭비되고 속도가 느려질 수 있습니다.
  • 메모리 오버헤드: 각 수정 작업은 새로운 문자열 객체를 생성하므로 메모리 사용량이 증가합니다.

String을 사용하는 경우:

  • 불변성이 중요한 경우
  • 보안 및 스레드 안전이 필수인 경우
  • 문자열 조작이 최소한인 경우


2. StringBuffer

장점:

  • 가변성: StringBuffer 클래스의 인스턴스는 내용을 수정할 수 있어 자주 발생하는 문자열 조작에 적합합니다.
  • 스레드 안전: StringBuffer 메서드는 동기화되어 있어 다중 스레드 환경에서 안전한 작업을 보장합니다.

단점:

  • 성능 오버헤드: 동기화는 성능 비용을 동반하며, StringBuilder에 비해 단일 스레드 시나리오에서 효율적이지 않을 수 있습니다.
  • 문자열 풀 미사용: String과 달리 StringBuffer는 리터럴 문자열을 위한 문자열 풀을 사용하지 않습니다.

StringBuffer를 사용하는 경우:

  • 가변성이 필요한 경우
  • 스레드 안전이 필요한 경우
  • 다중 스레드 환경에서 자주 문자열을 수정해야 하는 경우


3. StringBuilder:

장점:

  • 가변성: StringBuilder는 StringBuffer와 같이 Buffer(임시 메모리)에 문자열을 저장하기 때문에 문자열을 효율적으로 수정할 수 있습니다.
  • 성능: StringBuilder는 동기화되지 않아 StringBuffer에 비해 단일 스레드 시나리오에서 더 나은 성능을 제공합니다.

단점:

  • StringBuilder는 동기화가 없어 여러 스레드가 동시에 수정하는 경우에는 적합하지 않습니다.
  • 문자열 풀 미사용: StringBuffer와 마찬가지로 StringBuilder도 리터럴 문자열을 위한 문자열 풀을 사용하지 않습니다.

StringBuilder를 사용하는 경우:

  • 가변성이 필요한 경우
  • 스레드 안전이 고려되지 않는 경우 (단일 스레드)
  • 성능이 중요하며 동기화 오버헤드를 피하고자 하는 경우

 

 과제 중 습관적으로  String만 사용하다가, 코드 리뷰를 받고, 수정이 필요한 상황에 안전한 StringBuffer를 알게 되었습니다. 

'Java' 카테고리의 다른 글

Stream  (0) 2024.01.12
Map의 Value로 Class ? 𖦹 ˍ 𖦹  (0) 2024.01.11
상속 (Inheritance)  (0) 2024.01.09
접근 제어자 (Access Modifier), Getter, Setter  (0) 2024.01.08
List  (0) 2024.01.05