-
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
반응형'Java' 카테고리의 다른 글
atomic vs volatile vs synchronized :: 마이구미 (1) 2017.01.29 StringBuilder vs System.out.println :: 마이구미 (0) 2016.12.28 Array.length 시간 복잡도 :: 마이구미 (0) 2016.12.26 자바 입력 클래스 활용하기 :: 마이구미 (2) 2016.12.20 ListIterator 인터페이스 활용하기 :: 마이구미 (0) 2016.11.21