📟java/백준

Scanner 와 inputstreamReader, BufferedReader 분석(정리용)

하얀성 2022. 10. 21. 14:51

Scanner은 Byte 그대로 읽어 오기

inputeStreamReader은 Byte를 글자로 바꿔서 한글자 읽어오기

BufferstreamReader은 inputeStreamReader 한글자 한글자 따로 차곡차곡 저장했다가 한번에 읽어오기

 

바이트스트림인 InputStream 을 통해 입력을 받으면 문자스트림인 InputStreamReader 을 통해 바이트 단위 데이터를 문자(character) 데이터로 처리할 수 있게 만들어준다는 것이다. 그리고 앞에서 보았듯이 Scanner 를 생성할 때 문자스트림으로 변환시켜 읽는다는 것을 알 수 있다.

 

즉, InputStreamReader 의 가장 큰 특징은 다음과 같다.

  1. 바이트 단위 데이터를 문자(character) 단위 데이터로 처리할 수 있도록 변환해준다.
  2. char 배열로 데이터를 받을 수 있다.

 

 

 

 

 

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

 

BufferedReader 도 비슷한 원리다.

 

BufferedReader 객체를 생성, 선언을 할 때 보통 우리는 다음과 같이 쓴다.

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

 

위 코드를 풀어쓰면 다음과 같을 것이다.

 
InputStream inputstream = System.in;
 
InputStreamReader sr = new InputStreamReader(inputstream);
 
BufferedReader br = new BufferedReader(sr);

 

그러면 우리는 두 가지 사실을 바로 알 수 있다.

  1. 기본적으로 바이트 스트림인 InputStream 을 통해 바이트 단위로 데이터를 입력을 받는구나!
  2. 입력 데이터를 char 형태로 처리하기 위해 중개자 역할인 문자스트림 InputStreamReader 로 감싸주는구나!

 

 

근데 BufferedReader 는 왜 필요해??

이 질문에 대한 답이 필요하다.

 

앞서 Scanner 에서 InputStreamReader 을 설명할 때 '문자'를 처리한다고 했다. '문자열'이 아니다.

(그래서 Scanner 에서도 내부에서 임시 배열을 두어 문자열처럼 사용하고 있다.)

InputStreamReader 로 char type 으로 처리할 수 있는 장점은 개선되었는데...

 

우리가 만약 문자열을 입력하고 싶다면 매번 배열을 선언해야 한다는 단점은 그대로 남아있다. 심지어 입력받을 문자열의 길이가 가변적이라면 더욱 불편하다.

 

그래서 쓰는 것이 Buffer(버퍼)를 통해 입력받은 문자를 쌓아둔 뒤 한 번에 문자열처럼 보내버리는 것이다.

 

BufferedReader 를 쓸 때 우리는 입력 메소드로 readLine() 을 많이 쓴다. 이 메소드는 한 줄 전체를(공백 포함) 읽기 때문에 char 배열을 하나하나 생성할 필요 없이 String 으로 리턴하여 바로 받을 수 있다는 장점이 있다.

 

 

Byte Type = InputStream

Char Type = InputStreamReader

Char Type 의 직렬화 = BufferedReader

(String 도 따지고 보면 char의 배열 형태이니.. 직렬화라는 말이 어렵다면 String이라고 봐도 큰 문제는 없을 것 같다.)

 

출처 : https://st-lab.tistory.com/30 

 

[백준] 15552번 : 빠른 A+B - JAVA [자바]

https://www.acmicpc.net/problem/15552 15552번: 빠른 A+B 첫 줄에 테스트케이스의 개수 T가 주어진다. T는 최대 1,000,000이다. 다음 T줄에는 각각 두 정수 A와 B가 주어진다. A와 B는 1 이상, 1,000 이하이다...

st-lab.tistory.com

 

'📟java > 백준' 카테고리의 다른 글

백준 10952 java  (0) 2022.10.23
백준 2439 별 찍기 java  (0) 2022.10.23
변수 선언 후 쓸려고 하기 전에 초기화 하자.  (0) 2022.10.21
print, printf, println 구분하기  (0) 2022.10.21
백준 2480(주사위 세개) 자바  (0) 2022.10.21