솔솔
[Java] Scanner vs BufferedReader 차이점 본문
반응형
🍀 Scanner
특징
- 다양한 타입(int, double, String 등)으로 직접 변환 가능
- 공백(띄어쓰기, 개행) 기준으로 자동 구분하여 입력 처리
- 내부적으로 정규 표현식을 사용하기 때문에 다소 느림
사용법
import java.util.Scanner;
public class Input {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str_input = sc.next(); // 문자열 입력 받기
int int_input = sc.nextInt(); // 정수 입력 받기
double double_input = sc.nextDouble(); // 실수 입력 받기
sc.close();
}
}
🍀 BufferedReader
특징
- 버퍼링 기반의 입력 도구
- 입력 속도가 빠름 (대량의 데이터 처리할 때 유리)
- 입력값이 항상 문자열(String)으로 반환되므로, 타입 변환을 직접 해야 함
- readLine()은 한 줄만 읽기 때문에 공백을 포함한 여러 개의 값을 받을 때 직접 split()을 사용해야 함
사용법
import java.io.BufferedReader;
import java.io.IOExceiption;
import java.io.InputStreamReader;
public class Input {
public static void main(String[] args) {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str_input = br.readLine(); // 한 줄 입력 받기
int int_input = Integer.parseInt(br.readLine()); // 문자열을 정수로 변환
double double_input = Double.parseDouble(br.readLine()); // 문자열을 실수로 변환
}
}
🍀 Scanner vs BufferedReader 속도 테스트
* 100000개의 수작가 들어가 있는 txt파일을 만들어 테스트를 진행하였다.
1. Scanner
public class SpeedTest {
public static void main(String[] args) throws IOException {
Scanner scanner = new Scanner(new File("input.txt"));
long startTime = System.nanoTime(); // 시작 시간 측정
int N = scanner.nextInt();
for (int i = 0; i < N; i++) {
int num = scanner.nextInt(); // 숫자 하나씩 읽기
}
long endTime = System.nanoTime(); // 종료 시간 측정
System.out.println("Scanner 실행 시간: " + (endTime - startTime) / 1_000_000.0 + " ms");
scanner.close();
}
}
2. BufferedReader
public class SpeedTest {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("input.txt"));
long startTime = System.nanoTime(); // 시작 시간 측정
int N = Integer.parseInt(br.readLine()); // 첫 줄 읽기
String[] numbers = br.readLine().split(" "); // 한 줄 읽고 공백 기준으로 분리
for (String num : numbers) {
int value = Integer.parseInt(num); // 숫자로 변환
}
long endTime = System.nanoTime(); // 종료 시간 측정
System.out.println("BufferedReader 실행 시간: " + (endTime - startTime) / 1_000_000.0 + " ms");
br.close();
}
}
🤔 실행 결과 비교
테스트 방식 | 실행 시간 (100,000개 정수 입력) |
Scanner | 약 71ms |
BufferedReader | 약 23ms |
BufferedReader 가 Scanner 보다 3배 빠르다는것을 알 수 있었음
🍀 Scanner vs BufferedReader 차이점
비교 항목 | Scanner | BufferedReaderr |
속도 | 상대적으로 느림 | 빠름 (버퍼링 처리) |
입력방식 | 정수, 실수, 문자열 등 다양한 타입 입력 가능 | 한 줄(String) 단위 입력 |
입력 처리량 | 적은 양의 데이터에 적합 | 많은 데이터 처리에 적합 |
메서드 | nextInt(), nextDouble(), nextLine() 등 다양한 메서드 제공 | readLine() (String 반환) |
예외 처리 | 예외 처리 불필요 | IOException 필요 |
공백처리 | 자동으로 공백을 기준으로 토큰 분리 | split()을 직접 사용해야 함 |
🤔 결론
데이터가 많을 때는 BufferdReader가 좋다
'나의보물들 > Java' 카테고리의 다른 글
[Java] Lombok이란? (0) | 2024.08.04 |
---|---|
[Java] JDBC란? (0) | 2024.07.31 |
[Java] MVC (Model-View-Controller) 패턴에서의 예외처리 (3) | 2024.07.27 |
Java에서 Stream을 활용하여 정수 데이터를 처리할 때 왜 반환 타입이 다를까? (0) | 2024.07.15 |
[Java] ConcurrentModificationException 에러 (0) | 2024.07.13 |