Programming/Effective Java

[이펙티브자바] Item 63. 문자열 연결은 느리니 주의하라

오딩이 2022. 7. 27. 21:51

작고 크기가 고정된 객체의 문자열은 문자열 연결 연산자(+)를 사용해도 되지만,
많은 문자열을 연결할 때는 StringBuilder를 사용하자

 

🔎 문자열 연결 연산자(+) vs StringBuilder, append()

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

한 줄짜리 출력 값이나 작고 크기가 고정된 객체의 문자열 표현을 만들 땐 편리하고 좋지만,

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

즉, 엄청엄청엄청엄청 느리다,,,,,,

 

예를 들어, 다음과 같이 청구서의 품목(item)을 전부 하나의 문자열로 연결하는 코드를 작성해보자.

/* 문자열 연결 연산자(+) 사용 */
public String statement() {
	String result = "";
    for (int i=0 ; i<numItems() ; i++){
    	result += lineForItem(i);  // 문자열 연결
    }
    return result;
}
/* StringBuilder사용 */
public String statement2() {
	StringBuilder sb = new StringBuilder(numItems() * LINE_WIDTH);
    for(int i=0 ; i<numItems() ; i++){
    	sb.append(lineForItem(i));
    }
    return sb.toString();
}

품목이 100개이고, lineForItem이 길이 80인 문자열을 반환한다면 statement2()가 statement()보다 무려 6.5배나 빨랐다.

statement 메서드의 수행 시간은 품목 수의 제곱이 비례해 늘어나고,

statement2 메서드의 수행 시간은 선형으로 늘어난다.

이 말은 즉,, 품목 수가 늘어나면 늘어날수록 성능 격차도 점점 더 벌어진다.

 

 

📚 정리!

성능에 신경 써야 한다면,
많은 문자열을 연결할 때는 문자열 연산자(+)를 피하고, 대신 StringBuilder를 사용하자. 
문자 배열을 사용하거나, 문자열을 연결하지 않고 하나씩 처리하는 방법도 있다.

 

728x90