티스토리 뷰

(Effective Java) 규칙63. 문자열 연결은 느리니 주의하라


문자열 연결 연산자


  • 문자열 연결 연산자(+)는 여러 문자열을 하나로 합쳐주는 편리한 수단이다.

  • 그런데 작고 크기가 고정된 객체의 문자열 표현을 만들때라면 괜찮지만, 본격적으로 사용하기 시작하면 성능 저하를 감내하기 어렵다.

     

성능 문제


  • 문자열 연결 연산자로 문자열 n개를 잇는 시간은 n^2에 비례한다.

  • 문자열은 불변(규칙 17)이라서 두 문자열을 연결할 경우 양쪽의 내용을 모두 복사해야 하므로 성능 저하는 피할 수 없는 결과이다.

  • 예) 문자열 연결을 잘못 사용한 예

    public String statement() {
        String result = "";
        for (inti = 0; i < numItems(); i++) 
            result +=lineForItem(i);    //문자열 연결
        return result;
    }
    • 품목이 많은 경우 위 메서드는 심하게 느려질 수 있음
  • 성능을 포기하고 싶지 않다면 String대신 StringBuilder를 사용해야 한다.

    public String statement2() {
        StringBuilder b = new StringBuilder(numItems() * LINE_WIDTH);
        for (int i = 0; i < numItems(); i++)
            b.append(lineForITem(i));
         return b.toString(); 
    }
    • StringBuilderStringchar 배열 형태로 저장하기 때문에 훨씬 빠름
    • 즉, append 시에 내부 배열 사이즈보다 클 경우에만 메모리 할당이 일어나게 됨 (배열 사이즈를 늘려야 하기 때문)
  • 자바 6 이후 문자열 연결 성능을 다방면으로 개선했지만, 이 두 메서드의 성능 차이는 여전히 크다 .

    • 필자가 품목을 100개로 하고 lineForItem이 길이 80인 문자열을 반환하게 하여 실행해보니 statement2가 6.5배나 빨랐다고 함

 

결론


  • 성능에 신경 써야 한다면 많은 문자열을 연결할 때는 문자열 연결 연산자(+)를 피하자.

    • 대신 StringBuilderappend 메서드를 사용하라
  • 문자 배열을 사용하거나 문자열을 (연결하지 않고)하나씩 처리하는 방법도 있다.

     


끝으로

이 글이 도움이 되었다면, 하단의 Google 광고 👎👎👎 한번씩 클릭 부탁 드립니다. 🙏🙏🙏

광고 클릭은 많은 힘이 됩니다! 

반응형
댓글