JAVA-입력뜯어보기[Scanner,InputStream,BufferedReader]

Muhly·2023년 3월 19일
0

baekjoon

목록 보기
2/8

안녕하세요🤗10기ssafy를 목표로 열심히 달리고 있는 Muhly라고 합니다.저의 벨로그는 저의 창작물도 있겠지만 다른 유명한 강사님들과 블로거분들의 글들이 많이 포함하고 있습니다.이 벨로그는 저의 스터디 노트와 일상 기록용입니다.같이 공부하실 분 있으시면 연락 부탁드려요

✏️Stream이란?

“출발지와 도착지를 이어주는 빨대”

이 그림에서 보듯이 한 곳에서 다른곳으로의 데이터 흐름을 스트림이라고 한다.

그리고 스트림은 단방향이기 때분에 입력과 출력이 동시에 발생할 수 없다. 그렇기 때문에 용도에 따라 입력스트림, 출력스트림이 나뉜다.

또 다른 비유를 하자면 고속도로라고 보면된다.고속도로에서 역주행을 할 수 없듯 스트림은 단방향으로만 흐르며 고속도로에서는 중앙분리대 혹은 도로 자체가 분리되어 상향행 하향행이 존재하듯 입력스트림과 출력스트림 또한 분리되었다고 보면 된다.

그리고 자바에서 가장 기본이 되는 입력 스트림은 InputStream이다.

(반대로 출력스트림은 OutputStream이다.)

그렇다면 System.in과 InputStrem의 관걔는 뭘까?

이에 대한 대답은 System.in이 InputStream타입의 필드라는 것이다.

“"표준" 입력 스트림입니다. 이 스트림은 이미 열려 있고 입력 데이터를 제공할 준비가 되어 있습니다. 일반적으로 이 스트림은 키보드 입력 또는 호스트 환경 또는 사용자가 지정한 다른 입력 소스에 해당합니다.”

정리하자면 in이라는 변수는 InputStream의 변수로 결국 InputStream 타입의 새 변수를 선언하고 그 변수에 System.in을 할당시킬 수도 있다는뜻이다. 이렇기 때문에 System.in과 InputSteam을 같이 묶어서 설명하게 되는것이다.


✏️Scanner(system.in)그리고 InputStreamReader(System.in)

//생략…stranger’s lab님의 블로그를 참조하세요


✏️BufferedReader그리고 InputStreamReader(System.in)

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

BufferedReader도 비슷한 원리

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

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

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

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

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

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

근데 BufferedReader는 왜 필요해?

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

Scanner에서 InputStreamReader을 사용할때 ‘문자’를 처리한다.(그래서 Scanner에서도 내부에서 임시 배열을 두어 문자열 처럼 사용하고 있었다.)

InputStreamReader로 chartype으로 처리할 수 있는 장점은 개선되었는데… 우리가 만약 문자열을 입력하고 싶다면 매변 배열을 선언해야 한다는 단점은 그대로 남아있습니다. 심지어 입력받을 문자열의길이가 가변적이라면 더욱 불편하죠.

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

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

Byte Type = InputStream

Char Type = InputStreamReader

Char Type 의 직렬화 = BufferedReader

점점 업그레이드

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

System.in = InputStream →InputStreamReader→BufferedReader

byte타입으로 읽어드리는 in을 char타입으로 처리한뒤String, 즉 문자열로 자정할 수 있게 한다는 의미로 해석할 수 있다.

그렇기 때문에 BufferedReader을 쓸때 위와 같이 코드가 길어지게 되는것이다.

BufferedReader 의 특징은 크게 두 가지가 있다.

  1. 버퍼가 있는 스트림이다.
  2. 별다른 정규식을 검사하지 않는다.→정규식 검사를 안해서 빠름

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

profile
https://muhlysstudynote.tistory.com/-> 블로그 이전하였습니다

0개의 댓글