728x90
백준에서 알고리즘을 풀기 시작하면서 입력을 받을 때 Scanner와 Bufferedreader를 사용할 수 있는데,
어떤 차이점이 있을까? 하는 생각에 기록하게 됐다.
💻 Scanner와 BufferedReader의 사용법
💡 Scanner 클래스는
입력받은 데이터(바이트)를 다양한 타입으로 변환하여 반환하는 클래스이다. 간단하게 기본형과 String 타입을 정규표현식을 사용해 파싱(parse)할 수 있다.
import java.util.Scanner;
public class Input {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String input = sc.nextLine();
}
}
Scanner 클래스의 특징
- java.util 패키지에 속한다. (java.util.Scanner)
- 공백(띄어쓰기) 및 개행(줄 바꿈)을 기준으로 읽는다.(' ', '\t', '\r', '\n' 등)
- 원하는 타입으로 읽을 수 있다. (sc.next(), sc.nextInt() 등)
- 버퍼의 사이즈가 1024byte(1KB) 이다.
- UnChecked(Runtime) Exception으로 별도로 예외 처리를 명시할 필요가 없다.
- Thread unsafe 성질을 지니기에 멀티스레드 환경에서 문제가 발생할 수 있다.
- 데이터를 입력받을 경우 즉시 사용자에게 전송되며 입력받을 때마다 전송되어야 하기에 많은 시간이 소요된다.
💡 BufferedReader는
데이터를 한번에 읽어와 버퍼에 보관한 후 버퍼에서 데이터를 읽어오는 방식으로 동작하는 클래스이다. 즉 사용자가 입력한 문자 스트림을 읽는 것(read) 라고 한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Input {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input = br.readLine();
}
}
BufferedReader 클래스의 특징
- java.io 패키지에 속한다. (import java.io.BufferedReader)
- 데이터를 파싱하지 않고 String으로만 읽고 가져온다. (br.readLine())
- 버퍼의 사이즈가 8192byte(8KB)이다.
- Checked Exception으로 반드시 예외 처리를 명시해야한다.(I/O Exception을 throw하거나 try/catch 해야한다.)
- Thread safe 성질을 지니기에 멀티스레드 환경에서도 안전하다.
- 버퍼가 가득차거나 개행문자가 나타나면 버퍼의 내용을 한번에 프로그램으로 전달하기에 Scanner보다 소요되는 시간을 절약할 수 있다.
📌 Bufferedreader 와 Scanner 차이점
1. Scanner는 BufferedReader보다 타입에 구애받지 않는다.
- BufferedReader는 String 형식으로만 읽고 저장하기에 형변환을 위한 추가적인 코드 작성이 불가피한 반면에 Scanner는 원하는 타입으로 읽고 파싱할 수 있다.
- Scanner의 경우 int, long, short, float, double의 경우 nextInt(),nextLong(),nextShort(),nextFloat(), nextDouble()과 같은 함수들을 사용할 수 있다.
- 그런데 BufferedReader는 readLine() 함수만을 사용한다.
2. BufferedReader는 Scanner보다 효율적인 메모리 용량을 가진다.
- BufferedReader의 버퍼 메모리가 8KB로 Scanner의 버퍼 메모리 1KB보다 크기에 많은 입력이 있을 경우 더 효율적이다.
- 다만, BufferedReader의 경우 일단 큰 메모리를 잡아먹게 된다.
3. BufferedReader는 Scanner보다 안전하다.
- Scanner는 Thread-unsafe 하기에 멀티스레드 환경에서 안전하지 않지만 BufferedReader는 안전하다.
- 스레드 간 Scanner는 공유할 수 없지만 BufferedReader는 공유할 수 있다.- 동기화를 지원하는 BufferedReader는 싱글스레드인 Scanner보다 약간 느린데, Scanner의 경우 정규식을 사용하여 입력을 받으므로 BufferedReader가 문자열을 더욱 빠르게 입력받을 수 있다.
4. BufferedReader가 Scanner보다 실행 속도가 빠르다.
버퍼리더는 입력 받은 값을 기본적으로 8192 char (16384 byte) 크기의 버퍼에 담아두었다가 한번에 프로그램에 전송한다.
어쩌면 입력받은 즉시 전송하는 Scanner가 더 효율적이라고 생각될 수 있겠지만
버퍼링 없이 전송하는 것은 CPU와의 성능 차이 때문에 버퍼를 사용하는 방식보다 속도에서 비효율적이라고 할 수 있다.
과일을 수확할 때, 하나의 과일을 딸 때마다 창고로 옮겨주는 것과
수확한 과일을 한 수레에 모아 한번에 창고로 옮겨주는 것의 효율 차이를 예로 들 수 있다.
728x90
'🌐 Language > java' 카테고리의 다른 글
[ Java ] 오버로딩(Overloading) & 오버라이딩(Overriding) (0) | 2023.01.03 |
---|---|
[JPA] 연관관계 매핑 @OneToMany @ManyToOne @OneToOne @ManyToOne (0) | 2022.10.10 |
[JPA] JPA(Java Persistence API) (0) | 2022.10.07 |
[ Java ] - JAP 기본적인 CRUD / DB-H2 (2) (0) | 2022.10.04 |
[ Java ] - JAP 환경 설정 / DB-H2 (1) (0) | 2022.10.04 |
댓글