[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를 사용하면 성능상의 이점을 볼 수 있다.
# 실제 성능 차이
위 그래프는 어떤 고수가 실제로 성능을 측정한 것이다. 왜 위와 같은 결과가 나오는 것일까?
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(화)
'TIL(Today I Learned)' 카테고리의 다른 글
[TIL] IntelliJ cannot resolve symbol 에러 해결 (0) | 2021.05.26 |
---|---|
[TIL] JUnit 5 계층 구조의 테스트 작성엔 @Nested (0) | 2021.05.21 |
[TIL] JUnit 5 사용자 정의 테스트 명명엔 @DisplayName (0) | 2021.05.21 |
[TIL] String 이어붙이기 (0) | 2021.05.14 |
[TIL] Spring boot - Location of application.yml (0) | 2021.05.14 |
블로그의 정보
배부른코딩로그
배부른코딩로그