Post

Item 63 - 문자열 연결은 느리니 주의하라

문자열 연결 연산자 (+)

  • 문자열 연결 연산자(+)는 여러 문자열을 하나로 합쳐주는 편리한 수단이다.
  • 하지만, 본격적으로 사용하면 성능 저하를 감내하기 어렵다.
  • 문자열 연결 연산자(+)로 문자열 n개를 잇는 시간은 n^2에 비례한다.
  • String불변이라서 두 문자열을 연결할 경우, 양쪽 내용을 모두 복사해야 한다.

청구서의 품목(item)을 전부 하나의 문자열로 연결하는 메서드

1
2
3
4
5
6
7
// 문자열 연결을 잘못 사용한 예 - 느리다!
public String statement() {
    String result = "";
    for (int i = 0; i < numItems(); i++)
        result += lineForItem(i); // 문자열 연결
    return result;
}
  • 품목의 개수가 많아지면 많아질수록 성능 저하가 심해진다.

StringBuilder

1
2
3
4
5
6
7
// StringBuilder를 사용하면 문자열 연결 성능이 크게 개선된다.
public String statement2() {
    StringBuilder b = new StringBuilder(newItems() * LINE_WIDTH);
    for (int i = 0; i < numItems(); i++)
        b.append(lineForItem(i));
    return b.toString();
}
  • 성능을 포기하고 싶지 않다면 String 대신 StringBuilder를 사용하자.
  • statement 메서드 수행 시간은 품목 개수의 제곱에 비례해 늘어나고, statement2는 선형으로 늘어나므로, 품목 수가 늘어날수록 성능 격차도 점점 벌어진다.

💡 핵심 정리

  • 성능을 신경 써야 한다면 많은 문자열을 연결할 때는 문자열 연결 연산자(+)를 피하자.
  • 대신 StringBuilderappend 메서드를 사용하자.
  • 문자 배열을 사용하거나, 문자열을 연결하지 않고 하나씩 처리하는 방법도 있다.
This post is licensed under CC BY 4.0 by the author.