InputStream vs BufferedReader

윤경·2024년 8월 30일

InputStream(System.in)

  • 입력받은 데이터는 int형으로 저장되는데 이는 10진수의 UTF-16 값으로 저장됨
  • 바이트 단위 데이터 처리 즉, 1 byte만 읽음(이후 문자 무시)

InputStreamReader

  • 바이트 단위 데이터를 문자(char) 단위 데이터로 처리할 수 있도록 변환함(InputStream의 데이터를 문자로 변환하는 중개 역할)
  • char배열로 데이터를 받을 수 있음

Scanner가 느린 이유

: 정규식을 엄청 많이 검사하기 때문에 타입 변환 안정성이 뛰어나지만 느림

Scanner의 nextInt() 과정

  1. InputStream(바이트스트림)을 통해 입력 받음
  2. 문자로 온전하게 받기 위해 중개자 역할을 하는 InputStreamReader(문자스트림)을 통해 char 타입으로 데이터 처리
  3. 입력받은 문자는 입력 메소드(next(), nextInt() ..)의 타입에 맞게 정규식 검사
  4. 정규식 문자열을 Pattern.compile() 이라는 메소드를 통해 Pattern 타입으로 변환
  5. 반환된 Pattern 타입을 String으로 변환
  6. String은 입력 메소드의 타입에 맞게 변환(nextInt()-Integer.parseInt())

(System.in은 바이트스트림인 InputStream 타입이고 이 방법만으로는 문자를 온전하게 받기 힘드니
InputStreamReader로 감싸주면서 바이트 단위 데이터를 문자 단위로 처리할 수 있도록 함)

BufferedReader

  • 버퍼가 있는 스트림
  • 별다른 정규식을 검사하지 않음
    (Scanner보다 성능이 우수한 이유)

BufferedReader는 버퍼를 통해 입력받은 문자를 쌓아둔 뒤 한 번에 문자열처럼 보냄
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
=> byte 타입으로 읽어들이는 in을 char 타입으로 처리한 뒤 String으로 저장

코테같은 경우 Scanner를 쓸 이유가 없음
문제에서 조건에 맞는 입력만 주어지기 때문에 성능이 떨어지는 Scanner를 굳이 쓰지 않음
BufferedReader를 통해 문자열을 받은 뒤 Integer.parseInt() 같은 파싱 함수를 통해 타입 변환해주기

정말정말정말 잘 정리되어 있는 글 https://st-lab.tistory.com/41?category=830901

profile
개발 바보 이사 중

0개의 댓글