[JAVA] Scanner와 BufferedReader

·2022년 11월 6일
0

Java

목록 보기
12/14
post-thumbnail

☝️ Java에는 외부(클라이언트)에게서 값을 입력받을 수 있는 대표적인 방법이 두가지가 있다. 첫번째는 Scanner, 두번째는 BufferedReader! Scanner 방식도 최근에서야 백준 알고리즘 문제를 풀면서 익숙해지고 있는 참이었는데 15552번 a문제가 BufferedReader 방식을 사용하라기에 어쩔 수 없이 학습해보려고 한다.

Scanner

Scaneer란?

: java.util 패키지 내에 포함된 클래스

Scanner의 특징

  1. 토큰 단위로 입력값의 경계로 인식하여 좀 더 쉽게 데이터를 입력 받을 수 있다.
  2. 데이터 타입이 입력 받는시점에서 결정되므로 별도의 형변환이 필요하지 않다.
  3. 각 토큰들은 Scanner 메서드에 하나씩 순서대로 입력된다.

💡 토큰(Token)
공백 문자(스페이스바, 엔터, 탭 등)으로 구분되는 요소
그러나 String값을 입력할 때에는 사용되는 메서드가 next()nextLine()의 따라서 입력값의 경계가 달라질 수 있다.

Scanner의 메서드

nextX()

주로 nextX()의 형태를 이루며 X의 자리에는 입력 받을 데이터의 타입을 적어준다.

💡String 타입의 데이터를 입력받는 메서드
String을 입력 받는 메서드는 nextString()이 아닌 next()nextLine()이다. 이 둘의 차이는 다음과 같다.
next() : 띄어쓰기를 입력할 경우, 띄어쓰기 뒷 부분은 다음 입력 메서드에 저장된다.
netxLine() : 띄어쓰기를 포함하는 한줄을 의미하며 Enter입력 시 종료된다.

hasNextX()

nextX()메서드와 마찬가지로 X의 자리에 데이터의 타입을 작성한다. 해당 메서드는 boolean값을 반환하며 Scanner를 통해 입력 받은 값(X와 같은 타입)이 있으면 true를 반환한다.

findInX(A)

A에 포함된 내용을 입력 받은 값에서 찾아 일치하는 패턴을 반환시켜준다. 일치하지 않으면 null이 반환된다.

Scanner 사용 예시

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
    
        Scanner s = new Scanner(System.in);
        
        long a = s.nextLong();
        int b = s.nextInt();
        String str = s.nextLine();
        String str2 = s.next();
    }
}

BufferedReader

BufferedReader란?

: InputStreamReader에 버퍼링 기능이 추가된 클래스

  • 입력 스트림에서 문자를 읽는 함수.
  • 문자나 배열, 라인들을 효율적으로 읽기 위해 문자들을 버퍼에 저장하고 읽는 방법을 취한다.
  • 버퍼의 사이즈는 사용자가 지정할 수 있으며, 지정하지 않으면 default사이즈가 적용된다.

☝️ InputStreamReader
문자열을 입력받았을 때, Character단위로 읽는다. -> 비효율적! 보완하고자 나온 것이 BufferedReader

BufferedReader를 사용하기 전에 알아야 할 용어

  • Buffer : 데이터를 전송할 때, 일시적으로 그 데이터를 보관하는 임시메모리 영역
    입출력 속도 향상을 위해 사용된다.
  • Buffer flush : 버퍼에 남아 있는 데이터를 출력시킨다.(버퍼를 비운다)
  • BufferedReader : 버퍼를 이용한 입력
  • BufferedWriter : 버퍼를 이용한 출력

BufferedReader의 특징

  1. 사용자가 요청할 때마다 데이터를 읽어 오는 것이 아닌 일정한 크기의 데이터를 한번에 읽어와 Buffer에 보관한 후, 사용자의 요청이 있을 때 버퍼에서 데이터를 읽어오는 방식
  2. 속도가 향상되고 시간 부하가 적다는 장점을 가진다.
  3. 라인 단위로 입력값의 경계를 인식하기 때문에 공백의 경우에도 String으로 인식한다.
  4. 입력받은 데이터 타입이 String타입이므로 다른 데이터 타입으로 사용할 경우 형변환이 필요하다.

BufferedReader의 사용

readLine()

  • 데이터 라인 단위로 읽기 가능
  • Enter만으로 경계를 인식한다.
 try {
              BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

              // String
              String s = br.readLine();

              // int
              int num = Integer.parseInt(br.readLine());

              // 공백 구분 방법 1
              StringTokenizer st = new StringTokenizer(s); // StringTokenizer 인자 값에 입력 문자열이 들어감
              int a = Integer.parseInt(st.nextToken()); // 첫번째 호출
              int b = Integer.parseInt(st.nextToken()); // 두번째 호출

              // 공백 구분 방법 2
              String array [] = s.split(" "); // 공백마다 데이터 끊어서 배열에 넣음

              br.close(); // 입출력이 끝난 후 닫기
          } catch (IOException e) { // 예외처리 필수
              e.printStackTrace();
              System.out.println(e.getMessage());
          }

BufferedWriter의 사용

  • buffer에 저장되어 있던 데이터가 한번에 출력된다.
  • 버퍼를 정의해줬기 때문에 반드시 flush()close()를 호출해 종료해줘야 한다.
  BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); //선언
  String s = "abcdefg"; //출력할 문자열
  bw.write(s); //출력
  bw.newLine(); //줄바꿈
  bw.flush(); //남아있는 데이터를 모두 출력시킴
  bw.close(); //스트림을 닫음

Buffered의 메서드

메서드설명
BufferedReader(Reader rd)rd에 연결되는 문자입력 버퍼스트림 생성
BufferedWriter(Writer wt)wt에 연결되는 문자 출력 버퍼스트림 생성
int read()스트림으로부터 한 문자를 읽어서 int 형으로 리턴
int read(char[] buf)문자 배열 buf의 크기만큼 문자를 읽어들임. 읽어들인 문자 수를 리턴
int read(char[] buf, int offset, int length)buf 의 offset 위치에서부터 length 길이 만큼 문자를 스트림으로부터 읽어들임
String readLine()스트림으로부터 한 줄을 읽어 문자열로 리턴
void mark()현재 위치를 마킹, 차후 reset() 을 이용하여 마킹위치부터 시작함
void reset()마킹이 있으면 그 위치에서부터 다시 시작, 그렇지 않으면 처음부터 다시 시작
long skip(int n)n 개의 문자를 건너 뜀
void close()스트림 닫음
void write(int c)int 형으로 문자 데이터를 출력문자 스트림으로 출력
void write(String s, int offset, int length)문자열 s를 offset위치부터 length 길이 만큼을 출력스트림으로 출력
void write(char[] buf, int offset, int length)문자배열 buf의 offset 위치부터 length 길이 만큼을 출력스트림으로 출력
void newLine()줄바꿈 문자열 출력
void flush()남아 있는 데이터를 모두 출력시킴

Scanner와 BufferedReader의 차이

  • 둘의 대표적인 차이는 속도이다. 적은 양의 데이터라면 둘의 성능 차이는 크게 체감할 수 없지만, 많은 양의 데이터를 받았을 때는 BufferedReader가 확연하게 높은 성능을 보여준다.
  • 그 이유는 Scanner의 버퍼 사이즈(약 1kb)는 매우 작아 입력과 동시에 전달이 되는 반면에 BufferedReader의 버퍼 사이즈(약 8kb)는 Scanner의 비해 큰 용량을 가져 입력 받은 값들을 저장해두었다가 한번에 전송하기 때문이다.
  • Scanner는 입력을 읽는 과정에서 내부의 많은 과정들을 거쳐 더욱 속도가 느리다.
profile
🧑‍💻백엔드 개발자, 조금씩 꾸준하게

0개의 댓글