Daily Notebook

[TIL] Java String, StringBuffer, StringBuilder 뽀개기

by 배부른코딩로그

이론 상으로 문자열을 합칠 때, StringBuilder/StringBuffer.append > String + String > String.format 순으로 성능 차이가 난다고 공부한 적 있다. 요즘 같이 서버가 좋은 시대에 큰 차이가 있을까 싶기도 했고, 조금 더 자세히 알고 싶어서 이것 저것 찾아봤다.

 

# 문자열을 합치는 방법

String s1 = "안";
String s2 = "녕";
String s3 = "!";

위와 같이 세 개의 문자열이 있다고 하자. 여러가지 방법으로 하나의 문자열로 합쳐보자!

 

1. String.format

System.out.println(String.format("%s%s%s", s1, s2, s3)); // 안녕!

2. String.concat

System.out.println(s1.concat(s2).concat(s3)); // 안녕!

3. String + String

System.out.println(s1 + s2 + s3); // 안녕!

4. StringBuilder / StringBuffer

StringBuilder sb = new StringBuilder();
sb.append(s1)
 .append(s2)
 .append(s3);
System.out.println(sb.toString()); // 안녕!

StringBuilder / StringBuffer는 사용법이 동일하다. 그럼 둘은 언제 어디서 올바르게 사용할 수 있을까?

StringBuffer는 공통 메소드가 동기화된다고 한다. 즉, 멀티 쓰레드 환경에서 문자열을 안전하게 합칠 수 있다는 것이다. 이외의 모든 측면에서 StringBuilder를 사용하면 성능상의 이점을 볼 수 있다.

 

# 실제 성능 차이

[출처] javapapers.com

위 그래프는 어떤 고수가 실제로 성능을 측정한 것이다. 왜 위와 같은 결과가 나오는 것일까?

String은 소위 불변(immutable)한 객체라고 한다. 이 말인 즉슨, String 객체끼리 (+)더하는 행위를 할 때마다 메모리 할당과 메모리 해제가 발생되며 더 빈번하고 더 긴 문자열을 합칠 경우, 속도가 급격하게 떨어지게 되는 것이다.

 

String.concat은 사용은 지양해야하고, 로직이 비교적 간단한 부분에는 더하기 연산자를 통해서 하는 것도 나쁘지 않은 것 같다. 다만, StringBuilder.append를 사용하는 것이 성능상 가장 좋다는 것을 알아두자!

 

 

빈빈허게 긴 문자열들을 계속 더해야 할 경우, StringBuilder가 가장 효과적이다!

 

 

그럼 자주 사용되는 StringBuilder의 Helper Methods를 간단하게 살펴보자!

No. Constructor/Method Details
1 StringBuilder() 생성자(초기화)
2 append($1) $1 문자열 추가
3 insert($1, $2) $1 인덱스에 $2 문자열 삽입
4 delete($1, $2) $1~$2까지 문자열 삭제
5 indexOf($1) $1값이 있다면 시작 인덱스 반환
6 substring($1, $1) $1~$2까지 문자열 잘름
7 length() 문자열 길이 확인
8 replace($1, $2, $3) $1~$2까지 문자열 변경
9 reverse() 글자 순서 반대로

[공식문서] https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/StringBuilder.html

 

 

StringBuilder를 초기화하는 가장 빠른 방법은 setLength(0); 를 사용하는 것이다.


new StringBuilder();를 사용하거나 delete(); 메서드를 사용할 수 있다. 하지만, new StringBuilder();는 객체를 또 생성해야하고, delete(); 역시 지우는 작업이 수행되기 때문에 비교적 시간이 더 소요된다.

 

 

- 이와 참고자료 -

댓글 참고!!!

 

 

 

Last updated. 2021.05.18(화)

 

반응형

블로그의 정보

배부른코딩로그

배부른코딩로그

활동하기