[java] Scanner와 BufferedReader의 차이

sun·2024년 12월 30일
0

코딩테스트

목록 보기
1/1

BufferedReader 클래스를 사용했을 때 Scanner 클래스 보다 메모리와 실행 시간이 더 적게 드는 것 같은데... 이유는?

내부 동작 방식과 설계 목적이 다르기 때문에 성능 차이 발생

Scanner

  • 입력을 파싱(parsing)하기 위한 클래스
    **파싱(parsing) : 입력된 데이터를 원하는 형식이나 구조로 변환하는 과정

  • 공백을 기준으로 데이터를 파싱

  • 내부적으로 공백을 기준으로 데이터를 분리하고 문자열을 정수로 변환하는 작업을 자동으로 수행
    이 작업 때문에 메모리를 더 많이 사용하고 느림

  • 동기화 O
    멀티스레드 환경에서 안전하지만 이로 인해 오버헤드 발생 가능성 있음
    멀티스레드 환경이 아닌 경우에도 동기화 강제 적용
    **오버헤드(overhead) : 추가적인 시간, 메모리, 자원의 소비

BufferedReader

  • 문자열 데이터를 효율적으로 읽기 위한 클래스
    버퍼(buffer)를 사용하여 입력처리 속도 향상과 i/o 작업 최소화
    **버퍼(buffer) : 임시로 저장하는 메모리 공간

  • 입력스트림에서 한 번에 여러 데이터를 버퍼에 읽어온 뒤 요청할 때마다 데이터를 가져옴
    한 줄씩 또는 버퍼 단위로 데이터를 읽음

  • 단순히 문자열로 입력을 받아오기 때문에 메모리 사용량이 적고 빠름
    별도로 파싱 처리를 해줘야 함

  • 동기화 X
    단일스레드 환경에서 더 효율적


+ 동기화란?
여러 스레드가 동시에 접근할 때 발생할 수 있는 문제를 방지하기 위해 특정 코드 블록이나 메서드의 실행을 하나의 스레드만 접근 가능하도록 lock하는 기법
멀티스레드 환경에서 데이터의 일관성과 안전성을 보장


BufferedReader 클래스는 예외처리가 필수이지만 Scanner 클래스는 필수가 아니던데.. 이유는?

IOException은 checked Exception이지만
InputMismatchException은 unchecked Exception

Scanner

  • 발생 가능한 예외

    • InputMismatchException : 입력값이 예상한 데이터 타입과 다를 때 발생
    • NoSuchElementException : 입력 스트림에서 더 이상 읽을 데이터가 없을 때 발생
    • IllegalStateException : Scanner가 이미 닫힌 상태에서 입력을 시도할 때 발생
  • 사용자 입력을 받는 데 주로 사용되는데, 형식에 맞지 않는 입력에서 발생하는 예외는 필수X

BufferedReader

  • 발생 가능한 예외

    • IOException : 입력 중 I/O 관련 문제가 발생했을 때 발생
      ex) 파일이 존재하지 않거나 네트워크 연결이 끊어졌을 때
    • NullPointerException : readLine()이 null을 반환했는데 이를 처리하지 않고 사용하려고 할 때 발생
  • 입출력 작업(파일, 네트워크, 콘솔 입력 등)에서 발생할 수 있는 예외에 대해 IOException을 던지므로 예외가 필수O

profile
Please, Steadily

0개의 댓글