자바에서 알고리즘 문제를 풀 때 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();
}
}
'개발언어 > Java' 카테고리의 다른 글
[Java] Java 백준 2566 최댓값 (0) | 2024.08.27 |
---|---|
[Java] Java 백준 1181번 단어정렬 (0) | 2024.08.09 |
[Java] java EOF처리 방법 (0) | 2024.07.12 |