Reference/Effective-Java

[Effective-Java] Chapter9 #63. 문자열 연결은 느리니 주의하라

나죽못고나강뿐 2023. 7. 22. 08:56

이건 자바로 코테 쳐봤으면 누구나 알 법한 이야기.

 

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

한 줄짜치 출력값 혹은 작고 크기가 고정된 객체의 문자열 표현을 만들 때는 괜찮은 방법이다.

하지만 본격적으로 사용하게 되면, 문자열 연결 연산자로 문자열 n개를 잇는 시간은 n^2에 비례한다.

String은 불변 클래스이므로 두 문자열 연결을 위해 양쪽 내용을 모두 복사해야 한다

 

📌 StringBuilder
 

[Effective-Java] Chapter4 #17. 변경 가능성을 최소화하라 : 불변 클래스

불변 클래스란 그 인스턴스 내부 값을 수정할 수 없는 클래스를 말한다. 불변 인스턴스에 간직된 정보는 객체가 파괴되는 순간까지 절대 달라지지 않는다. 자바 플랫폼 라이브러리의 String, 기본

jaeseo0519.tistory.com

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

예전에 잠깐 나왔었던 가변 동반 클래스인 StringBuilder를 사용하면 성능 저하를 줄일 수 있다.

(필자의 테스트 상으론) StringBuilder를 충분한 크기로 초기화 했을 때, 문자열 연결방식보다 6.5배 빨랐고,

크기를 초기화 하지 않고 기본값으로 설정했을 때도 5.5배는 빨랐다.