Just Do IT!

[Java] Scanner와 BufferedReader 본문

개발 공부/Java

[Java] Scanner와 BufferedReader

MOON달 2024. 7. 11. 16:00
728x90
반응형

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 사용 예시

[백준 15552. 빠른 A+B ]

 

위의 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

 

728x90