-
입력(Input)이란 무엇인가? (Scanner과 BufferedReader 에 대해 이해하기) - JavaJava 2019. 7. 5. 16:02
기본적으로 프로그래밍에서 가장 중요한게 입,출력이다. 그중에서 입력은 받아오는 값들을 지칭한다. 오늘은 입력중에서도 시스템에서 받아오는 입력에 관해서 포스팅 하겠다.
그값이 정수형(..., -1, 0, +1, ...) 일 수도 있고, 문자형(char) 일 수도 있으며, 문자열(String)과 같은 클래스 형식일 수도 있다
그렇다면 Java에서는 이와같은 기본형태의 자료들을 시스템에서 어떻게 받아 올 수 있을까?
기본적으로 Scanner(java.util.Scanner) 나, BufferedReader(java.io.BufferedReader) 과 같은 클래스를 이용해서 받아올 수 있다
밑에 예시를 들여다 보자
Scanner sc = new Scanner(System.in);
위와같이 Scanner을 이용해서 System에서 입력을 받아 올 수 있고,
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedReader을 이용해서도 System에서 입력을 받아 올 수 있다. 여기에서 InputStreamReader라고 하는 것이 문자를 하나하나 읽어들인다. 그리고, BufferedReader가 읽어들여온 문자들을 문자열로 만들어준다.
그럼 이 Scanner과 BufferedReader는 어떻게 다를까?
- 일단 Scanner, BufferedReader 모두 버퍼를 이용해서 입력값을 저장한다. 하지만, Scanner에서는 버퍼크기가 1024 chars, 이고 BufferedReader에서는 버퍼크기가 8192 chars 로 8배나 차이가 난다. 이말은, BufferedReader 가 더 많은 입력값을 한번에 처리 할 수 있다는 것이다. (이 때문에, Scanner을 이용하면 속도가 느리다)
import java.io.*; import java.util.*; public class sample{ public static void main(String[] args) throws IOException { String s = "111111111111111111111111111111111111111111111111111111111111111111111"; long startTime = System.nanoTime(); BufferedReader br = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(s.getBytes()))); br.readLine(); long endTime = System.nanoTime(); long duration = (endTime - startTime); System.out.println(duration); startTime = System.nanoTime(); Scanner sc = new Scanner(s); sc.nextLine(); endTime = System.nanoTime(); duration = (endTime - startTime); System.out.println(duration); } }
"111111111111111111111111111111111111111111111111111111111111111111111"라는 긴 문자열을 받아와서 BufferedReader 와 Scanner 를 통해서 실행 시간을 각각 받아본 결과
BufferedReader 가 Scanner보다 빠르게 처리 된다는 것을 확인할 수 있다.
- Scanner의 장점 으로는, Scanner에서는 IOException 처리를 숨겨준다. BufferedReader에서는 반드시, 해당 함수 옆에 throws IOException 을 써줘서 예외처리를 해줘야 된다. 그러므로, Scanner를 이용하면 손이 적게 간다는 것이다.
import java.io.*; public class sample{ public static void main(String[] args) throws IOException { String s = "111111111111111111111111111111111111111111111111111111111111111111111"; BufferedReader br = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(s.getBytes()))); br.readLine(); } }
BufferedReader의 경우,main 함수 옆에 throws IOException 으로 꼭 예외 처리를 해줘야 하는데, 이게 BufferedReader을 사용하는 모든 함수에 처리를 해줘야 하지만, Scanner을 이용하면 이러한 처리들이 필요없기 때문에, 쉽게 적용 시킬 수 있다는 장점이 있다.
- 또한, Scanner을 이용하면 입력들을 손쉽게 변환해줄 수 있다. 밑에 예제를 보자.
import java.util.*; public class sample{ public static void main(String[] args) throws IOException { String s = "111111111111111111111111111111111111111111111111111111111111111111111\n" + "123\n" + "1231238192308129381920381092381092380923810923810923810923810923810923\n" + "true\n"; BufferedReader br = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(s.getBytes()))); br.readLine(); Integer.parseInt(br.readLine()); BigInteger(br.readLine()); Boolean.parseBoolean(br.readLine()); Scanner sc = new Scanner(s); sc.nextLine(); sc.nextInt(); sc.nextBigInteger(); sc.nextBoolean(); } }
총 4줄로 이루어진 입력을 BufferedReader와 Scanner을 통해서 받았다.
BufferedReader을 통해서 입력들을 자료형으로 변경 해주기 위해서는, 각각의 자료형으로 한번더 고쳐야 되는 수고를 들여야 한다.
하지만, Scanner을 이용하면 간단하게 자료형으로 받아올 수 있다는 장점이 있다.
이로써, 입력을 받을 때 사용하는 BufferedReader와 Scanner을 알아보았다
각각 장단점이 있기 때문에 적절히 사용하는게 중요할 것이다.
마지막으로 BufferedReader같은 경우에는 동기화가 가능하기 때문에, 순차적으로 진행하는 프로그램을 만들때는 Scanner보다 BufferedReader를 사용하는 것을 추천한다
'Java' 카테고리의 다른 글
접근제한자, 접근제어자 (public, private, protected, default) 가 뭔데? - Java (0) 2020.06.04 그래서 Stream 이 뭔데? - Java (0) 2020.06.01 자바[JAVA]란? (0) 2019.06.25