- 입력받은 데이터는 int형으로 저장되는데 이는 10진수의 UTF-16 값으로 저장됨
- 바이트 단위 데이터 처리 즉, 1 byte만 읽음(이후 문자 무시)
- 바이트 단위 데이터를 문자(char) 단위 데이터로 처리할 수 있도록 변환함(InputStream의 데이터를 문자로 변환하는 중개 역할)
- char배열로 데이터를 받을 수 있음
Scanner가 느린 이유
: 정규식을 엄청 많이 검사하기 때문에 타입 변환 안정성이 뛰어나지만 느림
Scanner의 nextInt() 과정
- InputStream(바이트스트림)을 통해 입력 받음
- 문자로 온전하게 받기 위해 중개자 역할을 하는 InputStreamReader(문자스트림)을 통해 char 타입으로 데이터 처리
- 입력받은 문자는 입력 메소드(next(), nextInt() ..)의 타입에 맞게 정규식 검사
- 정규식 문자열을 Pattern.compile() 이라는 메소드를 통해 Pattern 타입으로 변환
- 반환된 Pattern 타입을 String으로 변환
- 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