본문 바로가기
JAVA☕️

Java 데이터 입력 받기

by ZZiwon Choi 2025. 1. 19.

 

자바에서 사용자에게 입력 받는 방법

1. Scanner

2. BufferedReader

 

  BufferdReader Scanner
Buffer Size 8192 1024
Syncronized O X
문자열 파싱 단순히 읽어 들임 문자열 파싱 가능
Exception IOException 던짐 IOException 숨김

 

가장 큰 차이점 => 속도

 

BufferedReader가 버퍼를 사용하기 때문에 더 빠른다. 반면 Scanner는 사용하기 편하다.

알고리즘 문제를 풀때 난이도가 낮을때는 Scanner로 충분히 풀 수 있지만 난이도가 올라가고 시간 제한이 타이트해지면 Scanner로 입력을 받으면 시간 초과가 날 것이다. 

그래서 BufferedReader에 대해 자세히 알아보자!!

BufferedReader

Data 입력 시 Buffer에 저장-> Buffer가 꽉 차거나 개행 문자를 만날 시 사용자에게 전송=> 전송 처리 시간이 줄어든다. 

 

BufferedReader에 대해 소개하기 전에 InputStreamReader에 대해 소개하면 InputStreamReader는 문자열을 Character 단위로 읽어들인다. 그래서 긴 문자열을 읽을 때는 비효율적이다. 한 글자씩 읽어들이기 때문 -> 이를 보완하기 위한 BufferedReader 존재

즉, BufferdReader= InputStreamReader + 버퍼링 기능

 

여기서 잠깐!

Q. 버퍼가 뭔데?
A. 데이터를 한 곳에서 다른 한곳으로 전송하는 동안 일시적으로 해당 데이터를 보관하는 임시 메모리 영역이다. 주로 입출력 속도 향상을 위해 버퍼를 사용한다. 자바에서는 버퍼를 BufferdReader와 BufferedWriter라는 클래스를 제공한다. 

 

BufferedReader는 입력받은 데이터를 일정한 크기로 한번에 읽여들어 버퍼에 보관하고 사용자의 요청이 있을 때 버퍼에서 데이터를 읽어온다. 

  • 라인 단위로 입력 받기 때문에 공백도 스트링으로 인식
  • 입력 받은 데이터 타입이 String 타입이기 때문에 다른 타입의 데이터라면 형변환 필요
  • 예외 처리가 필수적이다. try-catch문을 이용하던가 메인문 중괄호 시작 전 throws IOException으로 처리 필요
  • Thread safe 성질을 지니기에 멀티스레드 환경에서도 안전하다. => 여러 스레드가 동시에 접근하거나 작업을 수행해도 문제가 발생하지 않는다. 

 

BufferedWriter

한번에 모았다가 출력이 가능하기 때문에 많은 양의 출력을 할 때 유리하다. 

버퍼를 정의해줬기 때문에 반드시 flush()/close()를 호출해 뒤처리를 해줘야 한다. 또한, 

자동 개해 기능이 없기 때문에 개행이 필요한 경우 "\n"을 해줘야한다. 

클래스 메소드 리턴타입 작동 방식
BufferedReader read() int 문자 하나를 읽어 int형으로 리턴
readLine() String 한 줄의 문자열을 읽음
skip(n) long n개의 문자를 스킵하고 넘어간다.
BufferedWriter write(s) - 문자 또는 문자열 s를 출력한다.
newLine() - 빈 줄을 작성한다.
flush() - 남은 값들을 모두 출력시킨다.
close() - 스트림을 종료한다. 

 

 

주의🚨

  • BufferdReader의 read()와 readLine()은 리턴 타입이 다르기 때문에 구분해서 사용해야한다. 
    read()는 문자를 읽어 그에 해당하는 ASCII 10진수 정수를 반환하기 때문에 숫자를 바로 입력받을 수 있다고 생각하면 안된다.
    예를 들어 첫 문자가 0-9까지의 숫자라면 그에 상응하는 ASCII 10진수 int 값인 48-57이 반환된다. 
  • BufferedWriter 객체는 반드시 flush() 또는 close()를 해서 스트림을 끝내야 한다. 

 

import java.io.BufferReader;
import java.io.IOExeption;
import java.io.InputStreamReader;

	BufferReader br = new BufferedReader(new InputStreamReader(System.in));
	String input=br.readLine();

 

 

반복해서 입력 받기

 

import java.io.BufferReader;
import java.io.IOExeption;
import java.io.InputStreamReader;

	BufferdReader reader = new BufferedReader(new InputStreamReader(System.in));
    
    String str;
    while((stri = reader.readLine()) != null){
    	System.out.println(str);
    }

 

 

다량의 데이터 입력 받기

 

import java.io.BufferReader;
import java.io.IOExeption;
import java.io.InputStreamReader;

	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	String s = br.readLine(); 
    
    int i=Integer.parseInt(br.readLine()); //readLine()으로 받은 String 값을 int로 형변환
    
    String s2[] = br.readLine().split(" ");
    
    StringTokenizer st = new StringTokenizer(br.readLine());