기존에 알고 있었던 입출력 방식으로는 메모리 초과가 나서, 새로운 입출력 방식을 배우게 되었다.
Scanner 와 BufferReader 의 차이는 무엇인가?
먼저, BufferReader 란 버퍼를 사용하여 입력을 하는 객체이다.버퍼를 사용하지 않는 입력은, 키보드의 입력이 키를 누르는 즉시 바로 프로그램에 전달된다.
반면 버퍼를 사용하는 입력은, 키보드의 입력이 있을 때마다 한 문자씩 버퍼로 전송한다. 버퍼가 가득 차거나 혹은 개행 문자가 나타나면 버퍼의 내용을 한 번에 프로그램에 전달한다.
키보드로 데이터를 입력 받을때마다, 데이터 입출력, 그리고 하드디스크에 쓰기 작업에 모두 시간이 소요되기 때문에 데이터 량이 많을 경우 시간 소요가 크다. 그래서 반드시 buffer 를 거쳐서 작업을 하게 된다.
Scanner 입력 받기
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("문자열을 입력하세요: ");
String inputString = scanner.nextLine(); // 사용자로부터 한 줄의 문자열을 읽음
System.out.println("입력된 문자열: " + inputString);
System.out.println("정수를 입력하세요: ");
int inputInt = scanner.nextInt(); // 사용자로부터 정수를 읽음
System.out.println("입력된 정수: " + inputInt);
scanner.close(); // Scanner 객체를 닫음
}
}
그렇다면 우리가 가장 처음 배우는 입출력 객체인 Scanner 는 buffer를 사용하지 않는가?
그렇지 않다. 다만, buffer size 1024 로 작을 뿐이다.
다양한 method 를 제공해서, nextLine -> String , nextInt -> int 바로 전환이 되어 사용하기는 편리하지만, buffer size 가 작아서 데이터량이 많아질 경우, 속도가 나지 않는다.
BufferReader 입력 받기
import java.util.Objects;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.PrintWriter;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 선언
String s = br.readLine();
int i = Integer.parseInt(br.readLine());
}
br.close();
pw.flush();
pw.close();
}
- 입력 : readLine(); 으로 사용한다.
- 여러 type 으로 받을 수 있는 Scanner 와 다르게 String으로 리턴 값이 고정되어 있기 때문에, 다른 타입으로 입력을 받고자 한다면
반드시 형변환이 필요하다. Integer.parseInt
를 통해 String -> int 로 형변환을 해준다.
공백을 기준으로 데이터를 나누어 받기
readline()
은 개행을 기준으로 데이터를 나누어 받는다.
python에는 input().split() 이라는 함수가 있어서 입력 값을 공백 / 구분자를 기준으로 나누어 받을 수 있다.
Java 에는 이때 사용하는 것이 StringTokenizer나 String.split() 이다.
// StringTokenizer
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
StringTokenizer의 nextToken() 함수를 쓰면 readLine()을 통해 입력 받은 값을 공백 단위로 구분하여 순서대로 호출할 수 있다.
호출 할 값이 없는데 호출 할 경우 error 발생한다.
Python 의 input().split() 과 유사하다.
String.split()
// String.split() 함수
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
String[] strings = str.split(" ");
참고자료 : [Java] 빠른 입출력을 위한 BufferedReader, BufferedWriter, StringTokenizer, StringBuilder
댓글