• Scanner와 BufferedReader의 차이 [JAVA]
    Java 2016. 8. 3. 01:02
    반응형

    이번 글은 Scanner와 BufferedReader에 대해서 알아볼 것이다.

    위 클래스는 문자열 입력을 읽고 처리하기 위해 사용한다.

    자바를 공부했다면 누구나 사용해봤을 것이다.

    하지만 둘 차이를 확실히 모르거나 하나만 사용하는 경우가 많다.


    딱 보이는 기능으로만 보면 같다.

    BufferedReader 이 녀석 다음에 나온 것이 Scanner 클래스다.

    그렇다면 Scanner 이 녀석이 최신이다.

    Scanner만 쓰면 되겠군..


    아니다.... 두 녀석은 차이가 명확히 있다.

    이 글을 읽고 지금부터라도 용도에 맞게 사용해보자.

    Scanner sc = new Scanner(System.in); BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    기본적으로 입력을 받을 때 위와 같이 사용한다.

    일단 차이점을 나열해보겠다.


    1. Scanner의 버퍼 크기는 1024 chars, 반면 BufferReader의 버퍼 크기는 8192 chars이다.

    2. BufferReader는 문자열을 단순히 읽고 저장, Scanner는 문자열을 구분하여 분석할 수 있다.

    3. BufferReader는 동기화 된다. 반면 Scanner는 동기화가 되지 않는다.

    4. BufferReader는 즉시 IOException 처리를 던지지만, Scanner는 숨긴다.


    크게 4가지로 보겠다.

    1번의 경우로 인해 큰 파일을 읽을 때는 BufferReader이 좋다.


    2번의 경우는 Scanner는 지원하는 메소드를 이용할 수 있다.

    아래 소스를 보자.

    public static void main(String[] args) { // Initialize Scanner object Scanner scan = new Scanner("Anna Mills/Female/18"); // initialize the string delimiter scan.useDelimiter("/"); // Printing the tokenized Strings while(scan.hasNext()){ System.out.println(scan.next()); } // closing the scanner stream scan.close(); }


    Anna Mills Female 18

    위처럼 Scanner는 구문 기호를 이용할 수 있다.


    "BufferReader는 멀티 쓰레드에 안전하고, Scanner는 안전하지 않다" 라는 말을 본 적이 있는가?

    그것이 3번의 경우이다.

    동기화에 대해 살짝 언급하겠다.


    멀티쓰레드의 경우 여러 쓰레드가 같은 프로세스 내의 자원을 공유하기 때문에 서로의 작업에 영향을 줄 수 있다.

    예를 들어 A 쓰레드가 작업중이다.

    그러던 중 B 쓰레드에게 넘긴다.

    B 쓰레드에서 공유 데이터를 변경하고 A 쓰레드에 다시 제어권을 넘긴다면 예기치 않은 결과가 나올 수 있다. 

    제대로 된 처리를 위해선 A 쓰레드가 작업이 끝날 때까지 다른 쓰레드가 영향을 주지 않아야한다.


    그리하여 멀티 쓰레드를 활용하는 소켓 예제에서는 대부분 BufferReader를 많이 사용하는 걸 봤을 것이다.


    4번의 경우는 Scanner 경우에는 그냥 손이 덜 가는 것이 장점이다.


    차이를 잘 알고 가길 바란다.

    본인이 잘못 알고 있거나 빼먹은 것들이 있다면 알려주면 감사하겠다.


    참고 자료

    http://stackoverflow.com/questions/2231369/scanner-vs-bufferedreader

    반응형

    댓글

Designed by Tistory.