S E P H ' S

[Java] StringBuilder 본문

Programing & Coding/JAVA

[Java] StringBuilder

yoseph0310 2022. 12. 12. 20:57
왜 우린 StringBuilder를 썼을까?

 

StringBuilder는 단순히 알고리즘 문제를 풀면서 정답인 문자가 길어서 출력하는데 긴 시간이 걸리면 사용했었다. 그런데 한번도 그 이유에 대해서는 고민해보지는 않았던 것 같다.

 

SWEA 15758 무한 문자열 문제를 풀면서 다음과 같은 부분이 있었다. (자세한 것은 링크 참조)

 

// 코드 1

for (int i = 0; i < S_len; i++) {
    str_T += str_T;
}

 

반복되는 문자열을 비교하기 위해 각 두개의 문자열의 길이 만큼 각각 더해나가는 코드인데 이대로 코드를 제출했더니 메모리초과로 인해서 런타임 에러가 발생했다. 물론 역시 StringBuilder에 대해서 생각은 하지 않고 "이걸 써서 제출해야겠다" 하고 제출을 했고 그렇게 문제를 PASS하는데는 무리가 없었다. 다음이 StringBuilder를 사용한 코드이다.

 

// 코드 2

for (int i = 0; i < S_len; i++) {
    sb_T.append(str_T);
}

 

하지만 단순히 문자를 더한 것과 StringBuilder에 append한 것과의 차이는 몰랐기 때문에 알아보게 되었다.

 


String은 불변 객체(immutable)이다.


// 코드 3

String str1 = "abc";
String str2 = "def";

 

위와 같은 String 객체 두개가 있을 때 str1 + str2 와 같은 연산을 하게 되면 새로운 String 객체를 생성하게 된다. 게다가 String 객체끼리 더하는 행위는 메모리 할당과 메모리 해제를 발생시키며 성능에 문제를 야기하게 된다. 그래서 코드 1과 같은 연산으로 인해 메모리 초과가 발생했던 것이다.


그럼 StringBuilder는 ?


// 코드 4

StringBuilder sb = new StringBuilder();

String str1 = "abc";
String str2 = "def";

sb.append(str1).append(str2);

 

 

String은 변경 불가능한 문자열을 생성하지만 StringBuilder는 변경 가능한 문자열을 만들어주기 때문에 String을 합쳐야 하는 작업에서 더 유용하게 사용할 수 있다. String과는 다르게 기존의 데이터에 더하는 방식을 사용하기 때문에 상대적으로 속도도 빠르고 부하가 적다.

 


굉장히 자주 쓰는 String 과 StringBuilder임에도 이러한 사실을 잘 몰랐다는 것이 조금은 부끄럽기도 하다. 앞으로는 대충 알고 넘어가는 것이 아니라 정확히 알고 사용하는 습관을 들여야겠다는 생각을 하게 되었다.