착각
BufferedReader를 Scanner와 종류가 다른 것이라고 생각하다보니, 나도 모르게 read()와 readLine()도 nextInt()와 nextLine()에 각각 대입해서 같은 역할이라고 착각했다. 심지어 이클립스에서 read()가 int형을 반환하고 readLine()이 String형을 반환한다고 되어있어 그 착각이 맞다고 여기고 넘어간 것 같다. 이 착각에도 불구하고 여태까지 int형을 입력해 사용할 수 있었던 이유는 처음 BufferedReader의 사용법을 제대로 알게 된 블로그에서 그렇게 사용했기 때문... 학원에서 이미 배운 내용이지만 사용법을 다시 익힌 것도 그렇고 제대로 복습을 안한 탓이다..
read()
nextInt()와 비슷하다고 생각했지만 사실은 입력한 숫자나 문자 중 첫 글자만 아스키코드표를 따라 int형으로 변환하여 나타내는 메소드이다. 그래서 백준 9498번 에서 내가 70점이나 100점을 입력해도 가장 첫 글자인 '7'이나 '1'을 ASCII 형식을 따라 55 나 49로 반환하여 성적이 F가 나오게 된 것이다.(현실고증)
readLine()
readLine()은 내 착각과 다르게 문자열을 입력받는 것이 아니라 스트림으로부터 개행문자를 포함한 입력받은 한 줄을 전부 읽어오는 방식이다. 그래서 BufferedReader를 사용할 때 정수형 값을 입력받기 위해서 readLine()을 int형으로 강제형변환하여 사용한다. 만약 줄바꿈없이 한 줄에서 여러 숫자를 입력받고 싶다면 StringTokenizer를 사용한다. 구분자를 ','나 ' '(공백) 으로 지정하여 한 줄에 여러가지 숫자를 입력받을 수 있다.
참고한 글들
https://aomee0880.tistory.com/88
https://snupi.tistory.com/48
https://rlakuku-program.tistory.com/33
안그래도 StringTokenizer에 대해서도 자세히 알아보고 싶었는데 read와 readLine에 대해 알아보면서 더 알 수 있었다.