본문 바로가기
Java/Java 궁금했던 개념들

Scanner 대신BufferedReader를 사용해보자!!

by Dev dreamer 2023. 1. 25.

 

요즘 코딩테스트 준비를 하면서 메인클래스를 만들고

 

static에 올리지 않은 solution 메소드를 만들어서 그 안에서 값을 출력하는 코드를 기본적으로 만드는데

 

이 과정을 몇번 해보다 보니까 생각보다 쉽게 이해가 가고 만들 수 있었다.

 

그때 생각났던게 예전에 백준 문제를 풀면서 코드처리 속도 때문에 못풀었던 문제가 생각났다.

 

아! 입력도 bufferedReader 를 이용해서 받는거에 익숙해져야 겠다!

 

라는 생각이 지금 들어서 한번 정리하고 쭉 이 방법으로 데이터 입력받는 연습을 하려고 한다.

 

 

연습하기에 앞서 Scanner와 BufferedReader 의 차이를 간단하게 정리해보고자 한다.

 

🔍Scanner와 BuffeReader의 차이!


💡 Scanner

  • 스캐너는 활용적인 측면에서는 버퍼리더보다 유리하다고 할 수 있다.
    • 정수 값, 소수 값, 문자데이터 등을 구분없이 바로바로 읽어들일 수 있다.
    • 오히려 받아들이는 글이 짧을경우 Scanner가 더 유리할 수도 있다고 한다.
    • Scanner는 정규식을 사용하여 값을 파싱한다.
      • Scanner는 int, long, short, float, double 등의 경우와 같이 각각 nextInt(),nextLong(),nextShort(),nextFloat(),nextDouble()과 같은 함수들을 사용한다.

 

💡 BufferedReader

  • BuffedReader 버퍼리더는 입력받은 값을 8192char 크기의 버퍼에 담아두었다가 한번에 프로그램으로 전송한다.
    • 위와 같은 이유 때문에 바로 입력받는 Scanner가 더 효율적이지 않을까 생각 할 수도 있지만 버퍼링 없이 전송하는 것은 CPU와의 성능 차이 때문에 BuffedReader를 사용하는 방식이 속도에서 더 효율적이다.
  • BuffedReader는 Scanner보다 더 오래 되었다.

 

BufferedReader의 경우 동기화를 사용하지만 Scanner는 사용하지 않는다.

 

즉 여러 스레드 간에 Scanner 는 공유될 수 없지만 BufferedReader 개체는 공유할 수 있다. 동기화를 사용하는 BuffedReader의 경우 single thread를 사용하는 Scanner 보다 약간 느리다. 하지만 Scanner의 경우 정규식을 사용하여 값을 받으므로 이러한 속도 차이는 보상을 넘어 BuffedReader가 더 빠르게 문자열을 읽을 수 있게 된다.

 

 

🔍BuffeReader 사용방법!


 

Scanner 의 경우 기본적으로 띄어쓰기와 개행문자(줄바꿈 문자)를 기준으로 값을 인식하기 때문에 그 기준에 맞게 사용만 한다면 따로 가공해줄 필요는 없다. 하지만 BuffedReader는 개행문자만 경계로 인식하고 입력된 데이터의 형식이 String으로 고정되어 데이터를 따로 가공해야만 한다.

 

💡 Scanner의 경우

 

Scanner만 임포트하고 나머지는 각자 type에 맞게 입력만 해줘서 사용하면 바로 이용이 가능했다.

여기서 BuffedReader는 Scanner와 다르게 우리가 인식해야하는 몇가지 차이점만 기억하면 된다.

 

💡 BufferedReader의 경우

 

BufferedReader를 사용할 경우!

 

문자열을 입력받는다고 했을때에도 가장 기본적으로 임포트해줄것들이 있다.

기본적으로 입력은 readLine() 이라는 메소드를 통해서 String 값을 읽어준다.

readLine()은 String으로 리턴값이 고정되어 있기 때문에 다른 타입으로 입력을 받고자 한다면 반드시 형변환을 해줘야 한다(밑에서 다뤄보겠다). 예외처리도 해줘야 하는데 try/catch 문이나 throws IOExceptio을 통해서 해준다.

 

일단 int 입력을 보면 데이터를 읽기 위해서 형변환을 해줘야 한다.

 

이때 들어온 한줄의 String 데이터를 형변환 했다고 해도 공백 부분으로 받아야 하는 입력데이터는 따로 처리를 해줘야 한다.

 

BufferedReader 는 데이터를 개행문자 단위로 가져오기 때문에 이를 공백단위(띄어쓰기)로 데이터를 가공하려면 따로 작업을 해줘야 한다..( 세상에 공짜는 없구나...)

 

2가지 방법이 있다.

1. StringTokenizer

기본적으로 nextToken() 함수를 쓰면 readLine()을 통해 입력 받은 값을 공백단위로 구분하여 순서대로 호출함.

2. String.split

이 함수를 사용하면 배열에 공백단위로 끊어서 데이터를 저장한다.

 

 

🔍총 정리


 

Scanner가 단순하고 쓰기 편리하지만, 버퍼를 사용해 받는 BufferReader의 속도차이의 장점이 알고리즘 문제를 풀거나 데이터수가 급격히 늘어나면 훨씬 효율적이기 때문에 BufferedReader의 사용법을 꼭 알면 좋을듯 싶습니다!

'Java > Java 궁금했던 개념들' 카테고리의 다른 글

[Java] 구동방식 정리  (0) 2023.02.11
[Java] VO 와 DTO 구분하기  (0) 2023.02.02

댓글