본문 바로가기

프로그래밍언어/Java

[Java 중급] String 최적화

자바의 String 최적화


 

문자열 리터럴 최적화


 

컴파일 전

String helloWorld = "Hello, " + "World";

 

컴파일 후

String helloWorld = "Hello, world"

 

따라서 런타임에 별도의 문자열 결합 연산을 수행하지 않기 때문에 성능이 향상된다. 

 

String 변수 최적화


문자열 변수의 경우 그 안에 어떤 값이 들어있는지 컴파일 시점에 알 수 없기 떄문에 단순하게 합칠 수 없다. 

String result = str1 + str2;

 

다음과 같이 최적화를 수행한다. 

String result = new StringBuilder().append(str1).append(str2).toString()

 

위와 같이 간단한 경우는 자바가 최적화를 처리해주기 때문에 지금처럼 간단한 경우에는 StringBuilder를 사용하지 않아도 된다. 

 

 

String 변수 최적화가 어려운 경우


 


public class LoopStringMain {

    public static void main(String[] args) {
        long startTime = System.currentTimeMillis();
        String result = "";
        for(int i=0; i<100000; i++) {
            result += "Hello Java";
        }

        long endTime = System.currentTimeMillis();
        System.out.println("result : " +result);
        System.out.println("time : " + (endTime - startTime));

    }
}

 

실행결과

=> 반목문 루프 내부에서는 반복 횟수만큼 객체를 생성해야 한다. 

반복문 내에서의 문자열 연결은, 런타임에 연결할 문자열의 개수와 내용이 결정된다. 컴파일러는 얼마나 많은 반복이 일어날지 예측할수 없기 때문에 최적화가 어렵다. 

 

이번엔 StringBuilder를 생성해보자. 

public class LoopStringBuilderMain {

    public static void main(String[] args) {
        long startTime = System.currentTimeMillis();
        StringBuilder sb = new StringBuilder();

        for(int i=0; i<100000; i++) {
            sb.append("Hello Java");
        }

        long endTime = System.currentTimeMillis();
        System.out.println("result : " + sb.toString());
        System.out.println("time : " + (endTime - startTime));

    }
}

 

실행결과

 

String Builder를 직접 사용하는 것이 더 좋은 경우


  • 반복문에서 반복해서 문자를 연결할 때
  • 조건문을 통해 동적으로 문자열을 조합할 때
  • 복잡한 문자열의 특정 부분을 변경해야 할 때
  • 매우 긴 대용량 문자열을 다룰 때

 

* 인프런 '김영한의 실전 자바 - 중급 1편'을 참고하여 작성하였습니다.