
백준 1단계 문제를 풀다가 문자열 입출력 과정에 있어서 메모리 사용량과 처리 속도를 좀 더 효율적으로 할 수 있는 방법에 대해 생각하는 시간을 가졌습니다. (팀장님 감사합니다!) 자바를 배울 때 기본적으로 Scanner를 배울 텐데 Scanner 말고도 BufferedReader와 StringTokenizer를 사용할 수 있습니다.
BufferedReader와 StringTokenizer를 사용하면 더 빠른 입력 처리가 가능하다고?
둘의 차이점은 무엇일까요?
ufferedReader는 입력 속도가 매우 빠르고, StringTokenizer는 문자열을 효율적으로 분리합니다.
BufferedReader
- BufferedReader는 한 번에 입력을 버퍼에 저장하고 처리하므로 Scanner보다 빠름
- InputStreamReader(System.in)과 함께 사용
- BufferedReader는 예외 처리가 필요하므로 throws IOException을 메서드에 추가해야 함
StringTokenizer
- 한 줄로 입력된 데이터를 공백 기준으로 나누기 위해 사용
- nextInt()와 같은 메서드 대신, StringTokenizer를 통해 데이터를 나눈 후 Long.parseLong()으로 변환함
왜 Scanner보다 더 빠를까?
Scanner는 입력을 한 번에 처리하지 않고, 메서드(nextInt, nextLong 등) 호출 시마다 입력 스트림을 읽습니다. 반면, BufferedReader는 한 번에 읽어와 메모리 사용과 처리가 효율적입니다. StringTokenizer는 문자열 분리 속도가 빠르고 메모리 효율적입니다.
정말 속도가 빨라졌는지 간단한 문제로 확인해봅시다. 아래 문제는 백준 1단계 문제 중 하나입니다. (#11382)
Scanner
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long A = sc.nextLong();
long B = sc.nextLong();
long C = sc.nextLong();
System.out.println(A + B + C);
}
}

BufferedReader
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] input = br.readLine().split(" ");
long A = Long.parseLong(input[0]);
long B = Long.parseLong(input[1]);
long C = Long.parseLong(input[2]);
System.out.println(A + B + C);
}
}

BufferedReader와 StringTokenizer 동시 사용
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// StringTokenizer로 입력 분리
StringTokenizer st = new StringTokenizer(br.readLine());
long A = Long.parseLong(st.nextToken());
long B = Long.parseLong(st.nextToken());
long C = Long.parseLong(st.nextToken());
System.out.println(A + B + C);
}
}

두 방법 모두 Scanner를 사용할 때보다 메모리를 덜 사용하고 속도가 빨라진 것을 확인할 수 있습니다.
'☁️ 구름 x 카카오 Deep Dive 풀스택 > Java' 카테고리의 다른 글
[Java] 회원 관리 시스템 구현하기 - 2탄 (1) | 2025.02.05 |
---|---|
[Java] 회원 관리 시스템 구현하기 - 1탄 (2) | 2025.02.04 |