[java] Scanner와 BufferedReader의 차이

sun·2024년 12월 30일
0

코딩테스트

목록 보기
1/4

✒️ 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개의 댓글

관련 채용 정보