[java] StringBuffer, StringBuilder

JH·2024년 4월 15일

java

목록 보기
21/21

StringBuffer

StringBuffer의 특징

  • StringBuffer는 가변적인 문자열을 다루는 클래스로, 한 번 생성된 StringBuffer 객체는 문자열 값을 바꿀 수 있습니다.
  • StringBuffer는 내부적으로 독립적인 공간 버퍼를 가지고 있습니다. 이 버퍼의 크기는 문자열 길이에 따라 가변적으로 변합니다.
  • StringBuffer 클래스는 스레드에 안전하며, 여러 스레드가 동시에 접근할 수 없습니다.

StringBuffer의 메소드

  • append(추가하고 싶은 값) : 전달받은 값을 문자열로 반환하여 해당 문자열의 마지막에 추가합니다.
StringBuffer sb = new StringBuffer();
sb.append("hello").append(13);
System.out.println(sb); // hello13

append()의 인자에는 boolean, char, char[], CharSequence, double, float, int, long, Object, String, StringBuffer 값이 모두 들어갈 수 있다.

  • insert(삽입할 인덱스, 삽입할 값) : 지정한 인덱스 위치에 입력 값을 문자열로 변환한 후 해당 인덱스 위치에 문자열을 추가합니다.
StringBuffer sb = new StringBuffer("hello");
sb.insert(3, "l");
System.out.println(sb); // helllo
  • delete(int start, int end) : 지정한 인덱스의 해당하는 부분 문자열을 제거합니다.
StringBuffer sb = new StringBuffer("hello");
sb.delete(0, 3);
System.out.println(sb); // lo
  • replace(int start, int end, String str) : 스트링 버퍼 내의 start가 지정하는 문자부터 end가 지정하는 문자를 str으로 대치합니다.
StringBuffer sb = new StringBuffer("hello");
sb.replace(0, 3, "so");
System.out.println(sb); // solo

reverse() : 스트링 버퍼 내의 문자들을 반대 순서로 변경합니다.

StringBuffer sb = new StringBuffer("hello");
sb.reverse();
System.out.println(sb); // olleh

capacity() : StringBuffer 인스턴스의 현재 버퍼 크기를 반환합니다.

StringBuffer sb = new StringBuffer();
System.out.println(sb.capacity()); // 16

sb.append("hello");
System.out.println(sb.capacity()); // 21

StringBuilder

StringBuilder의 특징

  • StringBuilder는 가변적인 문자열을 다루는 클래스로, 한 번 생성된 StringBuilder 객체는 문자열 값을 바꿀 수 있습니다.
  • StringBuilder는 StringBuffer와 비슷하지만, 동기화를 보장하지 않습니다. 따라서 StringBuilder 인스턴스는 여러 스레드에 의해 안전하게 사용될 수 없습니다.

StringBuilder의 메소드

StringBuffer와 같습니다.

StringBuffer와 StringBuilder의 차이와 장단점

둘의 차이점을 얘기하기 전에 굳이 String클래스가 있는데 StringBuilder와 StringBuffer가 있는 이유가 무엇인지부터 생각해봅시다.

String

먼저 String과 다른 클래스(StringBuffer, StringBuilder)의 차이점은 두 문자열 클래스의 아주 기본적인 차이는 String은 immutable(불변), StringBuffer는 mutable(변함)에 있습니다.

String 객체에 + 연산자를 통해 다른 문자열을 붙여 만드는 경우 기존 클래스에 이어 붙이는 것이 아닌 새로운 String 객체를 생성하게 됩니다.

String 객체는 이러한 이유로 문자열 연산이 많은 경우, 그 성능이 좋지 않습니다.
이러한 성능적 면에서 StringBuffer와 StringBuilder가 생겨나게 되었습니다.

StringBuffer, StringBuilder

StringBuffer와 StringBuilder 모두 문자열 연산으로 기존 객체의 공간이 부족해지면 기존의 버퍼 크기를 늘리며 유연하게 동작하며, 제공하는 메소드 또한 동일합니다.

단, 둘의 차이점은 동기화여부 입니다.

  • StringBuffer는 각 메서드별로 Synchronized Keyword가 존재하여, 멀티스레드 환경에서도 동기화를 지원합니다.
  • 반면, StringBuilder는 동기화를 보장하지 않습니다.

단일스레드 환경이라면 StringBuilder를 사용하는 것이 좋습니다. 단일 스레드환경에서 StringBuffer를 사용한다고 문제가 되는 것은 아니지만, 동기화 관련 처리로 인해 StringBuilder에 비해 성능이 좋지 않습니다.

결론

  • String은 짧은 문자열을 더할 경우 사용합니다.
  • StringBuffer는 스레드에 안전한 프로그램이 필요할 때나, 개발 중인 시스템의 부분이 스레드에 안전한지 모를 경우 사용하면 좋습니다.
  • StringBuilder는 스레드에 안전한지 여부가 전혀 관계 없는 프로그램을 개발할 때 사용하면 좋습니다.

단순 성능상으로만 비교한다면 연산이 많은 경우 StringBuilder > StringBuffer > String

profile
발전하는 백엔드 개발자

0개의 댓글