티스토리 뷰
(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(); }
StringBuilder
을String
을char
배열 형태로 저장하기 때문에 훨씬 빠름- 즉,
append
시에 내부 배열 사이즈보다 클 경우에만 메모리 할당이 일어나게 됨 (배열 사이즈를 늘려야 하기 때문)
-
자바 6 이후 문자열 연결 성능을 다방면으로 개선했지만, 이 두 메서드의 성능 차이는 여전히 크다 .
- 필자가 품목을 100개로 하고
lineForItem
이 길이 80인 문자열을 반환하게 하여 실행해보니statement2
가 6.5배나 빨랐다고 함
- 필자가 품목을 100개로 하고
결론
-
성능에 신경 써야 한다면 많은 문자열을 연결할 때는 문자열 연결 연산자(+)를 피하자.
- 대신
StringBuilder
의append
메서드를 사용하라
- 대신
-
문자 배열을 사용하거나 문자열을 (연결하지 않고)하나씩 처리하는 방법도 있다.
끝으로
이 글이 도움이 되었다면, 하단의 Google 광고 👎👎👎 한번씩 클릭 부탁 드립니다. 🙏🙏🙏
광고 클릭은 많은 힘이 됩니다!
반응형
'프로그래밍 > EffectiveJava' 카테고리의 다른 글
(이펙티브 자바) 규칙25. 톱레벨 클래스는 한 파일에 하나만 담으라 (0) | 2020.03.15 |
---|---|
(이펙티브 자바) 규칙26. 로 타입은 사용하지 말라 (0) | 2020.03.13 |
(이펙티브 자바) 규칙64. 객체는 인터페이스를 사용해 참조하라 (0) | 2020.03.11 |
(이펙티브 자바) 규칙26-1. 제네릭 관련 용어 정리 (0) | 2020.03.10 |
(이펙티브 자바) 규칙 62. 다른 타입이 적절하다면 문자열 사용을 피하라 (0) | 2020.03.10 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- 이펙티브자바
- JavaFX 테이블뷰
- TableView
- 일본 여행
- JavaFX
- 자전거
- JavaFX Table View
- 자전거 여행
- 일본여행
- effective java
- JavaFX 종료
- JavaFX Window Close
- windows
- git
- 일본 자전거 여행
- 텐트
- java
- 일본 배낭여행
- 자바
- 배낭 여행
- 스프링부트
- springboot
- 이펙티브
- 인텔리제이
- intelij
- 배낭여행
- 방통대 과제물
- Java UI
- 이펙티브 자바
- effectivejava
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 | 31 |
글 보관함