본문 바로가기
Application/Java

[Jump2Java] 06장 입출력 01

by 윤루트 2021. 9. 15.

Jump2Java 05장. 객체지향 프로그래밍

- 콘솔 입력

    - InputStream

    - InputStreamReader

    - BufferedReader

- Scanner

 

콘솔 입력

import java.io.InputStream;

public class StreamTest {
    public static void main(String[] args) throws Exception {
        InputStream in = System.in;

        int a;
        a = in.read();

        System.out.println(a);
    }
}

/*
(입력)
abc

(출력)
97
*/
  • 자바 내장 클래스 중 java.lang 패키지에 속해있지 않은 클래스를 사용하기 위해서 import 해야한다.
    • InputStream은 자바의 내장 클래스이므로 import 해준다.
  • System.in은 InputStream의 객체이다.
  • InputStream의 read 메소드는 1 byte의 사용자의 입력을 받아들인다.
  • 그렇기 때문에 "a"를 입력해도 "abc"를 입력해도 결과는 동일하게 97(a의 아스키코드)이 출력된다.
  • throws Exception: InputStream으로 부터 값을 읽어들일 때는 IOException이 발생할 수 있기 때문에 예외처리를 해야 하는데 throws로 그 예외처리를 뒤로 미루게 한 것이다.
import java.io.InputStream;

public class StreamTest {
    public static void main(String[] args) throws Exception {
        InputStream in = System.in;

        byte[] a = new byte[3];
        in.read(a);

        System.out.println(a[0]);
        System.out.println(a[1]);
        System.out.println(a[2]);
    }
}

/*
(입력)
abc

(출력)
97
98
99
*/
  • 크기를 지정한 byte 배열을 만든 후 read 메소드를 호출하면 입력이 배열에 저장된다.
  • 하지만 역시 아스키코드 값으로 해석되고 문자열 형식으로 출력하지 못한다.
  • 바이트 대신 문자로 입력 스트림을 읽으려면 InputStreamReader를 사용하면 된다.
import java.io.InputStream;
import java.io.InputStreamReader;

public class StreamTest {
    public static void main(String[] args) throws Exception {
        InputStream in = System.in;
        InputStreamReader reader = new InputStreamReader(in);
        char[] a = new char[3];
        reader.read(a);

        System.out.println(a);
    }
}

/*
(입력)
abc

(출력)
abc
*/
  • import 문을 하나 더 추가하고 객체를 생성할 때 생성자의 입력 값으로 InputStream 객체(in)가 필요하다.
  • char 배열에 입력한 문자가 들어간다. 하지만, 미리 크기를 결정해야 한다.
  • 입력한대로 저장하기 위해서 BufferedReader을 사용하면 된다.
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

public class StreamTest {
    public static void main(String[] args) throws Exception {
        InputStream in = System.in;
        InputStreamReader reader = new InputStreamReader(in);
        BufferedReader br = new BufferedReader(reader);

        String a = br.readLine();
        System.out.println(a);
    }
}

/*
(입력)
Hello World!

(출력)
Hello World!
*/
  • import 문을 하나 더 추가하고 객체를 생성할 때 생성자의 입력 값으로 InputStreamReader의 객체(reader)가 필요하다.
  • BufferedReader의 readLine 메소드를 이용하면 사용자가 엔터키를 입력할 때까지 입력한 문자열 전부를 읽는다.

정리하면 다음과 같다.

  • InputStream - byte
  • InputStreamReader - character
  • BufferedReader - String

Scanner

  • Scanner를 사용하면 보다 편리하게 입력을 받을 수 있다.
import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
				String str = sc.next();
        String str2 = sc.nextLine();
        System.out.println(str);
        System.out.println(str2);
    }
}

/*
(입력)
Hello World 12345 123

(출력)
Hello
 World 12345 123
*/
  • Scanner 클래스는 생성자의 입력으로 System.in, 즉 콘솔입력인 InputStream 을 필요로 한다.
  • Scanner 객체의 next() 메소드는 단어 하나(Token)를 읽어들인다.
  • nextLine() 메소드는 하나의 라인(줄바꿈, 즉, 엔터)을 읽어들인다.
    • next() 를 저장한 str 은 Hello를 저장했고 그 이후부터 전부 str2에 저장된 것이다.
  • nextInt() 메소드는 다음 입력되는 정수를 읽어들인다.

댓글