OneDev

[JAVA] 입력받기 (Scanner vs BufferedReader) 본문

Language/JAVA

[JAVA] 입력받기 (Scanner vs BufferedReader)

one_dev 2023. 10. 3. 14:28

※ 목차

- 0. 요약

- 1. Scanner 클래스

- 2. BufferedReader 클래스

- 3. Scanner 사용법

- 4. BufferedReader 사용법


◎ 0. 요약

클래스 Scanner BufferedReader
설명 입력받은 데이터를 다양한 타입으로 변환하의 반환하는 클래스.
기본형과 String 타입을 정규표현식을 사용해 
파싱한다
데이터를 한 번에 읽어와 버퍼에 보관한 후 버퍼에서 데이터를 읽어오는 방식으로 동작하는 클래스,
동작 방식 공백과 개행문자 ( '\n', '\t', '\r' , ...) 를 기준으로 입력을 받으며, 데이터를 입력받을 경우 즉시 사용자에게 전송된다. 
입력받을 때마다 전송되기고, 내부적으로 정규표현식을 사용하기 때문에 BufferedReader에 비해 더 많은 시간 소요
일정한 크기의 데이터를 한 번에 읽어와 버퍼에 보관한 후, 사용자의 요청이 있을 때 버퍼에서 데이터를 읽어오는 방식으로 동작.
동기화(Syncronize) X O
패키지 java.util.Scanner java.io.BufferedReader
읽기 가능한 타입 원하는 타입 문자열 (String) Only
버퍼사이즈 1KB (1024 byte) 8 KB (8192 byte)
예외처리 별도의 예외처리 필요 없음 예외처리 필수
(throw IO Exception 또는 try & catch)
속도 느림 빠름
멀티쓰레드  안정성 unsafe safe

 

◎ 1. Scanner 클래스

▶ 패키지 : java.util ( java.util.Scanner)

 

공백 & 개행 문자를 기준으로 입력받는다 

 

타입에 구애받지 않고 입력 받을 수 있다

 

별도의 예외처리를 명시할 필요 없다 (UnChecked(Runtime) Exception)

 

▶ Thread unsafe 하기에 멀티스레드 환경에서 문제가 발생할 수 있다

 

데이터를 입력받을 경우 즉시 사용자에게 전송된다.

 

◎ 2. BufferedReader 클래스

패키지 : java.io (java.io.BufferedReader)

 

▶ 데이터를 파싱하지 않고 String 으로만 읽는다

 

▶ Checked Exeption → 반드시 예외처리를 해야 한다 (throw I/O Exception 또는 try/catch)

 

▶ Thread Safe 하기에 멀티스레드 환경에서도 안전하다

 

버퍼가 가득차거나 개행문자가 나타나면 버퍼의 내용을 한번에 전달한다.

 

많은 양의 데이터를 처리할 때 유리하다

 

 

◎ 3. Scanner 사용법

(1) 패키지 import  하기 ( import java.util.Scanner)

import java.util.Scanner

(2)  Scanner 객체 생성

Scanner scan = new Scanner(System.in);

( ※ System.in 이란 ? 사용자로부터 입력을 받기 위한 입력 스트림 / 다른 입력클래스들도 System.in 을 통해 사용자 입력을 받는다)

 

(3) 메소드를 이용해 입력받기

주로 사용하는 메소드들은 아래와 같이 있으며, 더 자세한 정보는 공식 API 를 참조하면 볼 수 있다

(공식 API Scanner 링크 -> https://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html

 

Scanner (Java Platform SE 8 )

Scans the next token of the input as a float. This method will throw InputMismatchException if the next token cannot be translated into a valid float value as described below. If the translation is successful, the scanner advances past the input that match

docs.oracle.com

 

메소드 설명
nextInt() 정수 입력 (input 의 다음 토큰을 int 형으로 받는다)
nextDouble() Double 형 입력
next() 다음 토큰을 입력받는다
nextLine() 한 줄을 입력받는다

 

<< 사용 예시 >>

import java.util.Scanner

public Class Main{
	public static void Main(String[] args){
    	Scanner scan = new Scanner(System.in);
        
        int num = scan.nextInt();
        String str = scan.next();
        ...
        ...
        
        scan.close();
    }
}

 

◎ 4. BufferedReader 사용법

(1) 다음의 패키지 import

- java.io.BufferedReader

- java.io.IOException

- java.io.InputStreamRedaer

( import java.io.* 로 한 번에 처리 가능)

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

// 또는 import java.io.*

 

(2) 예외처리 → throw exception 또는 try/catch

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
 
public class Main {
    public static void main(String[] args) throws IOException { //예외처리

    }
}

 

(3) 객체 생성

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
 
public class BR {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 객체생성        
    }
}

(4) 메소드를 이용해 입력받기 (readLine())

- readLine() 메소드를 주로 이용

- readLine() 의 리턴값은 String 이기 때문에, 다른 타입으로 입력을 받기 위해서는 형변환이 필요하다

- 데이터는 Line 단위로만 입력되기 때문에, 데이터를 가공하기 위해 StringTokenizer 또는 String.split() 함수 를 같이 활용하는 경우가 많다

 ※ StringTokenizer문자열을 지정한 구분자로 쪼개주는 클래스이며, 쪼개어진 문자열토큰 (token) 이라 부른다. 사용하기 위해서는 java.util.StringTokenizer 라이브러리를 import 해야 한다

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

public class Main{
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String s = br.readLine();
        
        // StringTokenizer
        StringTokenizer st = new StringTokenizer(s);
        int a = Integer.parseInt(st.nextToken());  
        int b = Integer.parseInt(st.nextToken());
        
        // String.split()
        String array[] = s.split(" "); // " " 을 구분자로 쪼개어 배열에 보관
        
        br.close();       
    }
}

 

 

Comments