[JAVA] Scanner와 BufferedReader

이한솔·2023년 11월 5일
0

JAVA

목록 보기
3/9

자바를 처음 배울 때는 사용자에게 값을 입력받기 위해 보통 Scanner 클래스를 사용하게 된다. 하지만 알고리즘 풀이를 시작하면 Scanner로 입력받아 시간초과가 발생하는 경험을 하게 된다. 그 후 BufferedReader를 접하면서 사용하게 된다.

둘 다 사용자에게 값을 입력받을 수 있는 기능을 제공한다. 두 클래스는 무엇인지 그리고 어떤 차이점이 있는 지 정리해보고자 한다.

Scanner

Scanner 클래스는 JAVA의 java.util 패키지에 포함되어있고, 사용자로부터 키보드 입력을 받을 수 있게 한다.

Scanner 특징

  1. 버퍼의 사이즈가 1024byte(1KB)이다.
  2. 공백(띄어쓰기) 및 개행(줄 바꿈)을 기준으로 읽는다.
  3. 데이터를 파싱하여 원하는 type으로 가져온다.
  4. I/O Exception을 던지지 않는다.
  5. thread unsafe : 두 스레드에서 동일한 Scanner 인스턴스를 사용하는 경우 객체에 대한 액세스를 동기화 하지 않으면 문제가 발생할 수 있다.
  6. 데이터를 입력받을 경우 즉시 사용자에게 전송되며, 입력받을 때마다 전송되어야하기 때문에 많은 시간이 소요된다.

Scanner로 입력 받기

Scanner 클래스를 사용하기 위해서는 java.util 패키지를 import 한다.
import java.util.Scanner;
1. 사용자로부터 정수를 입력받을 때
Scanner scanner = new Scanner(System.in); // 키보드 입력을 읽을 Scanner 객체 생성

System.out.print("정수를 입력하세요: ");
int number = scanner.nextInt(); // 정수 입력받기

System.out.println("입력받은 정수: " + number);
2. 사용자로부터 문자열을 입력받을 때
Scanner scanner = new Scanner(System.in);

System.out.print("문자열을 입력하세요: ");
String inputString = scanner.nextLine(); // 문자열 입력받기 (공백 포함)

System.out.println("입력받은 문자열: " + inputString);

입력받을 때는 System.in을 통해 Scanner 객체를 생성한다.

System.in
사용자로부터 입력을 받기 위한 입력 스트림. Scanner 클래스 외 다른 입력 클래스도 System.in을 통해 사용사 입력을 받아야한다.

Scanner 클래스를 이용한 입출력 조절

Scanner 클래스는 다양한 자료형을 지원하며, 이를 활용하여 사용자로부터 원하는 데이터를 입력 받을 수 있다. 예를 들어, nextInt(), nextDouble(), nextBoolean(), nextLine() 등의 메소드를 이용하여 각각 정수, 실수, 불리언, 문자열(한 줄)을 입력 받을 수 있다.

Scanner 클래스의 useDelimiter() 메소드를 사용하여, 입력 소스에서 토큰을 구분할 문자열을 지정할 수 있다. 기본적으로는 공백이나 개행 문자로 토큰을 구분하는데, 이를 원하는 구분자로 변경할 수 있다.

Scanner scanner = new Scanner(System.in);
scanner.useDelimiter(","); // 쉼표를 구분자로 사용

System.out.print("쉼표로 구분된 여러 값을 입력하세요: ");
while (scanner.hasNext()) {
    String value = scanner.next();
    System.out.println("입력받은 값: " + value);
}

BufferedReader

BufferedReader 클래스는 JAVA의 java.io 패키지에 포함되어있는 클래스로, Scanner와 비슷하지만, 더 빠르고 효율적으로 대용량 데이터를 처리할 수 있따.
BufferedReader 클래스는 버퍼링된 입력 문자 스트림을 생성하는데 사용된다. read() 메소드를 통해 문자를 읽고, 내부적으로 버퍼를 사용하여 효율적인 읽기 동작을 수행한다.

BufferedReader 특징

  1. 버퍼 사이즈가 8192byte(8KB)이다. : 버퍼를 이용해 입출력 효율을 높일 수 있도록 한다.
  2. 데이터를 파싱하지 않은 채 가져온다. : String으로만 읽고 저장한다.
  3. I/O Exception을 던지므로 반드시 예외처리를 명시해야한다. 즉, I/O Exception으을 throw 하거나 try/catch를 사용한다.
  4. thread safe하다.

BuffredReader 로 입력 받기

BufferedReader 클래스를 사용하기 위해서는 java.io 패키지를 import 해야한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
사용자로부터 문자열을 입력 받는 예제
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); // 키보드 입력을 읽을 BufferedReader 객체 생성

System.out.print("문자열을 입력하세요: ");
try {
    String inputString = reader.readLine(); // 문자열 입력받기
    System.out.println("입력받은 문자열: " + inputString);
} catch (IOException e) {
    e.printStackTrace();
}
BufferedReader 클래스를 이용한 입출력 조절
BufferedReader 클래스를 사용하면, 특정 문자나 문자열을 기준으로 입력을 처리할 수 있다. 예를 들어 readLine() 메소드를 사용하여 한 줄씩 입력 받을 수 있다.
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

try {
    System.out.print("여러 줄의 텍스트를 입력하세요 (종료하려면 'exit' 입력): ");
    String line;
    while (!(line = reader.readLine()).equals("exit")) {
        System.out.println("입력받은 줄: " + line);
    }
} catch (IOException e) {
    e.printStackTrace();
}

Scanner와 BufferedReader의 차이점

  1. 성능과 속도
  2. : Scanner는 입력을 파싱하고 토큰 단위로 분리하는 작업을 수행하기 때문에 입력 속도가 느릴 수 있다. 특히 대용량 데이터를 처리할 때는 상대적으로 느릴 수 있다.
    : BufferedReader는 내부적으로 버퍼를 사용하여, 입출력을 처리하기 때문에 대용량 데이터를 처리할 때 효율적이다.
  3. 입력 소스 처리 방식
  4. : Scanner는 입력 소스로부터 token을 읽는다. 기본적으로 개행 문자나 공백으로 토큰을 구분한다.
    : BufferedReader는 행단위로 입력을 처리하고, readLine() 메소드를 사용하여 한 줄 씩 읽을 수 있다.
  5. 입력 형식
  6. : Scanner는 다양한 자료형을 입력받을 수 있는 메소드를 제공한다. nextInt(), nextDouble(), nextBoolean(), nextLine(), next() 등의 메소드를 제공한다.
    : BufferedReader는 기본적으로 문자열을 입력받고 라인 단위로 읽어들이며, readLine()메소드를 사용한다.

정리

상황에 맞게 Scanner와 BufferedReader를 사용해야겠지만, 속도 차이가 중요한 경우, 혹은 대용량 데이터를 처리해야하는 경우에는 BufferedReader를 사용하여 코드를 작성하는 것이 효과적일 수 있겠다.
profile
개인 공부용

0개의 댓글