개발언어/Java

[Java] Scanner vs BufferedReader

뜽배 2024. 7. 5. 22:08
728x90
반응형

자바에서 알고리즘 문제를 풀 때 Scanner로 문제를 풀 경우 시간초과가 날 경우에 BufferedReader로 해결한 경험이 있을 것이다.
왜 Scanner와 BufferedReader는 똑같은 역할을 하지만 시간이 다를까? 의 답을 알아보자.


1. Scanner 클래스


Scanner 클래스는 Java에서 입력을 간펺라게 받을 수 있는 방법 중 하나이다. 주로 콘솔 입력을 받을 때 많이 사용된다.


예제코드)

import java.util.Scanner;

public class test1
{
    private Scanner scanner;
    
    private void start() 
    {
        scanner = new Scanner(System.in);
        
        int a = scanner.nextInt();
        
        System.out.println("a is :: " + a);
    }

    public static void main()
    {
        new test1().start();
    }

}


Scanner의 특징은 
* 사용하기 간편함
* 다양한 데이터 타입(int, double, String등)을 쉽게 읽을 수 있다.
* 상대적으로 느림
* 큰 데이터를 다룰 떄 성능이 떨어질 수 있음.
* Unchecked Exception 으로 별도 예외 처리를 명시할 필요가 없다.
* 멀티 쓰레드 환경에서 문제가 발생할 수 있다.


2. BufferedReader 클래스

데이터를 한번에 읽어와서 버퍼에 보관한 후 버퍼에서 데이터를 읽어오는 방식으로 동작하는 클래스이다.
BufferedReader클래스는 문자 입력을 스트림에서 문자를 읽기위해 사용된다.
BufferedReader는 버퍼링을 통해 입력 속도를 향상시카고, 일반적으로 InputStreamReader와 함께 사용된다.

예제코드)

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

public class test1
{
    private BufferedReader br;
    
    private void start() throws IOException
    {
        br = new BufferedReader(new InputStreamReader(System.in));
        
        String input = br.readLine();
        int number = Integer.parseInt(input);
        
        System.out.println("number :: " + number);
        
    }

    public static void main() throws IOException
    {
        new test1().start();
    }

}



BufferedReader의 특징은
* 데이터를 파싱하지 않고 String으로 읽고 가져온다.
* Checked Exception으로 반드시 예외처리를 해야한다.
* 멀티쓰레드 환경에서 안전하다.
* 버퍼가 가득차거나 개행문자가 나타나면 버퍼의 내용을 한번에 프로그램으로 전달한다.


마지막으로 BufferedReader를 사용할 때 "throws Exception"을 사용하는 이유에 대해서 알아보자


3. BufferedReader시 "throws IOException"사용 이유


readLine 메서드가 입력을 읽는 과정에서 I/O예외가 발생할 수 있기 때문에 사용한다.
이러한 예외 처리를 하지 않으면 프로그램이 비정상 종료가 될 수 있기 때문이다.

"throws IOExcpetion"은 메서드 선언부에 예외를 던질 수 있음을 명시하여 호출하는 쪽에서 예외를 처리하도록 한다.
만약 throws IOException을 사용한다면 예와가 발생 했을 때 해당 메서드에 애러를 던지게된다.
또는 try-catch블록을 사용하여 직접 예외를 처리 할 수도 있다.

만약 try-catch를 사용한다면 아래와 같이 사용할 수 있다.

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

public class test1
{
    private BufferedReader br;
    
    private void start() 
    {
        br = new BufferedReader(new InputStreamReader(System.in));
        
        try
        {
            String input = br.readLine();    
            int number = Integer.parseInt(input);
            System.out.println("number :: " + number);
        }
        catch(IOException e)
        {
            System.err.println("IOException 발생");
        }
        catch(NumberFormatException e)
        {
            System.err.println("NumberFormat exception발생");
        }
    }

    public static void main()
    {
        new test1().start();
    }
}
728x90
반응형

'개발언어 > Java' 카테고리의 다른 글

[Java] Java 백준 2566 최댓값  (0) 2024.08.27
[Java] Java 백준 1181번 단어정렬  (0) 2024.08.09
[Java] java EOF처리 방법  (0) 2024.07.12