자료구조

+) JAVA BufferedReader & Scanner 차이, 버퍼란?

나는나는용 2023. 2. 21. 00:28
728x90

가장 큰 차이 = 속도 차이

 

싱글 스레드를 사용하는 Scanner보다
동기화를 사용하는 BufferedReader가 조금은 느리다.

 

!! 

Scanner는 정규식을 사용하여 값을 받기에,
결론적으로는 BufferedReader가 사용자의 입력을 더 빠르게 읽어들일 수 있다.

BufferedReader

  • 문자열(String)밖에 읽지 못함.( readLine()함수만 사용)
  • 버퍼의 크기: 8kb (  긴 문자열 유리 )
  • 동기화 사용

Scanner

  • 정수값(int,short,long), 소수값(float,double), 문자열(String)읽기 가능.
    (  nextInt(),nextShort()...등등 사용 )
  • 버퍼의 크기: 1kb
  • 입력을 읽는 과정에서 내부에서 정규식 사용한 파싱, 입력값 분할.
  • 싱글스레드 사용. 동기화 미사용. ( 여러 스레드 간 공유 불가능 )

추가

버퍼란 무엇인가?

결론을 말하자면, 임시 저장용 메모리 영역.
CPU와 보조기억장치 사이에서 사용함.

버퍼는 왜 쓰는가?

컴퓨터 안의 프로세스 사이에서 데이터를 이동시킬 때 사용함.
이 때, 한 번에 전송시키기 때문에, 전송 시간에 있어 효율적임.

 

그런데, 왜 한 번에 묶어서 전송시키려 하는가?

입력 속도와 출력 속도의 간격(차이)을 줄여주기 위해서.
또한, 버퍼에 저장하는 동안(전송하기 전에) 사용자가 수정 가능.

 

간격..? 무슨 간격?

예시를 들어보자.

CPU가 1초에 처리할 수 있는 데이터가 100개라고 한다면,
처리할 데이터를 갖고있는 보조 기억 장치는 1초에 3개밖에 보내주지 못함.
그러면 CPU는 일을 더 하고싶어도 일이 없으니 못하는 상황이 발생함.

한마디로, CPU(능력자)가 보조기억장치(폐급) 때문에 비효율적이게 돼버림.

 

그래, 그럼 그 간격을 버퍼는 어떻게 줄여주는가?

일단, 버퍼는 주기억장치를 사용하는데, 이는 보조기억장치보다는 빠름.

1. '보조기억장치'는 '주기억장치에 있는 버퍼'에 정보를 넘겨.
2. 버퍼는 일단은 다 받고 쌓아놔.
3. CPU는 그동안 여기저기서 많은 일들을 해결하고있어.
4. CPU가 버퍼 봤는데, 버퍼가 그간 열심히 쌓아놨네?
5. "이 정도는 껌이지~" 하고, CPU는 또 휘리릭 해결해버려.

728x90