-
(JAVA / 자바) Scanner 와 Bufferedreader언어 공부/자바 공부 2022. 1. 23. 14:25
안녕하세요~ 코딩하는 코알못 코메인입니다.
이번엔 백준 문제 풀면서 계속 언급될 scanner와 bufferedreader에 대한 간단한 정리를 해볼거다.
자바에서 입력은 scanner와 bufferedreader가 있다.
우선 각자의 특성과 장점, 단점을 보자면
-scanner-
▶ java.util.Scanner 클래스
▶ 데이터 형을 받기 편하다.(문자열로 받는건 같지만 입력하면서 바로 형변환이 일어난다.)
▶ 입력값의 경계로 공백, 엔터 모두 인식이 가능하다.
▶ IOException을 숨긴다.
▶ 동기화 되지 않는다.
▶ buffer 사이즈 1024
-bufferedreader-
▶ Java.io.BufferedReader 클래스
▶ 데이터가 문자열로 먼저 저장되기 때문에 형변환 필수
▶입력값이 엔터만 인식하기때문에 한 라인에 여러가지 입력하고 싶으면 stringtokenize 필수
(stringtokenize없이 입력하면 공백을 문자열로 인식)
▶IOException을 던져야 한다.(throws)
▶입력과 동시에 동기화 된다.
▶ buffer 사이즈 8192
얼핏보면 bufferedreader가 더 좋아보이지 않는다. 하지만 이 두 방식의 큰 차이는 속도의 차이가 있는데 이 차이가 장 단점을 다 뒤집을 만큼의 큰 차이다.
일단 직관적으로 속도 차이를 볼 수 있는 자료를 하나 보여주겠다.
누가 봐도 확실한 속도 차이가 존재한다.
그럼 이제 여기서 왜 bufferedreader가 빠른가를 확인해보겠다.
bufferedreader는 기존의 inputstreamreader에 버퍼링이 추가된 class이다.
기존의 inputstreamreader는 문자열을 한글자씩 읽어왔었지만 여기에 buffer를 추가하므로써 문자열을 한번에 저장하고 필요할 때 꺼내 올 수 있게 되었다.
읽을면서 출력해야하는 것보단 일단 저장하고 필요할때 출력만 하면 되기 때문에 속도가 빨라지고 부하가 적다.
이제 마지막으로 직접 코드를 만들어보자.
-scanner-
import java.util.Scanner; public class scanner { //IOException을 던질 필요 없음 public static void main(String[] args) { Scanner sc = new Scanner(System.in); //형 변환을 따로 안해줘도 알아서 int형으로 저장된다. //변수 형태를 double로하고 싶으면 sc.nextDouble();로 하면 된다. int N = sc.nextInt(); System.out.println(N); } }
-bufferedreader-
import java.io.IOException; import java.io.InputStreamReader; import java.io.BufferedReader; public class bufferedreader { //IOException을 던져야함 public static void main(String[] args) throws IOException{ //bufferedreader는 설명에서처럼 inputstreamreader에 buffer를 추가하는 것이기 떄문에 //inputstreamreader를 받아와야한다. BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); //bufferedreader는 무조건 우선 문자열로 저장하기 때문에 다른 형으로 저장하고 싶으면 형 변환을 해줘야한다. int N = Integer.parseInt(br.readLine()); //문자열로 저장할거면 형변환 없이 그냥 저장하면 된다. String S = br.readLine(); System.out.println(N); System.out.println(S); } }
기본적으로 이렇게 사용하면 된다. 하지만 위에서 말했 듯 bufferedreader는 엔터만 받기 때문에 문자열이 아닌 정수형이나 실수 형에 저장할 때는 각자 라인마다 변수를 지정해주고 입력 받아야한다. 만약 한 줄에 정수 또는 실수 형 변수를 두개 받고 싶으면 꼭 stringtokenize를 사용해야한다. 없이 그냥 공백 주고 입력하면 이렇게 컴파일 오류가 뜬다.
-bufferedreader / stringtokenizer-
import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; import java.io.BufferedReader; public class bufferedreader { public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); //StringTokenizer에 토큰으로 문자열을 나눠 저장했으니 변수에 넣을때는 형변환을 해줘야한다. int N = Integer.parseInt(st.nextToken()); int N2 = Integer.parseInt(st.nextToken()); System.out.println(N); System.out.println(N2); } }
오류 없이 잘 출력되는 것을 볼 수 있다.
이렇게 BufferedReader와 Scanner를 간략하게 알아봤습니다.
혹시 보시다가 잘못된 부분이 있다면 가감없이 댓글로 알려주시면 참고 후 수정 하겠습니다~
감사합니다~
'언어 공부 > 자바 공부' 카테고리의 다른 글
(JAVA / 자바) 추상클래스(abstract) (0) 2022.06.25 (JAVA / 자바) EOF 에러 해결 방법 (0) 2022.02.19