Study

String 을 잘 써보자

Hyunec 2021. 10. 16. 15:08

String 은 Java에서 가장 오래되고 많이 다루는 자료형 중 하나입니다.

그만큼 다루는 방법도 여러 가지인데요. 실무를 하면서 헷갈리기 Best Practice를 기록해 봅니다.

단 String의 반복 연산은 일반적이지 않기에 다른 개선에 비해 드라마틱하지 않습니다.

그리고 실무에서는 팀 컨벤션으로서의 코드 일관성이 우선이기에 무조건적인 적용은 권장하지 않습니다.

각 항목별 제목으로 Best Practice가 기록되어 있습니다.
그래프의 수치는 높을수록 좋은 성능을 의미합니다.

 

1. String 은 Immutable 합니다.

워낙에 많은 블로그에 잘 소개되어 있기에 이어질 내용의 배경으로서 기록은 하지만 내용은 생략합니다.

String과 Mutable, Immutable에 대해서 헷갈린다면 검색해보시길 권장합니다.

 

2. 숫자 자료형의 String 변환은 '+' 연산자를 사용합니다.

간혹 올드하거나 C++에 익숙한 개발자는 String.format()을 즐겨 쓰는데 그게 나예요.

String.format()가 제일 낮은 성능을 가지고 있고, 그 외에는 비슷한 성능을 가지고 있는 것을 볼 수 있습니다.

하지만 코드의 간결성을 위해 '+' 연산자를 사용을 권장합니다.

 

How to convert int to String in Java – the fastest way

What is the fastest way to convert an int into a string in Java? We compare four methods using benchmark tests, running on Java 7 to 14.

www.happycoders.eu

 

3. String 결합은 '+' 연산자를 사용합니다.

String 결합은 흔하게 반복적인 작업으로 보통 4가지 방법을 사용합니다.

  • + 연산자
  • String.format()
  • StringBuilber, StringBuffer
  • 드물게 Stream & String.join()

 

각각의 성능을 비교해봅니다.

두 개의 문자열
10개의 개별 문자열을 연결할 때의 성능

전반적으로 StringBuilder의 성능이 높지만, 그 차이가 적고 코드의 간결성을 고려할 때 '+' 연산자 사용을 권장합니다.

 

100개의 문자열 

예외적으로 대량의 문자열을 결합하는 경우는 '+' 연산자의 성능이 현저히 줄어듬으로 StringBuilder를 권장합니다.

그리고 대량의 문자열을 결합하는 대부분의 경우는 Stream을 사용할 것임으로 Stream 사용을 권장합니다.

 

간혹 올드하거나 C++에 익숙한 개발자는 String.format()을 즐겨 쓰거나 String 은 Immutable 함으로 '+' 연산자가 느리다고 말할 수 있습니다. 이것도 나

 

과거에는 맞았지만 최신의 개발을 하고 있다면 다릅니다.

'+' 연산자는 컴파일 시점에 Java 컴파일러에 따라 최적화됩니다.

Java 1.5는 StringBuilder로 최적화되며, Java 9는 아예 바이트 코드 단위의 최적화가 이루어집니다.

요즘의 개발 환경은 대부분 Java 8 이상임으로 '+' 연산자의 사용을 권장합니다.

 

더 자세한 변천사는 Java 버전별로 'The Java Language Specification'의 'String Concatenation Operator +'를 찾아볼 수 있습니다.

 

Java Compiler Optimization for String Concatenation

String concatenation was a costly affair in the early Sun Java versions(till JDK1.4 to be precise). Even though later JDK’s brought the…

medium.com

 

4. 문자열 분리는 split()을 사용합니다.

문자열 분리는 보통 2가지 방법을 사용합니다.

  • StringTokenizer
  • split

 

StringTokenizer는 legacy 클래스입니다.

legacy는 더 이상 사용할 수 없는 deprecated와는 다르게 사용은 할 수 있지만, 권장되지 않습니다.

StringTokenizer is a legacy class that is retained for compatibility reasons although its use is discouraged in new code. It is recommended that anyone seeking this functionality use the split method of String or the java.util.regex package instead.

- StringTokenizer javadoc

 

StringTokenizer는 정규식을 사용할 수 없습니다.

StringTokenizer 가 성능이 조금 더 좋지만 Legacy 된 이유라고 생각합니다.
반면 split은 Java 버전이 올라갈수록 개선되고 있으며, 정규식을 미리 컴파일하는 방법으로도 보완할 수 있습니다.

따라서 극도의 성능이 필요한 예외적인 경우가 아니라면 split 사용을 권장합니다.

 

참고 자료

 

String Performance Hints | Baeldung

Learn about the performance aspects of the Java String API

www.baeldung.com

 

'Study' 카테고리의 다른 글

마이크로 서비스도 리소스 동기화가 필요할까?  (2) 2022.03.04
'수십억건에서 QUERYDSL 사용하기' 를 보고..  (2) 2021.12.19
@Component vs @Configuration  (0) 2021.09.25
mongoDB tutorials  (0) 2021.05.18
API Versioning 전략  (0) 2021.04.14