JAVA - StringBuilder와 System.out.print의 속도차이

StringBuilder

  • StringBuilder은 문자열을 합치거나 변경할 때 사용하는 클래스다.
  • 내부적으로 char배열을 가지고 있으며 문자열을 추가하거나 변경하면서 크기가 자동으로 지정된다.
  • 문자열을 반복적으로 추가하거나 변경 할 때 성능상의 이점을 가져올 수 있다.

System.out.print

  • System.out.print은 화면상에 출력하는 기능을 제공하는 메서드
  • → 호출 할 때 마다 문자열을 매번 새로 생성하고 화면에 출력한다
  • → 이 과정에서 메모리 할당 및 해제 I/O작업들이 발생하여 성능 부담이 발생

결론적으로, StringBuilder 를 사용하여 문자열을 생성하고 마지막에 toString 메서드를 호출하여 문자열을 한 번에 출력하는 것이 System.out.print 를 반복적으로 호출하는 것보다 훨씬 효율적이다.

 

다음 문제를 확인해보면 그 이유를 더욱 명확하게 파악할 수 있다.

 

[BaekJoon] 15651. N과 M (3)

 

- 다음과 같은 순서로 설명을 진행하겠다.

1. 기존 코드(시간 초과)

import java.util.Scanner;

public class BOJ_15651_N과M {
    static int N;
    static int M;
//    static int cards[];
    static int result[];
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        N = sc.nextInt();
        M = sc.nextInt();
//        cards = new int[N];
        result = new int[M];
//        for (int i = 0; i < N ; i++) {
//            cards[i] = i+1;
//        }

        comb(0);


    }

    private static void comb(int cnt) {
        if(cnt == M){
            for (int i = 0; i < M; i++) {
                System.out.print(result[i] +" ");
            }
            System.out.println();
            return;
        }


        for (int i = 0; i <N; i++) {
            result[cnt] = i+1;
            comb(cnt +1 );
        }

    }
}

 

2.최종 수정 코드 (통과)

최종 수정 코드

  • StringBuilder은 문자열을 합치거나 변경할 때 사용하는 클래스다.
  • 내부적으로 char배열을 가지고 있으며 문자열을 추가하거나 변경하면서 크기가 자동으로 지정된다.
  • 문자열을 반복적으로 추가하거나 변경 할 때 성능상의 이점을 가져올 수 있다.

  • System.out.print은 화면상에 출력하는 기능을 제공하는 메서드
  • → 호출 할 때 마다 문자열을 매번 새로 생성하고 화면에 출력한다
  • → 이 과정에서 메모리 할당 및 해제 I/O작업들이 발생하여 성능 부담이 발생

결론적으로, StringBuilder 를 사용하여 문자열을 생성하고 마지막에 toString 메서드를 호출하여 문자열을 한 번에 출력하는 것이 System.out.print 를 반복적으로 호출하는 것보다 훨씬 효율적이다.

 

import java.util.Scanner;

public class BOJ_15651_N과M {
    static int N;
    static int M;
//    static int cards[];
static StringBuilder sb = new StringBuilder();
    static int result[];
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        N = sc.nextInt();
        M = sc.nextInt();
//        cards = new int[N];
        result = new int[M];
//        for (int i = 0; i < N ; i++) {
//            cards[i] = i+1;
//        }

        comb(0);
        System.out.println(sb);


    }

    private static void comb(int cnt) {
        if(cnt == M){
            for (int i = 0; i < M; i++) {
                sb.append(result[i] + " ");
            }
            sb.append("\n");
            return;
        }


        for (int i = 0; i <N; i++) {
            result[cnt] = i+1;
            comb(cnt +1 );
        }

    }
}

 

 

'CS' 카테고리의 다른 글

빌더 패턴(Builder Pattern)  (0) 2023.07.23
Java Optional이란?  (0) 2023.07.23
LinkedList와 ArrayList의 속도차이 및 용도  (0) 2023.07.13
FrameWork VS Library 차이점  (0) 2023.07.13