[Java] Scanner vs BufferedReader 비교해보자

2025. 7. 15. 12:53·Java

자바(Java)로 개발을 하다 보면 사용자 입력을 처리할 때 Scanner와 BufferedReader 고민하게 된다.

데이터를 읽어오는 것은 비슷해 보이지만, 내부 동작 방식과 성능, 안정성 면에서 큰 차이가 있다고 하는데

두 클래스의 핵심 차이점을 명확히 이해하고, 상황에 맞는 최적의 입력 방식을 선택해보면 좋을듯 하다.


핵심 역할 이해: Parse vs. Read

Scanner와 BufferedReader를 이해하는 가장 기본적인 개념은 그 역할입니다.

  • Scanner: Parse (파싱) 역할.
  • 사용자가 입력한 텍스트를 토큰(Token) 단위로 잘라서, 개발자가 원하는 특정한 타입의 데이터로 변환해 반환합니다. (예: "123"을 int로 변환)
  • BufferedReader: Read (읽기) 역할.
  • 사용자가 입력한 데이터 자체를 별도의 가공 없이 그대로 메모리에 읽어 들입니다.

Scanner vs. BufferedReader 4가지 차이점 비교

이러한 근본적인 역할 차이는 네 가지 주요 성능 및 기능 차이로 이어집니다.

1. 데이터 타입 유연성 (가장 큰 차이!)

구분 Scanner BufferedReader
타입 변환 🟢 원하는 타입으로 즉시 파싱 가능 🔴 무조건 String으로 읽음. 별도 형 변환 필수
주요 함수 nextInt(), nextDouble(), next() 등 다양한 함수 제공 readLine() 함수만 사용 (항상 문자열 반환)

Scanner는 nextInt(), nextLong(), nextFloat() 등 원하는 타입으로 직접 파싱할 수 있어 코드가 간결해지는 장점이 있습니다.

반면, BufferedReader는 String으로만 읽어오기 때문에 숫자 등으로 사용하려면

Integer.parseInt()와 같은 추가적인 형 변환 코드 작성이 불가피하다.

2. 메모리 사용 효율성 (버퍼 크기 차이)

두 클래스는 데이터를 효율적으로 처리하기 위해 버퍼(Buffer)라는 임시 저장 공간을 사용합니다.

  • BufferedReader: 8KB의 큰 버퍼 메모리 사용
  • Scanner: 1KB의 작은 버퍼 메모리 사용

따라서 많은 양의 데이터를 입력받아야 하는 환경(예: 알고리즘 문제 풀이, 대용량 파일 처리)에서는 버퍼 크기가 큰 BufferedReader가 훨씬 효율적입니다. 다만, BufferedReader는 일단 더 큰 메모리를 할당하고 시작한다는 점은 인지해야 합니다.

3. 멀티스레드 환경 안정성 (Thread Safety)

구분 Scanner BufferedReader
안전성 🔴 Thread-unsafe (안전하지 않음) 🟢 Thread-safe (안전함)
동기화 동기화 지원 안 함 (싱글스레드용) 동기화 지원

 

BufferedReader는 내부적으로 동기화(Synchronization)를 지원하기 때문에 멀티스레드 환경에서도 안전하게 데이터를 공유하고 사용할 수 있습니다. Scanner는 동기화를 지원하지 않아 여러 스레드가 동시에 접근할 경우 문제가 발생할 수 있습니다.

4. 실행 속도 및 성능 (CPU 효율성)

결론적으로, BufferedReader가 Scanner보다 실행 속도가 빠르다.

 

이유는 CPU가 입출력을 처리하는 방식에 있습니다.

  1. Scanner: 정규식을 이용해 토큰을 파싱하는 복잡한 로직이 포함되어 있으며, 비교적 자주 입출력 처리를 시도합니다.
  2. BufferedReader: 데이터를 버퍼에 충분히 쌓아두었다가 버퍼가 가득 차거나 개행 문자(\n)가 발생할 때만 한 번에 입출력을 처리합니다.

CPU는 문자가 입력될 때마다 하나하나 입출력을 처리하는 것보다, 데이터를 모아서 한 번에 처리하는 것이 훨씬 효율적입니다. 따라서 입력량이 많을수록 BufferedReader가 훨씬 CPU 부하가 적고 빠르게 데이터를 처리합니다.


요약 및 선택 가이드

상황 추천 클래스 이유
간단한 사용자 입력, 타입 변환이 편해야 할 때 Scanner 다양한 nextTpye() 함수로 코드가 간결
대용량 입력, 성능이 중요할 때 (알고리즘) BufferedReader 8KB 버퍼, 빠른 실행 속도, CPU 효율성
멀티스레드 환경에서 안전성이 중요할 때 BufferedReader Thread-safe 지원 (동기화)

 

개발 상황에 맞춰 두 클래스의 장단점을 고려하여 현명하게 선택하면 좋다.

'Java' 카테고리의 다른 글

[Java] Primitive type(원시타입) vs. Reference type(참조타입)  (3) 2025.08.30
[Java] 진법 변환 정리 (n진수 <-> 10진수)  (0) 2025.08.30
[Java] Integer.valueOf()와 Integer.parseInt()의 차이  (1) 2025.08.20
[Java] 자주 쓰이는 이클립스 단축키  (1) 2025.07.15
[JAVA] 빌더 패턴(Builder Pattern)을 사용해야 하는 이유  (1) 2025.05.24
'Java' 카테고리의 다른 글
  • [Java] 진법 변환 정리 (n진수 <-> 10진수)
  • [Java] Integer.valueOf()와 Integer.parseInt()의 차이
  • [Java] 자주 쓰이는 이클립스 단축키
  • [JAVA] 빌더 패턴(Builder Pattern)을 사용해야 하는 이유
싹난 감자🥔🌱
싹난 감자🥔🌱
개발 블로그
  • 싹난 감자🥔🌱
    감자에 싹이나서 잎이나서
    싹난 감자🥔🌱
  • 전체
    오늘
    어제
    • 분류 전체보기 (43)
      • Spring (3)
      • Java (17)
      • LLM (1)
      • DevOps (4)
      • Algorithm (14)
        • 백준 (4)
        • 프로그래머스 (0)
        • 코드업 (10)
      • Computer Science (3)
        • Operating System (2)
        • Computer Architecture (1)
      • Trouble Shooting 🚀 (0)
      • 회고 & 성장기록 (1)
      • 설계 📐 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    알고리즘입력
    배포
    Scanner
    Java
    자바 입력
    자바Scanner비교
    자바성능
    docker
    BufferedReader
    2차원 배열
    2진수
    비트
    코딩테스트
    자바BufferedReader
    구간합
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
싹난 감자🥔🌱
[Java] Scanner vs BufferedReader 비교해보자
상단으로

티스토리툴바