입력받는 방식
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가 빠른 이유는 단순히 읽기만 함
- 입력받은 값을 그대로 읽는다.
참고
23. 입출력 스트림 (InputStream, OutputStream) [ JAVA ]
스트림(Stream) > 스트림(Stream) 이란, '데이터의 흐름'을 의미한다. 프로그램은 외부에서 데이터를 읽거나 외부로 데이터를 출력하는 작업이 빈번하게 일어나는데, 이때 데이터는 어떠한 통로를 통
velog.io
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 |
