230719 TIL #141 Scanner / Buffered reader

김춘복·2023년 7월 19일
0

TIL : Today I Learned

목록 보기
141/571

Today I Learned

노트북이 고장 나 어제 도착한 태블릿으로 작성 중.. 당분간 태블릿으로 til을 쓸 것 같다. 오타랑 띄어쓰기가 아주 형편없을 것 같긴 한데 당분간은 어쩔 수 없다..
오늘 TIL은 자바에서 입력할 때 쓰는 객체에 대해 알아보려 한다.
입출력에 대한 정리는 추후에 해보겠다.


참고 사이트 : langoustine

Scanner

입력받은 데이터를 다양한 타입으로 변환하여 반환하는 클래스

  • 기본형과 String 타입을 정규표현식을 사용해 파싱할 수 있다.

  • java.util.Scanner 의 경로로 import한다.

  • 버퍼의 크기가 1kb다.

  • thread unsafe라서 멀티쓰레드 환경에서 문제가 생길 수 있다.

  • 원하는 타입으로 읽을 수 있다.

  • 버퍼가 작아 데이터가 거의 즉시 사용자에게 전송되어 입력할 때 마다 많은 시간이 소요된다.

  • System.in을 통해 입력스트림을 받는다.

import java.util.Scanner;
...

Scanner sc = new Scanner(System.in);
String st = sc.nextLine();

BufferedReader

데이터를 한번에 읽어와 버퍼에 보관한 후 버퍼에서 데이터를 읽어오는 방식으로 동작하는 클래스

  • 버퍼(Buffer)
    데이터가 한 곳에서 다른 곳으로 전송되는 동안 큐 형태로 잠시 보관하는 임시 메모리 영역

  • java.io.BufferedReader 의 경로로 import한다.

  • IOException을 예외처리 해줘야한다. try-catch나 throws를 사용한다.

  • Scanner와 달리 String 타입만 읽어서 가져온다.

  • 버퍼의 크기가 8kb이다.

  • thread safe라서 멀티 쓰레드 환경에서도 안전하다.

  • 버퍼가 가득 차거나 개행문자가 나타나면 한번에 프로세스로 전달하기 때문에 Scanner보다 빠르다.

  • new BufferedReader(new InputStreamReader(System.in)) 처럼 문자기반의 보조 스트림인 inputStreamReader를 new로 만들고 그 안에서 System.in을 받아야 한다.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
// import java.io.*; 로 한번에 임포트해도 된다.

...
public static void main(String[] args) throws IOException {
  BufferReader br = new BufferedReader(new InputStreamReader(System.in));
  String st = br.readLine();
  int a = Integer.parseInt(br.readLine());
  int b = Integer.parseInt(st);
}

차이점

  1. 타입
    S가 B에 비해 타입에 자유롭다. B는 String 타입만 읽고 저장할 수 있어 필요시 형변환을 거쳐야 하지만, S는 원하는 타입으로 읽고 파싱할 수 있다.

  2. 속도 및 효율성
    B는 S에 비해 버퍼의 크기가 4배기 때문에 메모리는 조금 더 잡아먹어도 속도나 입력 효율이 좋다.
    문자 입력 하나하나마다 cpu가 입력하는 것 보다 버퍼에 쌓아두고 한번에 하는 것이 더 효율적이기 때문이다.
    특히 코딩테스트에서 속도 차이가 꽤 나기 때문에 B가 권장된다.

  3. 쓰레드 안정성
    B는 thread safe, S는 thread unsafe이다.

profile
Backend Dev / Data Engineer

1개의 댓글

comment-user-thumbnail
2023년 7월 19일

많은 도움이 되었습니다, 감사합니다.

답글 달기