[JAVA] 스캐너(Scanner) VS 버퍼드리더(BufferedReader)

Scanner VS BufferedReader

Scanner

  • java.util.Scanner 클래스
  • 기본 유형과 문자열을 구문 분석 할 수 있는 간단한 텍스트 스캐너
  • 내부적으로 정규식을 사용하여 다른 유형을 읽기 가능
  • Java 프로그램에서 입력을 읽는 가장 쉬운 방법
  • 특정 데이터 유형을 읽기 위해 사용할 함수는 nextXXX() (nextInt(), nextFloat(), nextByte(), nextShort(), nextDouble(), nextLong(), next()) 사용 가능
  • 문자열을 읽으려면 nextLine()을 사용
  • 단일 문자를 읽으려면 next(), charAt(0)을 사용
  • next() 함수는 입력의 다음 토큰 / 단어를 문자열로 반환하고, charAt(0) 함수는 해당 문자열의 첫 번째 문자를 반환

BufferReader

  • Java.io.BufferedReader 클래스
  • Buffer를 이용해 입출력의 효율을 높혀줌
  • 문자 입력 스트림으로, 텍스트를 읽고 문자를 버퍼링하여, 문자 시퀀스를 효율적으로 읽을 수 있도록 함 (line단위의 입출력이 편리함)
  • 버퍼 크기를 지정하거나 기본 크기를 사용할 수 있으며, 기본값은 대부분의 목적에 충분히 큼
  • 일반적으로 Reader의 각 읽기 요청은 해당 읽기 요청이 기본 문자 또는 바이트 스트림으로 이루어 지도록 함
  • 따라서 FileReaders 및 InputStreamReaders[^1]와 같이 read () 작업에 비용이 많이들 수 있는 판독기 주위에 BufferedReader를 래핑하는 것이 좋음
  • 텍스트 입력에 DataInputStreams를 사용하는 프로그램은 각 DataInputStream을 적절한 BufferedReader로 대체하여 지역화 할 수 있음

생성자

  • BufferedReader (Reader in) : 기본 크기의 입력 버퍼를 사용하는 버퍼링 문자 입력 스트림을 만듦
  • BufferedReader (Reader in, int sz) : 지정된 크기의 입력 버퍼를 사용하는 버퍼링 문자 입력 스트림을 만듦

문자 입력 스트림

  • 입출력 단위가 2byte(JAVA에서는 문자를 의미하는 char형은 2byte) (cf. 바이트 기반 스트림 : 입출력 단위가 1byte)
  • 문자기반 스트림은 여러 종류의 인코딩과 자바에서 사용하는 유니코드간의 변환을 자동적으로 처리해주기 때문에 Reader는 특정 인코딩을 읽어서 유니코드로 변환하고, Writer는 유티코드를 특정 인코딩으로 변환하여 자동 저장(한글 깨짐 방지)

비교 : nextXXX () 이후에 nextLine()을 사용할 때 Scanner 문제

Scanner 예제

Scanner sc = new Scanner(System.in);

System.out.println("Enter an integer");
int a = sc.nextInt();
System.out.println("Enter a String");
String b = sc.nextLine();
System.out.printf("You have entered:- "+ a + " " + "and name as " + b);
  • input
10
JAVA
  • output : 첫째줄 int 타입받고 enter 누르고 바로 string 받지않고 다 출력 됨
Enter an integer
Enter a String
You have entered:- 10 and name as

BufferReader 예제

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Enter an integer");

int a = Integer.parseInt(br.readLine());
System.out.println("Enter a String");
String b = br.readLine();
System.out.printf("You have entered:- " + a + " and name as " + b);
  • input
10
JAVA
  • output
Enter an integer
Enter a String
you have entered:- 10 and name as JAVA
  • Scanner 클래스에서 nextXXX() 메서드 중 하나를 사용하여 nextLine() 메서드를 호출하면, nextLine()이 콘솔과 커서의 값을 읽지 않고 콘솔에 들어가지 않으면 해당 단계를 건너뛰게 되는데, 이 문제는 Scanner 클래스에서만 발생한다. 다음 XXX() 메서드는 newline 문자를 무시하고 nextLine()은 첫 번째 newline 문자까지만 읽기 때문이다. nextXXX()와 nextLine() 사이에 nextLine() 메서드를 한 번 더 사용하면 nextLine()이 newline 문자를 사용하기 때문에 이 문제가 발생하지 않으며, 이 문제는 여기에 나타난 바와 같이 문자열 입력을 위해 nextLine() 대신 next()를 사용함으로써도 해결할 수 있다.
  • BufferReader 클래스에는 이러한 유형의 문제가 없음

기타 차이점

  • BufferedReader는 동기식 이지만, Scanner는 아님. 다중 스레드로 작업하는 경우 BufferedReader를 사용해야 함
  • BufferedReader는 Scanner보다 훨씬 더 큰 버퍼 메모리를 가지고 있음
  • BufferedReader (8KB byte buffer)와 달리 Scanner는 작은 버퍼 (1KB char buffer)가 있지만 충분
  • Scanner가 입력 데이터를 구문 분석하고, BufferedReader는 단순히 문자 시퀀스를 읽기 때문에 스캐너에 비해 조금 더 빠름

references

https://www.geeksforgeeks.org/scanner-class-in-java/?ref=rp
https://www.geeksforgeeks.org/java-io-bufferedreader-class-java/
https://www.geeksforgeeks.org/difference-between-scanner-and-bufferreader-class-in-java/