Java

스트링 빌더와 스트링 연산 최적화

오개발 2024. 10. 29. 15:43

 

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