ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 입력(Input)이란 무엇인가? (Scanner과 BufferedReader 에 대해 이해하기) - Java
    Java 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를 사용하는 것을 추천한다

Designed by Tistory.