Scanner은 Byte 그대로 읽어 오기
inputeStreamReader은 Byte를 글자로 바꿔서 한글자 읽어오기
BufferstreamReader은 inputeStreamReader 한글자 한글자 따로 차곡차곡 저장했다가 한번에 읽어오기
바이트스트림인 InputStream 을 통해 입력을 받으면 문자스트림인 InputStreamReader 을 통해 바이트 단위 데이터를 문자(character) 데이터로 처리할 수 있게 만들어준다는 것이다. 그리고 앞에서 보았듯이 Scanner 를 생성할 때 문자스트림으로 변환시켜 읽는다는 것을 알 수 있다.
즉, InputStreamReader 의 가장 큰 특징은 다음과 같다.
- 바이트 단위 데이터를 문자(character) 단위 데이터로 처리할 수 있도록 변환해준다.
- 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); |
그러면 우리는 두 가지 사실을 바로 알 수 있다.
- 기본적으로 바이트 스트림인 InputStream 을 통해 바이트 단위로 데이터를 입력을 받는구나!
- 입력 데이터를 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 |