티스토리 뷰
문자열 연결 연산자(+)는 여러 문자열을 하나로 합쳐주는 편리한 수단입니다.
그런데 한 줄짜리 출력값 혹은 작고 크기가 고정된 객체의 문자열 표현을 만들때라면 괜찮지만, 본격적으로 사용하기 시작하면 성능 저하를 감내하기 어렵습니다.
문자열 연결 연산자로 문자열 n개를 잇는 시간은 n의 2승에 비례합니다.
문자열은 불변(아이템 17)이라서 두 문자열을 연결할 경우 양쪽의 내용을 모두 복사해야 하므로 성능 저하는 피할 수 없는 결과로 작용합니다.
예를 들어 다음 메서드는 청구서의 품목(item)을 전부 하나의 문자열로 연결해줍니다.
public String statement() {
String result = "";
for( int i = 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();
}
자바 6 이후 문자열 연결 성능을 다방면으로 개선했지만, 이 두 메서드의 성능 차이는 여전히 큽니다.
품목을 100개로 하고 lineForItem이 길이 80인 문자열을 반환하게 하여 실험한 결과 6.5배 빨랐다고 합니다.
정리
- 원칙은 간단하다.
- 성능에 신경써야 한다면 많은 문자열을 연결할 때는 문자열 연결 연산자(+)를 피하자.
- 대신 StringBuilder의 append 메서드를 사용하라.
- 문자 배열을 사용하거나, 문자열을 (연결하지 않고) 하나씩 처리하는 방법도 있다.
'JAVA > 이펙티브 자바' 카테고리의 다른 글
아이템[65]. 리플렉션보다는 인터페이스를 사용하라 (0) | 2022.05.14 |
---|---|
아이템[64]. 객체는 인터페이스를 사용해 참조하라 (0) | 2022.05.14 |
아이템[62]. 다른 타입이 적절하다면 문자열 사용을 피하라 (0) | 2022.05.14 |
아이템[61]. 박싱된 기본 타입보다는 기본 타입을 사용하라 (0) | 2022.05.14 |
아이템[60]. 정확한 답이 필요하다면 float와 double은 피하라 (2) | 2022.05.08 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 알고리즘
- 디자인패턴
- 이팩티브 자바
- 디자인 패턴
- Kotlin
- 클린 아키텍처
- Olympiad
- C++
- programmers
- 백준
- 프로그래머스
- 객체지향
- node.js
- 테라폼
- kotest
- 정규표현식
- Spring Boot
- JPA
- AWS
- Java
- kkoon9
- BOJ
- Algorithm
- MSA
- Effective Java
- Spring
- BAEKJOON
- 클린 코드
- 코테
- 이펙티브 자바
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
글 보관함