[Java-I/O 1] 콘솔 입출력

이용준·2022년 11월 2일
0

Java

목록 보기
21/29

이번에는 콘솔 입출력에 대해 알아보도록 한다.

오늘의 날씨는 어떻습니까? (흐림/맑음/눈/비) : 

이렇게 사용자에게 문자열을 보여주는 것이 콘솔 출력이고 사용자가 답변을 입력하는 것을 콘솔 입력이라 한다.

[순서]
1. 콘솔 입력
  1) InputStream
  2) InputStreamReader
  3) BufferReader
  4) Sacnner
2. 콘솔 출력

1.콘솔 입력

위와 같은 콘솔 출력에 사용자는 흐림, 맑음~ 등의 답변을 입력할 것이다. 이때 입력 받은 값을 콘솔 입력이라하며, 자바 코드에서 문자열을 입력 받기 위해서는 System.in을 사용한다.

아래의 예제를 보도록 하자

import java.io.IOException;
import java.in.InputStream;

public class Sample{
  public static void main(String[] args) throws IOException{
    InputStream in = System.in; 
    
    int a;
    a=in.read();
    
    System.out.println(a);  //ascii 값 리턴
  }
}  

다음 문장에서 알 수 있듯, System.in은 InputStream의 객체임을 알 수 있다.

InputStream in = System.in;

InputStream의 read메소드는 다음처럼 1byte의 사용자 입력을 받아들인다.

int a;
a = in.read();

in.read() 메소드로 읽은 1byte의 데이터는 0-255사이 정수의 아스키 코드값이 저장된다.

IOException
main 메소드에 thorws IOException을 사용한 부분이 있다.이는 InputStream을 통해 값을 읽어올때 IOException이 발생할 수 있어 throws를 통해 예외 처리를 뒤로 미뤄둔 것이다. 자세한 예는 다음 과정에서 알아보도록 한다.

1-1.InputStream

이번에는 "abc"를 입력한 후 결과를 보도록하자.

97

전과 같이 97이 출력된다. 이는 InputStream의 read 메소드는 1byte만 읽기 때문이다. 따라서 "abc" 3 byte를 입력 했음에도 프로그램에서 1byte만 읽은 경우라 할 수 있다. 이렇게 사용자가 전달한 데이터를 다른 말로 스트림(Stream)이라 한다. 스트림은 이어진 데이터(byte)의 형태를 의미한다.

스트림?
수도관 A관에서 B관이 이어져 이동하는 물의 흐름이라 할 수 있다.
프로그래밍에서는 다음과 같은 것들을 스트림이라 할 수 있다.

  • 파일 데이터(파일은 시작-끝이 있는 데이터의 스트림이다.)
  • HTTP 송수신 데이터(브라우저가 요청하고 서버가 응답하는 HTTP 형태의 데이터도 스트림이다.)
  • 키보드 입력 (사용자가 키보드로 입력하는 문자열은 스트림이다.)

만약 사용자가 입력한 3byte를 모두 읽어와야 한다면 어떻게 해야 할까?

  • 방법1. read 반복
int a;
int b;
int c;

a=in.read();
b=in.read();
c=in.read();

위처럼 read 메소드를 3번 실행하도록 수정할 수 있겠지만, 조금 더 개선된 방법을 사용할 수 있다.

  • 방법2. 배열 생성
byte[] a = new byte[3];
in.read(a);

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

3byte 길이 배열을 생성한 후 read 메소드의 입력값으로 전달하면 콘솔 입력이 해당 배열에 저장된다.

1-2.InputStreamReader

읽어 들인 값을 문자값 그대로 출력하기
위 예제를 다음과 같이 변경해보자.

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader; // 추가

public class Sample{
  public static void main(String[] args) thorws IOException{
    InputStream in = System.in;
    InputStreamReader reader = new InputStreamReader(in); // 추가
    char[] a = new char[3];// 변경 byte -> char
    reader.read(a);
    
    System.out.println(a);
  }
}  
  • InputStreamReader 객체 생성시 생성자 입력으로 InputStream이 필요

    InputStreamReader reader = new InputStreamReader(in);
  • byte 대신 char 배열 사용 가능

    char[] a = new char[3];

1-3.BufferedReader

  • 사용자 입력 전부 받아들이기

    import java.io.IOException;
    imoprt 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);
      }
    }  

    읽는 방법은 다음과 같다.InputStream(in) > InputStreamReader(reader(in)) > BufferedReader(bf(reader(in)))

    참고

    • InputStream - byte
    • InputStreamReader - character
    • BufferReader - String

1-4.Scanner

J2SE 5.0부터 Scanner라는 java.util.scanner 클래스가 추가되었다. Scanner 클래스를 이용하면 콘솔입력을 보다 쉽게 처리할 수 있다.

import java.util.Scanner;

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

Scanner 객체의 next() 메소드는 단어 하나(Token)을 읽어들인다.이 외 다양하게 읽어들일 메소드들을 보도록 하자.

  • next - 단어
  • nextLine - 라인
  • nextInt - 정수

2.콘솔 출력

이번에는 콘솔 출력에 대해 알아보자.

  • System.out.println

System.out은 PrintStream 클래스의 객체이다. PrintStream은 콘솔에 값을 출력할 때 사용되는 클래스이다.보통 System.out.println은 콘솔에 문자열을 출력할 경우나 디버깅 시 많이 사용된다.

System.err도 있는데 System.out과 동일한 역할을 한다.다만, System.err는 오류 메시지를 출력할 경우 사용된다.

(...)
    System.out.println("정상 출력");
    System.err.println("오류 출력");
  }
}

Unix 콘솔에서 위 코드를 통해 정상/오류 출력을 별도의 파일로 저장할 수 있다.

java Sample > out.txt 2> err.txt

* 유닉스에서 >는 일반 출력, 2>는 오류 출력에 해당된다.

Sample.class 파일을 생성한 후 위와 같이 실행하면 out.txt 파일에는 "정상 출력", err.txt파일에는 "오류 출력"이 저장된다.

profile
뚝딱뚝딱

0개의 댓글