[교재 EffectiveJava] 아이템 63. 문자열 연결은 느리지 주의하라

반응형
728x90
반응형

문자열 연결시 String 대신 StringBuilder을 사용 권장

문자열 연결 연산자(+)는 여러 문자열을 하나로 합쳐주는 편리한 수단이다. 이는 한줄짜리 출력값 혹은 작고 크기가 고정된 객체의 문자열 표현을 만들때는 괜찮지만, 본격적으로 사용하기 시작하면 성능 저하를 감내하기 어렵다. 

 

문자열 연결 연산자로 문자열 n개를 잇는 시간은 n의 제곱에 비례한다. 문자열은 불변이라서 두 문자열을 연결할 경우 양쪽의 내용을 모두 복사하므로 성능 저하를 피할 수 없는 결과다.

 

문자열 연결을 잘못 사용한 예시 - 느리다
package com.java.effective.item63;

public class Main {
    public static void main(String[] args) {
        
    }

    public String statement() {
        String result = "";
        
        for (int i = 0; i < numItems(); i++) {
            result += lineForItem(i); // 문자열 연결
        }
        
        return result;
    }
}

품목이 많을 경우 이 메서드는 심각하게 느려질 수 있다. 성능을 포기하고 싶지 않다면 String 대신 StringBuilder를 사용하자.

 

StringBuilder을 사용하면 문자열 연결 성능이 크게 개선된다. 
package com.java.effective.item63;

public class Main {
    public static void main(String[] args) {

    }

    public String statement() {
        StringBuilder b = new StringBuilder(numItems() * LINE_WIDTH);
        
        for ( int i = 0; i < numItems(); i++) {
            b.append(lineForItem(i));
        }
        
        return b.toString();
    }
}

StringBuilder을 사용한 코드가 대략 6.5배 더 빠르다. String 사용 코드의 경우, statement 메서드의 수행 시간은 품목 수의 제곱에 비례해 늘어나고 StringBuilder 사용 코드의 경우, 선형으로 늘어나므로 품목 수가 늘어날 수록 성능 차이도 커진다. 

 

 

 

 

반응형

Designed by JB FACTORY