본문 바로가기
GD's IT Lectures : 기초부터 시리즈/자바(JAVA) 기초부터 ~

[자바(JAVA)] 문자열 처리 - StringBuilder와 StringBuffer 클래스

by GDNGY 2023. 4. 27.

8.2. StringBuilder와 StringBuffer 클래스

StringBuilder와 StringBuffer는 자바에서 문자열을 효율적으로 조작하기 위한 클래스입니다. 문자열을 반복적으로 수정하거나 연결할 때, 불변인 String 클래스를 사용하면 성능 문제가 발생할 수 있습니다. 이때 StringBuilder와 StringBuffer를 사용하면 효율적으로 문자열을 수정할 수 있습니다.

 

StringBuilder는 문자열 조작에 대해 동기화를 보장하지 않으며, 멀티스레드 환경에서 사용하지 않는 경우 성능이 더 좋습니다. 반면, StringBuffer는 동기화를 보장하므로 멀티스레드 환경에서 안전하게 사용할 수 있습니다.

 

StringBuilder와 StringBuffer 객체 생성하기
StringBuilder sb1 = new StringBuilder(); // 빈 StringBuilder 객체 생성
StringBuffer sb2 = new StringBuffer(); // 빈 StringBuffer 객체 생성

StringBuilder sb3 = new StringBuilder("Hello, "); // 초기 문자열을 가진 StringBuilder 객체 생성
StringBuffer sb4 = new StringBuffer("Hello, "); // 초기 문자열을 가진 StringBuffer 객체 생성

 

문자열 추가하기 (append)
sb1.append("Hello, ");
sb1.append("World!");
// 결과: "Hello, World!"

sb2.append("Java is ");
sb2.append("awesome!");
// 결과: "Java is awesome!"

 

문자열 삽입하기 (insert)
sb3.insert(7, "Java ");
// 결과: "Hello, Java World!"

 

문자열 삭제하기 (delete)
sb4.delete(0, 7);
// 결과: "World!"

 

문자열 대체하기 (replace)
sb1.replace(0, 5, "Goodbye");
// 결과: "Goodbye, World!"

 

문자열의 길이 구하기 (length)
int length = sb1.length(); // sb1의 길이를 구합니다.

 

문자열의 용량 구하기 (capacity)
int capacity = sb1.capacity(); // sb1의 현재 할당된 메모리 용량을 구합니다.

 

StringBuilder와 StringBuffer 객체를 문자열로 변환하기 (toString)
String str1 = sb1.toString(); // StringBuilder 객체를 String 객체로 변환합니다.
String str2 = sb2.toString(); // StringBuffer 객체를 String 객체로 변환합니다.

 

StringBuilder와 StringBuffer 클래스를 사용하면 문자열 조작 작업을 효율적으로 수행할 수 있습니다. 반복적인 문자열 수정 작업이 필요한 경우, 이 클래스들을 활용하여 성능을 향상시킬 수 있습니다. 다만, 멀티스레드 환경에서는 동기화를 고려하여 StringBuffer를 사용해야 합니다.

 


※ String과 StringBuffer 클래스의 서로 다른 특성과 사용 사례

 

String 특성
  • 불변(immutable): String 객체는 생성된 후 변경할 수 없습니다. 문자열을 수정하려면 새로운 String 객체를 생성해야 합니다.
  • 성능: 문자열 조작 작업이 많은 경우, 불변성 때문에 새로운 객체를 반복적으로 생성해야 하므로 성능에 부담이 됩니다.
  • 스레드 안전(thread-safe): 불변성 때문에 동시에 여러 스레드에서 String 객체를 사용해도 안전합니다.
  • 메모리 효율성: 동일한 문자열을 가진 String 객체는 메모리에서 공유될 수 있습니다.

 

StringBuffer 특성
  • 가변(mutable): StringBuffer 객체는 변경할 수 있으며, 내부 버퍼를 사용하여 문자열을 수정합니다. 이로 인해 추가적인 객체 생성 없이 문자열 조작이 가능합니다.
  • 성능: 문자열 조작 작업이 많은 경우, StringBuffer는 String보다 더 나은 성능을 제공합니다.
  • 스레드 안전(thread-safe): StringBuffer는 동기화(synchronization)를 사용하여 동시에 여러 스레드에서 사용될 때 안전성을 보장합니다. 하지만 동기화로 인해 성능 저하가 발생할 수 있습니다.
  • 메모리 효율성: 문자열을 수정할 때, StringBuffer는 메모리를 더 효율적으로 사용합니다. 그러나 동기화로 인한 오버헤드가 있을 수 있습니다.

 

두 클래스의 주요 차이점은 불변성과 가변성, 그리고 스레드 안전성입니다. 문자열 조작이 많은 작업에는 StringBuffer를 사용하는 것이 좋습니다. 하지만, 문자열이 변경되지 않거나 동기화에 따른 성능 저하를 피하려면 String을 사용하는 것이 좋습니다. 추가적으로, 동기화가 필요하지 않은 상황에서는 StringBuilder를 고려할 수도 있습니다. StringBuilder는 StringBuffer와 유사하지만 동기화를 사용하지 않으므로 성능이 더 빠릅니다.
반응형

댓글