Peony의 기록 창고 🌼
반응형

String이 있는데 굳이 StringBuilder를 왜 사용해야 할까?

자바에서 문자열을 생각하면 자연스럽게 String이 떠오른다.

String str1 = "Hello ";
String str2 = "Java";
str1 += str2;

System.out.println(str1); //"Hello Java"

이런 식으로 2개의 String객체가 있을 때, str1 + str2와 같은 연산을 하게 되면 새로운 String을 생성하는 것을 알 수 있다.

 

String은 소위 불변(immutable) 객체라고 한다. 즉, String 객체는 한 번 생성되면 변경할 수 없다. 위와 같이 + 연산자를 사용하여 문자열을 연결하면, 연결할 때마다 새로운 문자열 객체가 생성된다는 것을 의미한다. 또한 이전에 있던 문자열은 JVM의 GC가 처리하게 된다.

따라서, String 객체와 String 객체를 더하는 행위는 메모리 할당과 메모리 해제를 발생시키며 더하는 연산이 많아진다면 성능적으로 좋지 않다.

 

StringBuilder의 등장

위와 같은 문제점을 해결하기 위해 StringBuilder가 등장하게 되었다. StringBuilder는 String과 다르게 mutable 한 성질을 가지고 있다. 즉, 값이 변할 수 있다는 것이다.

StringBuilder는 String과 문자열을 더할 때 새로운 객체를 생성하는 것이 아니라 기존의 데이터에 더하는 방식을 사용하기 때문에 속도도 빠르며 상대적으로 부하가 적다.

따라서 긴 문자열을 더하는 상황이 발생할 경우 StringBuffer 또는 StringBuilder를 적극적으로 사용해보자.

 

StringBuffer와 StringBuilder의 차이는 멀티스레드 환경에서 thread-safe 여부가 다르다. StringBuffer는 thread-safe 하므로 여러 쓰레드에서 동시에 해당 문자열에 접근한다면 사용을 고려하고, 그렇지 않다면 StringBuilder를 사용하는 것이 성능에 더 유리하다. (성능과 thread-safe는 반비례라고 생각하면 된다.)

 

정리하면

  1. 문자열 변경이 빈번하지 않는다면 String 사용을 고려
  2. 문자열이 빈번하게 변경되면서 멀티쓰레드 환경이라면 StringBuffer 사용을 고려
  3. 문자열이 빈번하게 변경되면서 멀티쓰레드 환경이 아니라면 StringBuilder 사용을 고려

 

생성자

StringBuilder (java.lang.StringBuilder)

1. 기본 생성자

StringBuilder sb = new StringBuilder();

2. int size 값을 인자로 하는 생성자

  • int 타입의 값으로 buffer의 사이즈(capacity)를 지정한다.
StringBuilder sb = new StringBuilder(20);

3. String 문자열을 인자로 하는 생성자

StringBuilder sb = new StringBuilder("aaa");

 

주요 메소드

문자열을 추가하는 메소드

StringBuilder sb = new StringBuilder();
sb.append("abc");
sb.append(4).append("\n");

 

offset위치에 str 추가

sb.insert(int offset, String str);
sb.insert(2, "ccc")

 

첫 번째와 두 번째 파라미터로 받는 숫자 인덱스에 위치한 문자열을 대체한다.

sb.replace(int index1, int index2, String str);
sb.replace(3, 6, "hi")

 

인덱싱

if, 파라미터가 하나라면? 해당 인덱스부터 끝까지 인덱싱 한다.

두 개라면? start 부터 end - 1 까지 인덱싱 한다.

sb.substring(int start);
sb.substring(int start, int end);

sb.substring(5);
sb.substring(3, 7)

 

인덱스에 위치한 문자 하나를 삭제

sb.deleteCharAt(int index);
sb.deleteCharAt(3);

 

start 부터 end-1 까지의 문자를 삭제

sb.delete(int start, int end);
sb.delete(3, sb.length());

 

String으로 변환

sb.toString();

 

해당 문자 전체를 뒤집기

sb.reverse();

 

index 위치의 문자를 s로 변경

sb.setCharAt(int index, String s);

 

문자열 길이 조정

현재 문자열보다 길게 조정하면 공백으로 채워지고, 현재 문자열보다 짧게 조정하면 나머지 문자는 삭제한다.

sb.setLength(int len)

 

문자열이 저장된 char [] 배열 사이즈를 현재 문자열 길이와 동일하게 조정.

String 클래스의 trim()이 앞 뒤 공백을 제거하는 것과 같이 공백 사이즈를 제공하는 것, 배열의 남는 사이즈는 공백이므로, 문자열 뒷부분의 공백을 모두 제거해준다고 보면 된다.

sb.trimToSize()

 

Reference

https://docs.oracle.com/javase/7/docs/api/java/lang/StringBuilder.html?is-external=true

https://yangbox.tistory.com/58

 

반응형
profile

Peony의 기록 창고 🌼

@myeongju