본문 바로가기
Java

자바 Scanner 대신 bufferedReader를 사용하는 이유 ( BufferedWriter, StringTokenizer 사용법)

by 오늘이 내가 된다. 2022. 1. 10.

Scanner 사용법

import java.util.Scanner;

public class ScannerExam {
	public static void main(String[] args)  {
          Scanner sn = new Scanner(System.in);
          String str = sn.nextLine();
          int num = sn.nextInt();
          System.out.println(str);
          System.out.println(num);
          sn.close();
	}

}
더보기
입력/출력
입출력

scan.close();

scan을 다 사용했다면 close()를 통해 닫아주어야 한다.

의도하지 않는 입력을 방지해 주기 때문이다.

 

 

bufferedReader 사용법

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class BufferedExam {
      public static void main(String[] args) throws IOException  {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str = br.readLine();
        int num = Integer.parseInt(br.readLine());
        System.out.println(str);
        System.out.println(num);
      }
}

입출력은 위와 동일

BufferedReader의 경우 사용하기 번거롭다.

 

import java.io.BufferedReader;
import java.io.InputStreamReader;

위 2가지를 import해주어야 한다.

 

그리고 예외 처리를 해주어야 한다.

대부분의 예외처리는 throws를 통해서 해주는데,

public static void main(String[] args) throws IOException

메인 문 옆에 작성해주고, import java.io.IOException;를 import해주면 된다.

 

또 Scanner와 다른점은 BufferedReader는 String(문자열)만 입력 받을 수 있다.

따라서 int값을 할당받고 싶다면, int num = Integer.parseInt(br.readLine());

이 처럼 형 변환을 해주어야 한다.

더보기

BufferedReader 의 경우 close() 메소드를 명시해주지 않아도 Garbage Collector에 의해 BufferedReader 및 내부의 객체들이 자동으로 정리. 즉 BufferedReader의 경우, close()를 콜해주지 않아도 문제는 없다.

 

그렇다면 더 많은 수고를 하는,

BufferedReader를 쓰는 이유는 무엇일까?

버퍼(buffer)

  • 데이터를 한 곳에서 다른 한 곳으로 전송하는 동안 일시적으로 데이터를 보관하는 임시 메모리 영역
  • 버퍼를 사용하면 입출력 속도 향상

 

BufferedWriter 사용법

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class BufferedExam {

    public static void main(String[] args) throws IOException  {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        String str = br.readLine();
        int num = Integer.parseInt(br.readLine());
        bw.write(str);
        bw.write(num);

        bw.flush();
        bw.close();
    }
}

우선 출력의 경우 System.out.println; 을 사용하였다.

BufferedWriter의 경우에도 기존의 출력보다 좋은 성능을 지니고 있다.

 

버퍼를 사용한 이후에는 flush()를 통해 버퍼에 남아있는 데이터를 모두 출력하고,

Scan.close(); 처럼 bw.close();를 통해 스트림을 닫아준다.

 

하지만 BufferedWriter의 경우 다른 문제를 발생한다.

정수형 자료를 출력하기 위해 2022를 넣었을 때는 값이 출력되지 않았고,

65를 넣었을 때는 A가 출력되었다.

즉, 정수형 자료를 출력하려고 했더니 아스키코드 값이 출력된다.

 

따라서 숫자 그대로 출력을 하기 위해서는 문자열로 형변환을 해주어야 한다.

 

방법

  1. bw.write(String.valueOf(num));을 통해 String 타입 변환
  2. bw.write(num+"");

BufferedWriter의 경우 따로 개행을 해주지 않기 때문에 필요하다면 직접 개행코드를 입력해야 한다.

bw.newLine();을 통해 개행을 해줄 수도 있지만,

bw.write(num+"\n") 을 통해 개행과 문자열 형변환도 가능하다.

 

 

StringTokenizer 사용법

지정한 구분자로 문자열을 나누어주는 클래스

나눠준 문자열은 더 이상 나눌 수 없는 요소 Token

 

전화번호로 예를 들면, 010-1234-5678 이라는 번호에서

- 는 구분자를 뜻 하는 것이고 010, 1234, 5678 은 Token(토큰) 이다.

 

StringTokenizer의 경우 구분자를 설정하지 않는다면 기본 delim을 사용하여 분리한다.

(delim = \n , \f , \r , \f ) 공백을 기본으로 인식한다.

 

 

빠른 입출력 문제 풀어보기

자세한 내용(Stranger's lab 님 블로그)

댓글