본문 바로가기

JAVA 입/출력 성능 비교 (Scanner vs BufferedReader vs System.in.read())

@6uiw2026. 1. 11. 23:39

 

1. System.in.read()

 

특징

  • 저수준 입력 방식으로 1바이트씩 읽음.
  • 입력값은 **바이트(정수, ASCII 코드 값)**로 반환됨.
  • 처리 속도가 빠르지만, 사용하기 불편함.
  • 반환값: 0 ~ 255 (ASCII 값)
  • OS → JVM → 1바이트 읽기
  • 호출할 때마다 시스템 콜 발생 가능

 

장점

  1. 단순성
    • 입력 데이터를 바이트 단위로 바로 처리할 수 있음.
    • 별도 라이브러리 없이 간단히 사용 가능.
  2. 성능
    • 최소한의 기능만 제공하므로 오버헤드가 거의 없음.
    • 빠른 속도가 필요할 때 적합.
  3. 유연성
    • 직접 바이트 단위 처리가 필요하거나, 특정한 입력 형식(예: 비정형 데이터)을 읽을 때 유리.

 

단점

  1. 사용하기 불편함
    • 숫자나 문자열로 변환해야 하는 추가 작업이 필요함.
    • 여러 문자를 처리하려면 반복문이나 추가적인 처리 코드가 필요.
  2. 유니코드/다중 바이트 문자 처리 불편
    • 한글 같은 다중 바이트 문자 처리에는 적합하지 않음.

언제 활용?

  • 저수준 입력 처리가 필요한 경우
    • 바이너리 데이터를 직접 처리하거나, 바이트 단위로 데이터를 분석할 때.
  • 단순한 입력 데이터를 다룰 때
    • 예: 한 글자씩 읽어서 처리하는 프로그램.

 

2. Scanner

특징

  • 고수준 입력 클래스로, 다양한 데이터 타입(정수, 실수, 문자열 등)을 지원.
  • 기본적으로 공백과 줄바꿈을 구분자로 입력을 읽음.
  • 토큰 기반 입력
  • 내부적으로 정규식(regex) 사용
  • 편하지만 느림

장점

  1. 다양한 입력 처리
    • 정수(nextInt()), 실수(nextDouble()), 문자열(nextLine()) 등 다양한 데이터 타입을 쉽게 처리 가능.
  2. 편리한 구분자 처리
    • 기본적으로 공백과 줄바꿈으로 입력을 구분하지만, 사용자가 구분자를 변경할 수도 있음.
      java
      코드 복사
      scanner.useDelimiter(","); // 쉼표를 구분자로 사용
  3. 간단하고 직관적
    • 사용법이 쉬워 초보자도 쉽게 사용할 수 있음.

단점

  1. 성능 저하
    • 입력 데이터를 분석하고 변환하기 때문에 오버헤드가 있음.
    • 매우 대용량 입력 처리에는 부적합.
  2. 줄바꿈 문자(\n) 처리 문제
    • nextInt() 등 숫자 입력 메서드 사용 후 남은 \n 문자를 명시적으로 처리하지 않으면 문제가 발생할 수 있음.
      java
      코드 복사
      scanner.nextLine(); // 남은 '\n' 처리

언제 활용?

  • 작은 규모의 입력 처리에서 사용.
    • 예: 사용자와의 간단한 상호작용.
  • 다양한 데이터 타입의 입력 처리가 필요한 경우.

 

 

3. BufferedReader

특징

  • 고성능 입력 클래스로, 데이터를 버퍼링하여 읽기 성능을 최적화.
  • 문자열로 데이터를 읽고, 필요한 경우 변환해야 함.
  • 한 줄씩 입력 처리
  • 한 번에 많은 데이터를 버퍼에 읽음
  • 메모리에서 처리
  • 시스템 콜 최소화

장점

  1. 성능
    • 입력 데이터를 버퍼링하여 입출력 속도가 매우 빠름.
    • 특히, 대량의 데이터를 처리할 때 성능 우위.
  2. 유니코드 처리에 적합
    • 다중 바이트 문자(예: 한글)도 쉽게 처리 가능.
  3. 유연성
    • 줄 단위 입력(readLine())이 가능하며, 필요하면 문자열을 파싱하여 숫자나 기타 데이터로 변환 가능.

단점

  1. 추가 작업 필요
    • 모든 입력이 문자열로 반환되므로, 숫자나 다른 타입으로 변환해야 하는 추가 작업이 필요.
       
       
  2. 사용법이 비교적 복잡
    • BufferedReader를 사용하려면 InputStreamReader 등과 함께 사용해야 함.
int number = Integer.parseInt(bufferedReader.readLine());

 

언제 활용?

  • 대량의 입력 데이터를 처리할 때.
    • 예: 파일 읽기, 온라인 저지 플랫폼에서 문제 풀이.
  • 유니코드 데이터를 다룰 때.
  • 입출력 성능이 중요한 경우.

비교 요약

기능 System.in.read() Scanner BufferedReader
입력 단위 1바이트 단어/라인/숫자 등 라인 단위
데이터 타입 처리 바이트(ASCII) 다양한 타입 자동 변환 문자열로 반환
성능 빠름 느림 (오버헤드 큼) 빠름 (버퍼링 효과)
사용 편의성 낮음 높음 중간
유니코드 지원 제한적 지원 지원
사용 사례 저수준 바이트 처리 간단한 상호작용, 소규모 입력 대규모 데이터 처리

 

결론

  1. System.in.read()
    • 바이트 단위로 데이터를 직접 처리해야 하거나, 단순한 입력이 필요한 경우 사용.
  2. Scanner
    • 다양한 데이터 타입을 쉽게 처리할 수 있는 간단한 프로그램이나 사용자 입력 상호작용에 적합.
  3. BufferedReader
    • 대량의 입력 처리나 빠른 입력 성능이 중요한 경우 적합.
    • 예: 파일 읽기, 알고리즘 문제 풀이에서 자주 사용.
6uiw
@6uiw :: LOG.INFO("MING's DEVLOG")

개발을 하면서 공부한 기록을 남깁니다

목차