JDK1.5 버전 이후부터 String의 + 연산 컴파일시 StringBuilder 로 자동변환되어 성능 최적화가 이뤄 진다고 배웠습니다.
하지만 항상 String은 항상 StringBuilder로 변환되지 않습니다.
공식 문서도 찾아봤지만,, 사실 명시해둔게 너무 어려워서 다른 블로그 정리 한 내용 참조 하였습니다.
해당 내용은 자바17로 직접 진행한것입니다.
예제 1번은 이렇게 자바에서도 했을때 최적화가 되는 방법입니다.
예제1) 한줄로 모두 선언한 경우
//컴파일 전 소스파일
String str1 = "0" + "1" + "2";
//컴파일 이 후, 디컴파일 한 소스파일
String str1 = "012";
한줄로 모두 선언한 경우는 하나의 String으로 변환 되었습니다. 결론적으로 성능최적화가 되었습니다. 따라서 이런 경우에 굳이 StringBuilder나 StringBuffer를 사용할 필요가 없습니다.
예제2) 여러줄로 선언한 경우
//컴파일 전 소스파일
String str2 = "";
str2 += 0;
str2 += 1;
str2 += 2;
//컴파일 이 후, 디컴파일 한 소스파일
String str2 = "";
str2 = (new StringBuilder()).append(str2).append("0").toString();
str2 = (new StringBuilder()).append(str2).append("1").toString();
str2 = (new StringBuilder()).append(str2).append("2").toString();
String 연산을 여러줄에 걸처 선언한 경우는 매 연산시마다 새로운 StringBuilder를 선언하고 있습니다. (StringBuilder를 사용하더라도) 매 연산시마다 새로운 객체를 생성하고 있으니 성능저하가 발생하게 됩니다. 따라서 이런 경우에는 StringBuilder 혹은 StringBuffer를 사용하여 성능최적화를 해야합니다.
예제3) 반복문 안에서 선언한 경우
//컴파일 전 소스파일
String str3 = "";
for (int i = 0; i < 3; i++) {
str3 += i;
}
//컴파일 이 후, 디컴파일 한 소스파일
String str3 = "";
for (int i = 0; i < 3; ++i) {
str3 = (new StringBuilder()).append(str3).append(i).toString();
}
반복문안에서 연산을 수행하는 경우도 반복수행시마다 새로운 StringBuilder를 생성하고 있으니 성능저하가 발생하게 됩니다. 따라서 이런 경우에는 StringBuilder 혹은 StringBuffer를 사용하여 성능최적화를 해야합니다.
예제4) String의 concat() 메서드를 사용하여 선언한 경우
//컴파일 전 소스파일
String str4 = ""
.concat("0")
.concat("1")
.concat("2");
//컴파일 이 후, 디컴파일 한 소스파일
String str4 = "".concat("0").concat("1").concat("2");
한줄로 선언하더라도 concat() 메서드를 사용한 경우는 StringBuilder로 변환되지 않습니다. 성능저하가 발생하게 됩니다. 따라서 이런 경우에는 StringBuilder 혹은 StringBuffer를 사용하여 성능최적화를 해야합니다.
'Java' 카테고리의 다른 글
| 자바_instanceof (객체타입 확인) (1) | 2024.10.30 |
|---|---|
| 초기화 블록 (0) | 2024.10.29 |
| UTF 인코딩 (0) | 2024.10.28 |
| 2진수와 16진수 +@ 10진수 (0) | 2024.10.18 |
| 정수 오버플로우 (0) | 2024.10.18 |