정리 이유
백준이나 softeer 문제들을 풀다가 문득 둘의 속도 차이나, 처리 방법등도 알고리즘 문제에 있어서 영향을 얼마나 미칠지 궁금해져서 정리를 하게되었다.
Scanner란?
Scanner 클래스는 입력받은 데이터(바이트)를 다양한 타입으로 변환하여 반환하는 클래스이다.
정수, 실수, 문자열 등을 값으로 받을 수 있다.
Scanner 특징?
- java.util 클래스에 위치
- 버퍼 사이즈 1024byte (1kb) 이다.
- 공백, 개행 등을 기준으로 값을 읽는다
ex) \r, \n, \t ,' '
- 원하는 타입으로 변환해서 반환할 수 있다.
ex) nextInt(), nextDouble(), nextBigInteger() 등...
- Unchecked(Runtime) Exception
=> I/O Exception을 따로 처리하지 않아도 된다.
- 데이터를 입력받는 즉시 사용자에게 전달되며, 데이터 이동에 많은 시간이 발생한다.
- Thread unsafety 성질을 가진다.
=> 멀티쓰레드에서 안정적이지 않음
BufferReader란?
데이터를 한번에 읽어와 버퍼에 보관한 후 버퍼에서 데이터를 읽어오는 방식으로 동작하는 클래스이다.
즉 사용자가 입력한 문자 스트림(Stream)을 읽는 것(read) 이라 한다.
* Buffer란?
데이터를 다른 곳으로 전달하기 전에 임시적으로 보관하는 임시 메모리 영역.
버퍼가 가득 찬 경우 데이터 전달
BufferReader 특징
- java.io 클래스에 속한다.
- 개행만 종료값으로 인식
- 데이터를 파싱하지 않고 String으로 값을 가져온다.
=> 원하는 타입에 따라 형변환, 가공이 필요하다.
- 버퍼 사이즈가 8192 char(16,384byte)
- Checked Exception
=> 별도의 Exception 처리가 필요하다
- Thread safety 성질을 가진다
=> 멀티쓰레드에서 안정적인 성능을 가진다.
- Buffer가 가득 차거나, 개행문자가 발생하면 버퍼를 한번에 전달하기 때문에 Scanner보다 처리 속도가 빠르다.
Scanner 사용법
// java.util 클래스 import
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// Scanner 객체 생성
Scanner sc = new Scanner(System.in);
// 값 읽기
sc.nextLine();
// Scanner 객체 종료
sc.close();
}
}
- System.in 이란?
사용자로부터 값을 입력받기 위한 스트림
- 코드상에 별도의 Exception 처리를 하지 않아도 됨
BufferReader 사용법
// java.io 클래스 import
import java.io.BufferedReader;
import java.io.InputStreamReader;
// 별도의 예외 처리 필요
import java.io.IOException;
public class Main {
public static void main(String[] args) {
// BufferReader 객체 생성
BufferReader br = new BufferedReader(InputStreamReader(System.in));
// 값 읽기
String n = br.readLine();
// 사용을 위한 형변환
int a = Integer.parseInt(br.readLine());
int b = Integer.parseInt(n);
}
}
결론
1. Scanner 는 형변환이나 가공을 할 필요가 없기때문에 사용성이 조금 더 편리했다.
2. BufferReader는 입력받을 수 있는 버퍼의 크기가 크다보니, Scanner보다 처리 속도가 뛰어났다.
3. Thread unsafety, Thread safety 의 직접적인 차이는 없지만 추후에 해당방식을 알고 명확하게 구분해야 할 이유가 생겼다.
'BE > Java' 카테고리의 다른 글
| Springboot3 + Swagger + Jwt (1) (0) | 2024.06.20 |
|---|---|
| JWT(Json Web Token) 이란? (1) | 2024.06.11 |
| Stack 이란? (0) | 2024.02.13 |
| Queue 란? (0) | 2024.02.13 |
| Springboot에서 ServletInitializer를 상속받아야 하는 이유? (0) | 2024.01.16 |