Just Do IT!
[Java] Scanner와 BufferedReader 본문
Java에서 값을 입력받을 수 있는 방법이 두 가지가 있다.
Scanner와 BufferedReader인데, 백준에서 문제를 풀다가 빠른 A+B라는 문제에서 BufferedReader를 쓰라고 해서
겸사겸사 정리도 할 겸 블로그에 적어본다.
Scanner
java.util 패키지 내에 포함된 클래스
Scanner의 특징
- 토큰 단위로 입력값의 경계로 인식하여 데이터를 좀 더 쉽게 입력받을 수 있다.
- 토큰(token) : 공백 문자로 구분되는 요소
- String 값을 입력할 때는 next()와 nextLine()에 따라 입력값의 경계가 달라질 수 있다.
- 각 토큰들은 Scanner 메서드에 하나씩 순서대로 입력된다.
- 데이터 타입이 입력 받는 시점에서 결정되므로 별도의 형변환이 필요하지 않다.
- 원하는 타입으로 읽을 수 있다.
- UnChecked(Runtime) Exception으로 별도로 예외 처리를 명시할 필요가 없다.
- 데이터를 입력받을 경우 즉시 사용자에게 전송되며 입력받을 때마다 전송되어야 하기 때문에 많은 시간이 소요된다.
Scanner 예시
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int A = in.nextInt();
int B = in.nextInt();
System.out.println(A+B);
in.close();
}
}
A와 B를 입력받아 A+B 값을 출력하는 아주 간단한 예제이다.
필요한 java.util 패키지에서 import 해줘야 하고 사용하고 난 뒤에 close를 해주어야 한다.
참고:
https://daydream-sy.tistory.com/316
[Java warning] resource leak: 'sc' is never closed 해결방법
자바 실습을 하던 중에, warning이 떴다. 이런 warning이었는데 해결하지 안하도 잘 돌아가긴 하지만,뭔가 찝찝해서 구글링해서 찾아보고 해결했다. new Scanner 를 System.in을 해주었기 때문에 반드시
daydream-sy.tistory.com
BufferedReader
InputStreamReader에 버퍼링 기능이 추가된 클래스
InputStreamReader : 문자열을 입력받았을 때 character 단위로 읽어 비효율적이기 때문에 보완하고자 나온 것
입력 스트림에서 문자를 읽는 함수
문자나 배열, 라인들을 효율적으로 읽기 위해 문자들을 버퍼에 저장하고 읽는 방법을 취한다.
버퍼의 사이즈는 사용자가 지정할 수 있으며, 지정하지 않으면 default 사이즈가 적용된다.
관련 용어
- Buffer : 데이터를 전송할 때 일시적으로 그 데이터를 보관하는 임시 메모리 영역 (입출력 속도 향상을 위해 사용된다)
- Buffer flush : 버퍼에 남아 있는 데이터를 출력시킨다 (버퍼를 비운다)
- BufferedReader : 버퍼를 이용한 입력
- BufferedWriter : 버퍼를 이용한 출력
BufferedReader의 특징
- 사용자가 요청할 때마다 데이터를 읽어 오는 것이 아닌 일정한 크기의 데이터를 한번에 읽어와 Buffer에 보관한 후, 사용자의 요청이 있을 때 버퍼에서 데이터를 읽어오는 방식이다.
- 속도가 향상되고 시간 부하가 적다는 장점을 가진다.
- 라인 단위로 입력값의 경계를 인식하기 때문에 공백의 경우에도 String으로 인식한다.
- 입력받은 데이터 타입이 String이기 때문에 다른 데이터 타입으로 사용할 경우 형변환이 필요하다
- Checked Exception으로 반드시 예외 처리를 명시해야한다.(I/O Exception을 throw하거나 try/catch 해야한다.)
- Thread safe 성질을 지니기에 멀티스레드 환경에서도 안전하다.
- 버퍼가 가득차거나 개행문자가 나타나면 버퍼의 내용을 한번에 프로그램으로 전달하기에 Scanner보다 소요되는 시간을 절약할 수 있다.
BufferedReader 사용 예시
위의 Scanner 예시처럼 A와 B를 입력받아 A+B를 출력하는 예시이다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
// 테스트케이스의 개수
int T = Integer.parseInt(br.readLine());
for (int i = 0; i < T; i++) {
// A와 B를 입력
StringTokenizer st = new StringTokenizer(br.readLine());
int A = Integer.parseInt(st.nextToken());
int B = Integer.parseInt(st.nextToken());
// A와 B를 더한 결과를 출력
int sum = A + B;
bw.write(Integer.toString(sum));
bw.newLine();
}
// BufferedWriter를 플러시
bw.flush();
bw.close();
// BufferedReader를 닫기
br.close();
}
}
Scanner와 BufferedReader 비교
보통 BufferedReader가 scanner보다 실행 속도가 빠르다고 한다.
BufferedReader의 베퍼 메모리가 8KB로 Scanner의 버퍼 메모리 1KB보다 크기에 많은 입력이 있는 경우에는 더 효율적이라는 것이다. 그렇지만 큰 메모리를 잡아 먹는다는 단점이 있다.
그래서 알고리즘 문제를 풀거나 코드를 작성할 때,
많은 입력이 있는 경우에는 BufferedReader를 쓰는 것이 좋아보이지만
작은 입출력인 경우에는 그냥 Scanner를 사용해도 상관 없을 것 같다.
참고 블로그
https://velog.io/@langoustine/Scanner-VS-BufferedReader
Scanner vs BufferedReader
Java로 알고리즘 공부를 하고 있는데, 사용자 입출력을 구현할 경우 다양한 입력과 출력 클래스들을 사용할 수 있다. 대표적으로 입력에는 Scanner 클래스, 출력은 sout를 대중적으로 많이 사용하는
velog.io
https://velog.io/@hiy7030/JAVA-Scanner%EC%99%80-BufferedReader
[JAVA] Scanner와 BufferedReader
☝️ Java에는 외부(클라이언트)에게서 값을 입력받을 수 있는 대표적인 방법이 두가지가 있다. 첫번째는 Scanner, 두번째는 BufferedReader! Scanner 방식도 최근에서야 백준 알고리즘 문제를 풀면서 익
velog.io
'개발 공부 > Java' 카테고리의 다른 글
[Java] String을 int로, int를 String으로 변환하기 (0) | 2024.11.21 |
---|---|
[Java] TreeSet에서 custom 객체를 생성 후 ClassCastException 오류 (0) | 2024.07.24 |
[Java] StringBuilder 사용하기 (0) | 2024.07.19 |
[Java] StringTokenizer와 Split() 메서드 (0) | 2024.07.19 |
[Java warning] resource leak: 'sc' is never closed 해결방법 (1) | 2024.07.08 |