[Java] 문자열 붙이기엔 StringBuilder를 사용

jhn1m·2024년 7월 11일

Java

목록 보기
5/5
post-thumbnail

알고리즘 문제풀이 중 , String에 문자를 추가해가는 문제에서 시간초과가 발생함.

String 은 "+" 연산을 이용하여 문자열을 계속 이어붙일 수 있다. 하지만 이렇게하면 String 객체가 계속 생성됨.

String str = "abc" + "def";

// "abc" "def" 객체가 생성되어 이어짐
// 루프내에서 사용하면 성능저하 심함

StringBuilder를 사용하면 내부의 객체를 수정하여 이어붙이므로. 효율이 좋다.

테스트코드.
StringTest는 loop가 백만번이 넘어가면 매우매우 느려진다..

private static void StringTest(int num) {
        System.out.println("#### StringTest() ####");
        System.out.println("input num >> " + num);

        long startTime = System.nanoTime();

        String a = "";

        for (int i = 0; i < 4000000; i++) {
            a += i;
        }

        long endTime = System.nanoTime();
        long duration = (endTime - startTime);
        double milliseconds = duration / 1_000_000.0;

        // 실행 시간 출력
        System.out.println(">>> " + duration + " ns");
        System.out.println(">>> " + milliseconds + " ms");

        System.out.println("#### END ####");
    }

    private static void StringBuilderTest(int num) {
        System.out.println("#### StringBuilderTest() ####");
        System.out.println("#### StringTest() ####");
        System.out.println("input num >> " + num);
        long startTime = System.nanoTime();

        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < num; i++) {
            sb.append(i);
        }

        long endTime = System.nanoTime();
        long duration = (endTime - startTime); // 나노초 단위
        double milliseconds = duration / 1_000_000.0; // 밀리초로 변환

        // 실행 시간 출력
        System.out.println(">>> " + duration + " ns");
        System.out.println(">>> " + milliseconds + " ms");
        System.out.println("#### End ####");
    }

10만번 실행 결과
약 1000배정도의 성능차이를 보여줌

100만번 실행 결과
약 25000배 (ㄷㄷ)

결론 : 문자열 많이붙일땐 StringBuilder 쓰자.!

0개의 댓글