개인룸/도윤

Item63. 문자열 연결은 느리니 주의하라

UroJem 2023. 8. 21. 22:32

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

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

문자열은 불변이라서 두 문자열을 연결할 경우 양쪽의 내용을 모두 복사해야 하므로 성능 저하는 피할 수 없는 결과다.

 

String + 연산자를 사용하면 더할 문자열이 많아질수록 심각하게 느려질 수 있다.

성능을 포기하고 싶지 않다면 String 대신 StringBuilder를 사용하자.

 

자바 6 이후 문자열 연결 성능을 다방면으로 개선했지만, 이 두 메서드의 성능 차이는 여전히 크다.

statement 메서드의 수행 시간은 아이템 수의 제곱이 비례해 늘어나고 statement2는 선형으로 늘어나므로, 아이템이 늘어날수록 성능 격차도 점점 벌어질 것이다.

statement2에서 StringBuilder를 전체 결과를 담기에 충분한 크기로 초기화한 점을 잊지 말자.

하지만 기본값을 사용하더라도 여전히 5.5배나 빨랐다.

 

String + String의 연산이 느린 이유는 불변클래스인 String 객체의 원래 공간에다 추가하는 것이 아닌 새로운 new 생성자로 만들 String에다 더해져야 하기 때문이다.

Heap 메모리에 String 객체가 많아지면 GC가 String 객체도 지워야 하니 연산을 많이하게되면 느려진다.

JDK 5 이상부터 String 으로 + 연산자를 사용할 경우 컴파일 시 자동으로 StringBuilder로 변환해주었지만 for 문으로 반복 연산할 때는 자동으로 변환되지 않으므로 StringBuilder를 사용해야 한다.

StringBuilder를 내부적으로 사용한다고 해도 느린 이유와 8버전과 11버전의 차이

https://dkswnkk.tistory.com/584

 

[Java] 자바에서 '+' 연산을 통한 문자열 합치기를 지양하라

서론 자바에서 '+' 연산을 통한 문자열 합치기를 지양하라는 흥미로운 주제를 보게 되어 글을 작성하게 되었습니다. 그전에 먼저 String과 StringBuffer, 그리고 StringBuilder에 대한 사전 지식이 있으면

dkswnkk.tistory.com

https://sundries-in-myidea.tistory.com/139

 

Java String + 연산은 정말 빠른가?

검증 안된 것에 대해서 당당하게 말하기! ㅋㅋ; 스터디 도중에 페이스북에서 본 기억이 나서 공유했었던 의제이다. +가 StringBuilder보다 빠릅니다! 라고 당당하게 언급했었는데, 막상 스터디 팀원

sundries-in-myidea.tistory.com

 

핵심정리

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