프로그래밍 언어/Java 기초

[JAVA] StringBuilder와 StringBuffer의 차이점

뿌꾸 빵 2024. 7. 5. 14:52
728x90
반응형

알고리즘 문제를 풀다가 String으로는 시간이 너무 오래 걸려, StringBuilder와 StringBuffer를 골라 사용해야 하는 경우가 있었다.

문득 그 두 클래스의 차이가 궁금해졌다.

 


 

StringBuilderStringBuffer는 둘 다 문자열을 변경 가능하게 다룰 수 있는 Java 클래스이다.

이 둘의 기본적인 용도와 동작은 유사하지만 다음과 같은 몇 가지 차이가 있다.

 

  1. 동기화(Synchronization)
    • StringBuilder
      • 동기화되지 않음 (Non-synchronized).
      • 따라서, 멀티스레드 환경에서 안전하지 않을 수 있지만, 단일 스레드 환경에서 StringBuffer보다 더 빠름.
    • StringBuffer
      • 동기화됨 (Synchronized)
      • 멀티스레드 환경에서 여러 스레드가 안전하게 사용할 수 있지만, 이에 따라 성능 저하 우려.
  2. 성능
    • StringBuffer는 동기화되어 스레드 안전성을 지원하는 반면, StringBuilder는 동기화를 제공하지 않아서 상대적으로 더 빠름.
  3. 스레드 안전성
    • StringBuilder는 단일 스레드 환경에서 안전하지만, 멀티스레드 환경에서 안전하지 않음.
    • StringBuffer는 멀티스레드 환경에서 스레드 안전성을 제공하여 여러 스레드가 동시에 접근할 때 데이터 일관성을 보장.

 

따라서, 단일 스레드 환경에서 작업하는 경우에는 StringBuilder를 사용하는 것이 더 효율적이다.

하지만 멀티스레드 환경에서 작업하거나 스레드 안전성이 필요한 경우에는 StringBuffer 사용을 추천한다.

 


 

  StringBuilder StringBuffer
동기화 X O
성능 상대적으로 빠름 상대적으로 느림
스레드 안정성 멀티 스레드 환경에서는 안전하지 않음 멀티 스레드 환경에서 안전성 제공 (데이터 일관성 보장)

 

 


 

StringBuilder 사용 방법

// StringBuilder 인스턴스 생성
StringBuilder stringBuilder = new StringBuilder();

// 문자열 추가 (append 메서드 사용)
stringBuilder.append("Hello");

// 문자열 삽입 (insert 메서드 사용)
stringBuilder.insert(5, " World");

// 문자열 삭제 (delete 메서드 사용)
stringBuilder.delete(5, 11);

// 문자열 업데이트 (replace 메서드 사용)
stringBuilder.replace(0, 5, "Hi");

// StringBuilder를 String으로 변환
String finalString = stringBuilder.toString();

StringBuffer 사용 방법

StringBuffer는 기본적으로 StringBuilder와 비슷하지만 동기화된 메소드로 스레드 안전성을 제공한다.

// StringBuffer 인스턴스 생성
StringBuffer stringBuffer = new StringBuffer();

// 문자열 추가 (append 메서드 사용)
stringBuffer.append("Hello");

// 문자열 삽입 (insert 메서드 사용)
stringBuffer.insert(5, " World");

// 문자열 삭제 (delete 메서드 사용)
stringBuffer.delete(5, 11);

// 문자열 업데이트 (replace 메서드 사용)
stringBuffer.replace(0, 5, "Hi");

// StringBuffer를 String으로 변환
String finalString = stringBuffer.toString();

 

위 코드에서 사용된 주요 메서드

  • append(): 문자열 끝에 문자열을 추가
  • insert(): 지정된 위치에 문자열을 삽입
  • delete(): 지정된 범위 내의 문자열을 삭제
  • replace(): 지정된 범위 내의 문자열을 다른 문자열로 대체
  • toString(): StringBuilder 또는 StringBuffer 객체를 String으로 변환

주의할 점은, StringBuilder는 스레드 안전성을 제공하지 않기 때문에 멀티스레드 환경에서 사용 시 동기화에 대한 고려가 필요하다.

반면에, StringBuffer는 동기화되어 있어 멀티스레드 환경에서 스레드 안전성을 제공하지만, 성능상의 이슈가 있을 수 있다.

 


요약

StringBuilder와 StringBuffer는 다양한 문자열 변경을 지원하는 java의 클래스이다.

StringBuilder와 다르게 StringBuffer는 동기화를 지원한다.

따라서 StringBuilder가 StringBuffer보다 단일 스레드에서는 빠르지만 멀티 스레드 환경에서는 안전하지 않을 수 있다.

또한 StringBuffer는 멀티 스레드 환경에서 안전하게 사용할 수 있지만, 성능 저하가 발생할 수 있다.

 

StringBuilder와 StringBuffer의 특징을 정확하게 파악하고 목적에 맞춰 사용하는 것이 중요하다.

728x90
반응형