Java 로 백준 알고리즘 풀면서, 처음 풀때부터 차이를 정리하고 가고 싶었으나
이제야 정리하게 됐습니다!
둘의 차이가 몰까요
- 실행시간 차이
- 효율적인 코드 작성
Scanner 란?
- Scanner 클래스는 입력받은 데이터(바이트)를 다양한 타입으로 변환하여 반환하는 클래스입니다.
- 간단하게 기본형과 String 타입을 정규표현식을 사용해 파싱(parse)할 수 있습니다.
Scanner 의 특징
- java.util 패키지에 속한다. (import java.util.Scanner)
- **공백(띄어쓰기) 및 개행(줄 바꿈)**을 기준으로 데이터를 읽는다.
- 원하는 타입(int, double, String 등)으로 입력을 받을 수 있다.
- 버퍼의 크기는 1024byte(1KB)이다.
- Unchecked(Runtime) Exception을 사용하므로 별도의 예외 처리를 명시하지 않아도 된다.
- Thread unsafe 하므로 멀티스레드 환경에서 문제 발생 가능성이 있다.
- 데이터를 입력받을 때마다 즉시 사용자에게 전달되므로 입력할 때마다 전송되어 속도가 느린 편이다.
BufferedReader 란 ?
- BufferedReader 클래스는 데이터를 한 번에 읽어와 버퍼에 저장한 후 버퍼에서 데이터를 읽어오는 방식으로 동작합니다.
즉, 사용자가 입력한 문자 스트림을 읽는(read) 클래스입니다.
BufferedReader의 특징
- java.io 패키지에 속합니다. (import java.io.BufferedReader)
- 데이터를 파싱하지 않고 String으로만 읽어옵니다.
- 버퍼의 크기는 8192byte(8KB)입니다.
- Checked Exception을 반드시 처리해야 합니다. (IOException → throws 선언하거나 try/catch로 처리)
- Thread safe 성질을 가지므로 멀티스레드 환경에서도 안전합니다.
- 버퍼가 가득 차거나 개행 문자가 나타나면, 버퍼의 내용을 한 번에 전달하므로 Scanner보다 입력 처리 속도가 빠릅니다.
그럼 이제 각각의 예제를 살펴볼까요?!
Scanner 예제
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 정수 2개 입력받기
int a = sc.nextInt();
int b = sc.nextInt();
// 문자열 1개 입력받기
String s = sc.next();
System.out.println("정수 합: " + (a + b));
System.out.println("입력된 문자열: " + s);
sc.close();
}
}
📌 특징:
- nextInt(), next(), nextDouble() 처럼 원하는 타입으로 직접 입력 가능
- 공백( ), 엔터(\n) 상관없이 값 단위로 잘라서 읽어옴
BufferedReader 예제
import java.io.*;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 한 줄 통째로 입력받기
String line = br.readLine();
System.out.println("입력된 한 줄: " + line);
// 공백으로 구분된 정수 입력 처리
StringTokenizer st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
System.out.println("정수 합: " + (a + b));
}
}
📌 특징:
- readLine() → 한 줄 전체를 문자열로 읽어옴
- 숫자는 Integer.parseInt()로 변환해야 함
- 공백 구분하려면 StringTokenizer나 split()을 사용해야 함
구분 Scanner / BufferedReader
| 패키지 | java.util.Scanner | java.io.BufferedReader |
| 입력 단위 | 공백/개행 기준으로 토큰 단위 입력 가능 | 한 줄 단위로 문자열 입력 |
| 데이터 변환 | nextInt(), nextDouble(), next() 등 → 원하는 타입으로 바로 읽음 | 문자열만 입력 → 숫자는 Integer.parseInt() 같은 파싱 필요 |
| 예외 처리 | Unchecked Exception (Runtime) → 따로 명시 안 해도 됨 | Checked Exception (IOException) → throws나 try-catch 필요 |
| 버퍼 크기 | 1KB (1024byte) | 8KB (8192byte) |
| 속도 | 상대적으로 느림 (입력받을 때마다 처리) | 빠름 (버퍼에 모았다가 한 번에 전달) |
| 멀티스레드 안전성 | Thread-unsafe | Thread-safe |
| 주 사용 용도 | 간단한 입력, 소규모 문제 풀이 | 대용량 입력, 빠른 속도 필요한 문제 (BOJ, 알고리즘 대회 등) |
Scanner vs BufferedReader 사용 시나리오
✅ Scanner를 쓰는 경우
- 코드가 간단해야 할 때
- 입력 크기가 작을 때 (예: 간단한 연습문제, 소규모 콘솔 입력)
- 정수, 실수, 문자열 등 다양한 타입을 바로 받고 싶을 때 (nextInt(), nextDouble() 등)
- 속도보다는 편리함이 중요한 상황
✅ BufferedReader를 쓰는 경우
- 입력 데이터가 많을 때 (예: 알고리즘 문제, 대용량 데이터 처리)
- 속도가 중요한 상황 (특히 온라인 저지, 코딩테스트)
- 문자열을 통째로 읽고 직접 파싱할 수 있을 때 (StringTokenizer 또는 split)
- 예외 처리를 직접 관리할 수 있을 때
👉 정리하면,
- 작은 프로그램/학습용: Scanner
- 알고리즘 문제/대용량 데이터 처리: BufferedReader
곧 대학교 때 봤던 Java 전공 책 다시 한번 보고 공부할 생각입니다.
'Language > JAVA' 카테고리의 다른 글
| [JAVA] 메인메서드 public static void main(String[] args) (0) | 2025.09.24 |
|---|---|
| [Maven] 메이븐 다운로드 및 설정 방법 - Apache Maven (0) | 2024.05.23 |
| [JAVA] 자바 JDK 설치 및 환경 변수 설정 방법 (0) | 2024.01.10 |