활동/독서

[Do it! 점프 투 자바] 06.자바의 입출력 (InputStreamReader / BufferedReader / Scanner 클래스)

ByeongJun 2023. 9. 11. 17:57
반응형

* 본 게시물은 이지스퍼블리싱 [Do it! 점프 투 자바] 서평단 미션 수행 및 학습 목적으로 작성하였습니다.
 

  모든 내용, 디자인, 이미지, 편집 구성의 저작권은 이지스퍼블리싱(주)와 지은이에게 있으며

  학습 목적으로 내용을 재구성하여 작성했음을 밝힙니다. 문제시 삭제하도록 하겠습니다.


 

[Do it! 점프 투 자바] 06. 자바의 입출력 (Stream이란? / throws IOException / InputStream in = System.in; )

* 본 게시물은 이지스퍼블리싱 [Do it! 점프 투 자바] 서평단 미션 수행 및 학습 목적으로 작성하였습니다. 모든 내용, 디자인, 이미지, 편집 구성의 저작권은 이지스퍼블리싱(주)와 지은이에게 있

3mmmeee.tistory.com

 

 

InputStreamReader

 

이전 게시물에서 설명했지만, 읽어 들인 값을 항상 아스키 코드 값으로 해석한다면 

불편하기 때문에 byte 대신 문자로 입력 스트림을 읽기 위해 InputStreamReader를 사용한다. 

 

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;                                // ①

public class Sample {
    public static void main(String[] args) throws IOException {
        InputStream in = System.in;
        InputStreamReader reader = new InputStreamReader(in);    // ②
        char[] a = new char[3];                                  // ③
        reader.read(a);

        System.out.println(a);
    }
}

이전 InputStream 코드에서 추가된 내용은 주석으로 숫자를 달아놨으니 참고

  1. InputStreamReader를 사용하기 위해 import문이 하나 더 추가 됐다.
  2. InputStreamReader는 객체를 생성할 때 생성자의 입력으로 InputStream 객체가 필요하다.
     InputStreamReader reader = new InputStreamReader(in); 
  3. InputStreamReader를 이용해 char 배열을 만들었다.
     char[] a = new char[3]; 

 

 

 

 

코드에서 'InputStreamReader'를 사용해 'System.in'에서

byte Stream을 char Stream (문자 스트림)으로 변환한 후 

read(a) 메서드를 호출해 입력 문자를 'a'라는 길이가 3인 문자 배열에 읽어 올 때 

입력한 글자 중 new char[3] 첫 3글자까지만 출력된다. 

 

 

 

 

 

BufferedReader

 

고정된 길이로만 스트림을 읽어야 하는 것에 대한 불편함이 있었다면 

길이에 상관없이 사용자가 입력한 값을 모두 받아들일 수 있는 방법은 

바로 BufferedReader이다.

 

import java.io.IOException;
import java.io.BufferedReader;                                  // ①
import java.io.InputStream;
import java.io.InputStreamReader;

public class Sample {
    public static void main(String[] args) throws IOException {
        InputStream in = System.in;
        InputStreamReader reader = new InputStreamReader(in);   // ②
        BufferedReader br = new BufferedReader(reader);         // ③

        String a = br.readLine();                               // ④
        System.out.println(a);
    }
}
  1. BufferedReader 클래스를 import문 추가한다.
  2. InputStream을 InputStreamReader로 변환한다.
  3. InputStreamReader를 이용해 BufferedReader를 생성한다.
  4. readLine() 메서드를 호출해 사용자가 입력한 한 줄을 읽어온 후 그 값을 'a'라는 문자열 변수에 저장한다.
    readLine()은 Java에서 BufferedReader 클래스에서 제공하는 메서드 중 하나이다.

 

 

 

InputStream in = System.in;                             // byte를 읽는다.
InputStreamReader reader = new InputStreamReader(in);   // character(문자)를 읽는다.
BufferedReader br = new BufferedReader(reader);         // String(문자열)을 읽는다.

교재에는 나와있지 않지만 세 줄의 코들르 한 줄로 작성하는 방법도 있다. 

 

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

 new InputStreamReader(System.in) 

System.in에서 읽은 바이트를 문자로 변환하는 InputStreamReader 객체를 생성하고,

그것을 다시 BufferedReader로 감싸서 텍스트를 효과적으로 읽을 수 있다.

 

 

객체를 각각 만들어 사용해야 한다 VS 객체를 한 줄로 만들어 사용해야 한다.
성능 면에서 볼 때, BufferedReader를 객체로 각각 생성하는 것은 약간의 오버헤드가 발생할 수 있지만, 이것은 대부분 무시할 수 있는 수준의 오버헤드이다. 따라서 코드를 간결하게 유지하고 가독성을 높이기 위해 BufferedReader를 각각 만들어 사용하는 것이 일반적으로 좋은 방법이다. 한 줄로 만들어 사용하면 코드가 더 간결하긴 하지만, 여러 곳에서 동시에 사용하는 경우 동기화 문제가 발생할 수 있으므로 조심해야 한다.

요약 : 성능상의 큰 차이가 없는 한, BufferedReader를 각각 만들어 사용하는 것이 가독성과 유지 보수 측면에서 더 낫다.

 

 

 

 

 

Scanner

 

import java.util.Scanner;

public class Sample {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);  // 콘솔 입력인 InputStream이 필요하다는 의미
        System.out.println(sc.next());
    }
}

J2SE 5.0부터 java.util.Scanner 클래스가 새로 추가 됐는데 

Scanner 클래스를 이용하면 콘솔 입력을 보다 쉽게 처리할 수 있다.

 

Scanner 객체의 next() 메서드는 한 개의 token*을 읽어 들인다. 

 

token*은 공백으로 구분되는 단어, 숫자, 기호 등

정보의 최소 단위로 문법적인 의미가 있는 문자열을 의미한다.

 

Scanner 클래스에는 토큰 뿐만 아니라 nextLine(라인), nextInt(정수) 등

숫자, 문자열 등을 읽어 들일 수 있는 메서드들이 있다.

반응형