일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 완전이진트리
- 그래프
- JAVA_HOME
- 이분그래프
- 알고리즘
- 웹개발
- 도커
- 순회
- dfs
- 이진트리
- 백준
- 프로그래머스
- BFS
- 포화이진트리
- Bottom Up
- 바인딩
- 1707
- n진법게임
- DynamicProgramming
- 전공자따라잡기
- Java
- 자바
- 피보나치
- 동적계획법
- 9093
- 11724
- 링킹
- 연결요소
- 포스트오더
- 인오더
- Today
- Total
물음표 살인마
[백준1000] A+B : Scanner와 BufferedReader의 차이 본문
안녕하세요
오늘은 백준 1000번을 풀다 알게된 PS에서 Scanner을 쓰면 안되는 이유에 대해 글을 써봅니다.
너무 심심한 주말, 알고리즘 알못인 저는 무작정 백준에 들어가 쉬운 문제부터 풀어보기로 합니다.
A+B???
오잉? 이건 너무 쉬운 거 아닌가?
그리고 처음 자바를 배웠던 때를 떠올리며 Scanner을 사용해 아래의 코드를 작성합니다.
package mathematics;
import java.util.Scanner;
public class Baekjoon1000 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
System.out.println(a + b);
sc.close();
}
}
테스트 케이스를 모두 통과한 후 뿌듯뿌듯 *^w^*하며 다른 사람들은 어떻게 썼나~ 둘러보니
다들 저와 정답이 다르더라구요....? 나보다 메모리랑 시간도...적게 썼네....?
약간씩 코드가 다르지만, 공통적을 InputStreamReader와 BufferedReader을 쓰고 있는 것을 발견합니다.
package mathematics;
import java.io.*;
import java.util.*;
public class Baekjoon1000 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
System.out.println(a + b);
}
}
결론은 Scanner가 더 사용하기 편리한 최신 기술이지만,
PS에서는 속도의 차이로 BufferedReader 클래스를 사용하는 게 좋다는 것입니다.
BufferedReader에 대해 알아보기 전에, InputStreamReader에 대해 알아보겠습니다.
InputStreamReader은 바이트 스트림을 캐릭터 스트림으로 바꿔주는 브릿지입니다.
InputStreamReader ir = new InputStreamReader(System.in);
위와 같이 생성해주면 Sytsem 클래스로 들어오는 byte Stream을 character Stream으로 바꿔줍니다.
그럼 여기서 생성된 Character Stream을 BufferedReader에 넣어 BufferedReader을 생성해줍니다.
BufferedReader br = new BufferedReader(ir);
BufferedReader 클래스는 캐릭터 인풋 스트림에서 텍스트를 읽어오고, 버퍼링 해주어 캐릭터, 배열, 라인들을 효율적으로 읽을 수 있게 도와줍니다.
생성자에서 버퍼크기를 설정해줄 수 있지만, 설정하지 않는다면 디폴트 사이즈의 버퍼가 생성됩니다.
백준 1000번 문제에선 버퍼리더의 readLine()메소드를 통해 읽어온 라인을, StringTokenizer로 잘라 반환하면 됩니다.
(StringTokenizer와 split의 차이점에 대해서도 찾아보시면 좋을 것 같습니다.)
그럼 Scanner와 BufferedReader의 차이점은 뭘까요?
1. 위치
Scanner은 java.util에 위치하고 있으며, BufferedReader은 java.io에 위치하고 있습니다.
2. 버퍼의 사이즈
Scanner의 버퍼 사이즈는 1KB(1024byte), BufferdReader의 버퍼 사이즈는 8KB(8192byte)입니다.
3. 데이터 파싱
Scanner의 경우 데이터를 파싱해 원하는 타입으로 가져올 수 있지만
BufferdReader은 데이터를 파싱하지 않고 String으로만 읽고 저장해 형변환이 필요합니다.
4. 예외처리
Scanner은 I/O Exception을 숨기고, BufferdReader은 I/O Exeption을 던집니다.
5. 동기화
Scanner은 동기화 되지 않지만, BufferedReader은 동기화 됩니다.
즉, 멀티 쓰레드 환경에서는 BufferdReader 사용이 적절합니다.
'개발지식 > Algorithm' 카테고리의 다른 글
[백준10845] 큐(queue)란? 자바로 큐 구현하기 (0) | 2022.08.22 |
---|---|
[백준9093] 단어뒤집기 세가지 방법으로 풀어보기 (0) | 2022.08.16 |
[백준10828] 스택(stack)이란? 자바로 스택 구현하기 (0) | 2022.08.16 |
알고리즘 기초 (0) | 2022.08.15 |
[DP] 피보나치 수열을 이용해 동적프로그래밍(Dynamic Programming) 이해하기 (0) | 2021.10.12 |