코딩테스트 BufferedReader, StringTokenizer 클래스에 대한 이해

초월차선·2023년 7월 3일

Java

목록 보기
13/14
post-thumbnail

코딩테스트를 처음 접하면 Scanner 클래스를 사용해 입력값을 받을 것이다. 그러다 Scanner대신에 BufferedReader와 StringTokenizer 클래스를 만나게 되는데 이들의 차이점과 왜 사용하는지에 대해 알아보자

💻Scanner란?

Scanner 클래스는 primitive type과 문자열을 구문 분석할 수 있는 클래스를 말한다. 예를 들면 숫자나 문자열, 문자 등등을 분석할 수 있게 도와주는 클래스라는 것이다.

💻그러면 Scanner는 어떻게 사용하는 것인가?

Scanner sc=new Scanner(System.in);

보통 이런식으로 선언하는데, System.in은 Java자체가 가지고 있는System클래스 중 in을 말한다. 즉 System.in은 '입력데이터를 받을 상태를 만든다'는 의미이다. 키보드입력이나 다른 입력을 받아들일 준비를 한다고 이해하면 좋을 것 같다. 아래는 Java Documentation의 System.in영어 정의이다.

The "standard" input stream. This stream is already open and ready to supply input data. Typically this stream corresponds to keyboard input or another input source specified by the host environment or user.

어떤식으로 많이 사용하는지 아래의 코드를 보자.

Scanner sc=new Scanner(System.in);
int a=sc.nextInt(); //입력받은 int형 숫자를 a라는 변수에 저장
String b=sc.next(); //입력받은 String형 문자열을 b라는 변수에 저장
long c=sc.nextlong(); //입력받은 long형 숫자를 c라는 변수에 저장

이렇게 Scanner클래스 만으로 입력된 숫자, 문자를 변수에 저장할 수 있다.

💻Scanner클래스 대신에 BufferedReader를 사용하는 이유는?

코딩테스트 문제를 풀다보면 시간제한이라는 것이 존재한다. 1초 많게는 10초까지 제한시간을 주는데, Scanner클래스를 사용하면 이 제한시간안에 수행을 못하는 문제가 발생하기 때문에 BufferedReader라는 클래스를 사용하는 것이다. 즉 Scanner클래스가 BufferedReader클래스 보다 수행 속도가 느리다.

❓ 왜 속도차이가 날까?

Scanner는 입력 즉시, 프로그램에 전송이 되고, BufferdReader는 Reader클래스의 하위 클래스인데, Buffer를 사용해서 입력을 받아서 그렇다. 개행문자나 버퍼가 가득차면 전송되도록 되어있다. 이정도 간단하게만 알아두도록 하자.

💻BufferedReader 클래스 사용법:

		BufferedReader br=new BufferedReader(new inputStreamReader(System.in));
		String a = br.readLine(); //한줄을 읽어 a변수에 넣어줌
        int b = Integer.parseInt(br.readLine()); //한줄을 읽어 숫자로 파싱하여 b변수에 넣어줌
        System.out.println(str);
        System.out.println(num);

inputStreamReader클래스가 갑자기 왜 나왔나 의아할 수 있다. inputStreamReader는 char단위로 문자를 받아들이겠다는 의미로 보면된다. 그러면 첫번째 문장을 해석해보자.
'System.in키보드 등으로 사용자에게 입력값을 받을 건데, (inputStreamReader) char단위로 받을 거야, (BufferedReader) 그리고 Buffer단위로 전송을 할거야.' 라고 이해하면 될 것 같다. 더 자세한 내용은 java api문서를 참고하도록 하자.
여기까지 이해가 되었다면 BufferedReader와 함께 많이 사용하는 Token단위로 분리해주는 StringTokenizer클래스에 대해 알아보자.

💻StringTokenizer 클래스 사용법:

StringTokenizer 클래스는 지정된 구분자로(-, 공백 등을 말함) token을 나누어주는 클래스로 보면된다. 예를 들어보자면 i am monkey 에서 구분자는 띄어쓰기 token은 i, am, monkey인것이다. 실제로 어떻게 사용하는지 보도록 하자.

		BufferedReader br=new BufferedReader(new inputStreamReader(System.in));
        StringTokenizer st=new StringTokenizer(br.readLine()); //읽어들인 한줄을 구분자로 분리할 준비를 한다.
        //구분자가 없으면 띄어쓰기가 구분자이다.
        String b=st.nextToken(); //첫번째 token을 b라는 변수에 저장한다.

오늘 Scanner, BufferedReader, StringTokenizer에 대해 알아보았다. 주니어 개발자라 부족하지만 꾸준히 정리해 보도록 하겠다.

😀부족하거나 잘못된 부분있으면 댓글로 교정 부탁드립니다~

0개의 댓글