본문 바로가기
Language/JAVA

[JAVA] Scanner vs BufferedReader : 입출력 처리 방법 비교하기

by 이오와이 2023. 8. 29.

  사용자가 어떤 값을 입력했을 때, 그에 맞는 출력을 하려면 어떻게 해야 할까요?

자바에서는 Scanner와 BufferedReader 두 가지 방법이 있습니다.

공부하시면서 Scanner 클래스를 흔히 사용하셨을 겁니다.

 

하지만, 입력해야 되는 값이 무수히 많을 경우 Scanner 클래스를 사용하면 데이터가 많을수록 시간이 지체됩니다.

좀 더 효율적인 방법은 없는걸까요?

 

해당 클래스들의 차이 및 특징에 대해 알아보며 상황에 맞는 클래스를 선택해보도록 하겠습니다.

 

 

Scanner란?

Scanner 특징

Scanner 클래스는 다양한 형식의 입력 데이터를 파싱하고 처리합니다.

또한, java.utill 패키지에 속해있습니다.

 

  • 공백이나 구분 문자로 데이터를 분리하여 읽을 수 있습니다.
  • 다양한 자료형(정수, 실수, 문자열 등)의 데이터를 읽을 수 있습니다.
  • 편리한 메서드들을 제공하여 사용자 입력 처리에 유용합니다.

 

Scanner 사용 예시
public class Main {
	public static void main(String[] args) {
		
	}
}

클래스의 기본 형태를 갖춰줍니다.

 

import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
	}
}

Scanner sc = new Scanner(System.in); 입력 후 

ctrl + shift + o 를 눌러주면 패키지가 자동으로 추가됩니다.(import java.utill.Scanner;)

 

import java.util.Scanner;
public class Main {
 
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		int a = sc.nextInt();
		
		sc.close();
		
		System.out.println(a);
		
	}
}

입력할 값을 정수라 가정하고,

int a = sc.nextInt();를 입력하였습니다.

해당 한 줄로 인해 실행하면 콘솔창에 입력란이 생성됩니다.

정수형을 입력 할 수 있어요.

 

sc.close();를 입력하여 스캐너를 닫아주고 나면

System.out.println(a);로 인해 입력한 값이 출력됩니다.

 

즉, a에 11을 입력하면 11이 출력됩니다.

 

 

BufferedReader란?

BufferedReader 특징

BufferedReader 클래스는 버퍼링 기능을 활용하여 입출력 성능을 향상시킵니다.

또한, java.io 패키지에 속해있습니다.

  • 버퍼링 기능으로 인해 입출력 작업이 빈번하게 발생할 때 성능 개선을 기대할 수 있습니다.
  • readLine() 메서드를 사용하여 한 줄 씩 문자열 형태로 데이터를 읽어올 수 있습니다.
  • 파일이나 네트워크 소켓 등 다양한 소스로부터 데이터를 읽어올 수 있습니다.

 

BufferedReader 사용 예시
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {
	public static void main(String args[]){
 
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
	}
 
}

BufferedReader객체 생성 후 InputStreamReader객체를 생성합니다.

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main1 {
	public static void main(String args[]) throws IOException {
 
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		StringTokenizer st = new StringTokenizer(br.readLine());
	}
 
}

한 줄씩 String 형태로 받기 위해 readLine을 추가합니다.

readLine을 추가하기 위해 StringTokenizer를 생성합니다.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main1 {
	public static void main(String args[]) throws IOException {
 
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		StringTokenizer st = new StringTokenizer(br.readLine());

		int b = Integer.parseInt(st.nextToken());

		br.close();
		
		System.out.println(b);
	}
 
}

StringTokenizer로 받은 값을 int형태로 파싱해주어야 합니다.

int b = Integer.parseInt(st.nextToken());을 입력한 후 

버퍼드리더를 닫아줍니다.(br.close();)

syso입력 후 ctrl + space를 눌러 b를 출력할 수 있도록 합니다.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main1 {
	public static void main(String args[]) throws IOException {
 
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		StringTokenizer st = new StringTokenizer(br.readLine());

		int b = Integer.parseInt(st.nextToken());

		br.close();
		
		System.out.println(b);
	}
 
}

자바에서 입출력 작업을 수행할 때, 예외 상황이 발생할 수 있으므로, 

이를 처리하기 위한 클래스 IOException를 입력하였습니다.

 

마찬가지로 정수 12를 입력하면 12가 출력됩니다.

 

 

Scanner vs. BufferedReader 정리

JAVA에서의 입출력방법인 Scanner와 BufferefReader에 대해 알아보았습니다.

 

Scanner 클래스는 편리한 메서드들을 제공하여 자료형변환 등 다양한 작업에 용이하고,

BufferedReader 클래스는 대량의 데이터 처리 혹은 반복적인 입출력 작업이 필요한 경우 용이합니다.

 

따라서, 사용 목적과 상황에 맞게 Scanner와 BufferefReader 중 적절한 클래스를 선택하시면 됩니다.