2022. 2. 7. 15:18ㆍJava/Java
최근 자바 문법 문제를 풀면서 입력으로 Scanner 클래스를 많이 사용하였다.
왜냐하면 학부 수업을 할 때 입력으로 Scanner 클래스만 배우고 BufferedReader에 대해서는 배우지 못했다.
물론 따로 알아보려고 하지 않은 내 잘못도 있긴 하지만,
문제를 풀면 Scanner 클래스는 거의 100ms 이상의 시간이 소요되었다. 어떻게 하면 이 시간을 더 줄일 수 있나 찾아보다가 BufferedReader에 대한 존재를 알게 되었다.
그래서 BufferedReader와 Scanner 함수를 다시 공부하고 둘의 차이점을 내가 이해한 대로 적어보겠다.
1. Scanner
import java.util.Scaner;
사용을 위해 java.util.*; 임포트를 해주어야 한다.
최대 버퍼 사이즈는 1024이고 데이터 파싱이 가능하다. 또한, 키보드의 입력이 키를 누르는 즉시 바로 전달이 되기 때문에 입력된 데이터를 좀 더 쉽게 받을 수 있다. 형 변환 없이 입력되는 순간 형태가 결정된다.
하지만, 입력이 쉬운 반면 처리 속도가 BufferedReader보다 느리다.
2. BufferedReader
import java.io.*;
java.io에는 여러가 Input / Output 관련 클래스들이 존재하는데 BufferedReader 또한 포함이 된다.
최대 버퍼 사이즈는 Scanner 함수의 8배 즉, 8192이다. 버퍼가 Scanner보다 크고 데이터 파싱을 하지 않고 오로지 입력 값을 읽는 것이기 때문에 Scanner 보다 빠른 시간에 처리가 가능하다.
입력만 받는다고 끝이 아닌 때론 자기 상황에 맞는 형을 쓰기 위해선 형 변환을 해주어야 한다.
하지만 BufferedReader는 예외 처리를 해주어야 한다.
예외 처리는 두 가지 방법으로
1) try-catch 또는 2) throws IOException으로 반드시 예외 처리를 해주어야 한다.
예외 처리하는 이유는
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedReader를 선언하고 readLine() 함수를 사용할 때 입력 값이 null일 때의 상황을 방지하기 위해 예외 처리를 하는 것이다.
예시
문제. 정수 하나를 입력받아 부호 바꿔 입력하기 (출처. 코드 업 1040)
import java.util.Scanner;
public class Main{
public static void main(String[] args) throws Exception {
Scanner sc = new Scanner(System.in);
long a = sc.nextLong();
System.out.print(-a);
}
코드 길이:216 byte(s) / 수행 시간:119 ms / 메모리 :14344 kb
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String a = br.readLine();
int b = Integer.parseInt(a);
System.out.print(-b);
}
}
코드 길이:291 byte(s) / 수행 시간:68 ms / 메모리 :11148 kb
이렇게 좀 오버 치면 약 두배의 수행 시간 차이가 난다.
'Java > Java' 카테고리의 다른 글
자바 자료 구조 : 큐 - Queue (0) | 2022.06.27 |
---|---|
자바 자료 구조 : 배열 - Arrays & ArrayList (0) | 2022.06.27 |
[JAVA] 객체 지향이란? (0) | 2022.04.03 |
[Java] BufferedWriter와 System.out.print (0) | 2022.02.09 |