Java 문자열 입력 처리 - Scanner와 BufferedReader

2026. 7. 28. 10:45·Java/정리

입력받는 방식

Java에서 콘솔 입력을 받을 때 가장 많이 사용하는 클래스는 두 가지가 있다. 대부분 Scanner를 사용하지만, 코딩 테스트나 대용량 데이터를 처리할 때는 대부분 BufferedReader를 사용한다. 이번 글에서는 두 클래스가 만들어진 이유부터 내부 동작 방식, 성능 차이까지 정리해보려고 한다.


Scanner

Scanner sc = new Scanner(System.in);

String name = sc.nextLine();
int age = sc.nextInt();
nextInt()
nextDouble()
next()
nextLine()

굉장히 직관적이다. 입력받고 싶은 타입 그대로 메서드가 존재한다. 덕분에 초보자가 배우기 매우 쉽다. Scanner는 사용하기 편하도록 만들어진 입력 도구이다.


InputStream

Java는 원래 입출력 시스템을 매우 유연하게 설계했다. 가장 기본이 되는 클래스는 InputStream 이다. 하지만 InputStream 은 Byte 단위로 읽는다. A를 입력할 경우 65 같은 바이트 값만 읽을 수 있다. 사람이 사용하는 문자열을 읽기에는 너무 불편하다. 그래서 등장한 것이 InputStreamReader 이다


InputStreamReader

InputStreamReader 는 Byte -> Char로 변환해주는 역할을 하는데, 바이트 입력을 문자 입력으로 바꿔주는 어댑터(Adapter) 라고 생각하면 된다. 하지만 문자를 읽을 경우

Hello 

H
e
l
l
o

 

위와 같이 하나씩 읽는다. 이 방식은 매우 비효율적이다. 그래서 Java는 버퍼(Buffer) 를 하나 두기로 했다.


Buffer란?

"미리 데이터를 한꺼번에 가져와 저장해두는 공간"

 

예시로 1000글자를 입력받을 경우, 버퍼가 없다면

1글자 읽기

▼

또 읽기

▼

또 읽기

▼

...

계속 시스템 호출(System Call)이 발생한다. 하지만 버퍼가 있다면

1000글자

▼

한 번에 메모리에 저장

▼

필요할 때 하나씩 사용

위와 같이 입력횟수를 줄일 수 있다.


BufferedReader

System.in

▼

InputStream

▼

InputStreamReader

▼

BufferedReader
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
클래스 역할
InputStream 바이트 입력
InputStreamReader 바이트를 문자로 변환
BufferedReader 버퍼를 이용해서 빠르게 읽음

 


Scanner도 내부적으로 Buffer를 사용한다, 하지만 느리다

많은 사람들이 오해하는 부분이 있다. "Scanner는 버퍼를 사용하지 않는다." 사실은 아니다. Scanner도 내부적으로 버퍼를 사용한다.하지만 Scanner는 단순히 읽기만 하는 것이 아니라 추가적인 작업들을 수행한다. 예를 들어 아래와 같이 호출을 하게 되면 여러가지 과정을 거치게 된다. 입력을 읽는 것뿐 아니라 파싱작업까지 하게된다. 그래서 느리다.

Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
  • 문자열 읽기
  • 공백 기준 분리
  • 숫자인지 검사
  • int 변환

BufferedReader는 왜 빠를까?

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String temp = br.readLine();
		
		System.out.println(temp);
	}

문자열 읽기 하나만 한다. 다른것은 하지 않는다. 숫자인지 확인하지 않고, 공백인지 확인하지 않는다. 그래서 빠르다.


Scanner 와 BufferedReader 결론

Scanner가 느린이유는 아래와 같은 여러가지 역할을 가짐

  • 공백기준 분리
  • 타입검사
  • 문자열 변환
  • 예외처리

BufferedReader가 빠른 이유는 단순히 읽기만 함

  • 입력받은 값을 그대로 읽는다.

참고

https://velog.io/@duck-ach/23.-%EC%9E%85%EC%B6%9C%EB%A0%A5-%EC%8A%A4%ED%8A%B8%EB%A6%BC-InputStream-OutputStream-JAVA

 

23. 입출력 스트림 (InputStream, OutputStream) [ JAVA ]

스트림(Stream) > 스트림(Stream) 이란, '데이터의 흐름'을 의미한다. 프로그램은 외부에서 데이터를 읽거나 외부로 데이터를 출력하는 작업이 빈번하게 일어나는데, 이때 데이터는 어떠한 통로를 통

velog.io

https://sy99.tistory.com/20

 

InputStreamReader

이번 포스팅에서는 Java에서의 입력방법 중 하나인 InputStreamReader에 대해 얘기해볼 것이다. 2) InputStreamReader : 문자 단위로 읽어 들인다. 저번 포스팅에서 InputStream 클래스는 출력되는 값이 아스키

sy99.tistory.com

 

'Java > 정리' 카테고리의 다른 글

자바의 동적 바인딩(Dynamic Binding)과 정적 바인딩(Static Binding)  (0) 2026.07.29
StringTokenizer의 사용  (0) 2026.07.28
자바에서 int[] ↔ List<Integer> 변환 (for문은 이제 그만...)  (0) 2025.12.08
오름차순 정렬과 내림차순 정렬에 대해 알아보자  (0) 2025.12.05
ArrayList가 처음이라면 꼭 알아야 할 핵심 기능  (0) 2025.12.04
'Java/정리' 카테고리의 다른 글
  • 자바의 동적 바인딩(Dynamic Binding)과 정적 바인딩(Static Binding)
  • StringTokenizer의 사용
  • 자바에서 int[] ↔ List<Integer> 변환 (for문은 이제 그만...)
  • 오름차순 정렬과 내림차순 정렬에 대해 알아보자
나는지토
나는지토
  • 나는지토
    안녕은헬로입니다.
    나는지토
  • 전체
    오늘
    어제
    • 분류 전체보기 (32)
      • Java (8)
        • 정리 (7)
        • 코테 (1)
      • NestJS (19)
        • 개발 (9)
        • 개념과 구조 정리 (10)
      • Python (1)
        • 코테 (1)
      • Backend Design (1)
      • PostgreSQL (2)
      • Docker (1)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    커서기반 조회
    자료구조
    JWT
    인증 가드
    nestjs/jwt
    코딩테스트
    PostgreSQL
    채팅
    Collections
    ArrayList
    Java
    컨트롤러
    nestjs
    토큰 검사
    BullMQ
    Redis
    서비스
    역할 검사
    조회 방식
    db 연결 오류
  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
나는지토
Java 문자열 입력 처리 - Scanner와 BufferedReader
상단으로

티스토리툴바