본문 바로가기
Java

[점프 투 자바] 6장 자바의 입출력

by seonggu 2024. 1. 1.
  • 콘솔이란?

환경에 따라 변경될 수 있다.

인텔리제이를 실행했다면 인텔리제이의 콘솔 창이 콘솔이 될 것이고

윈도우 명령 창에 프로그램을 실행했다면 명령 창이 콘솔이 된다.

즉, 콘솔은 사용자의 입력을 받거나 사용자에게 문자열을 출력해 주는 역할을 하는 것을 통칭하는 말이다

 

콘솔입력

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

InputStream은 자바의 내장 클래스이다.

이와 같이 java.lang 패키지에 속해 있지 않은 자바 내장 클래스는 필요할 때마다 import 해서 사용해야한다.

System이나 String 클래스는 java.lang 패키지에 속해있음

 

 

  • InputStream

InputStream은 바이트(byte) 단위의 데이터를 읽어 들일 때 사용하는 내장 클래스이다.

앞서 만든 프로그램을 실행해 이번엔 abc를 연속해서 입력한 후 Enter키를 눌러보자.

a를 입력했을 때와 마찬가지로 97이 출력된다.

 

왜 a에 해당하는 97만 출력이 됐을까?

그 이유는 InputStream의 read메서드는 1byte만 읽기 때문이다.

사용자는 abc 3byte라는 데이터를 전달했지만 이 프로그램에서는 1byte만 읽은 것이다.

 

이렇게 사용자가 전달한 데이터를 입력스트림이라고 한다.

스트림(stream)은 byte의 흐름을 추상화한 개념이며 데이터를 byte단위로 다룬다.

 

 

🔴 스트림이란?

수도꼭지에 비유하면 된다.

수도꼭지를 틀면 물이 나오고 잠그면 물이 나오지 않는다.

A수도꼭지부터 B수도꼭지까지 수도관이 연결되어 있고 A에서 물을 계속 보낸다면 B수도꼭지를 열 때마다 물이 나오게 될 것 이다. 여기서 스트림은 A에서 B로 이동하는 물의 흐름이라고 할 수 있다.

 

파일 데이터 : 파일의 그 시작과 끝이 있는 데이터의 스트림이다.

HTTP 송수신 데이터 : 브라우저가 요청하고 서버가 응답하는 HTTP 형태의 데이터도 스트림이다.

키보드 입력 : 사용자가 키보드로 입력하는 문자, 숫자, 특수문자등은 스트림이다.

 

3byte를 입력했을 때 3byte 모두 읽게 해보자.

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

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

        int a;
        int b;
        int c;

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

        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
    }
}
import java.io.IOException;
import java.io.InputStream;

public class Sample {
    public static void main(String[] args) throws IOException {
        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]);
    }
}

 

  • 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를 사용하기 위해 import 문이 하나 더 추가 되었다.

그리고 InputStreamReader는 객체를 생성할 때 생성자의 입력으로 InputStraem 객체가 필요하다.

InputStreamReader reader = new InputStreamReader(in);

 

이전에는 읽어드릴 값을 byte 배열로 선언했는데 InputStreamReader를 이용하면 다음과 같이 cha배열을 사용할 수 있다.

char[] a = new char[3];

프로그램 실행해 abc를 입력한 후 Enter 키를 눌러 사용자 입력을 전달해보자.

그럼 다음과 같이 문자열 abc가 한꺼번에 출력되는 것을 확인할 수 있다.

 

  • 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);
    }
}

BufferedReader는 객체를 생ㄷ성할 때 생성자의 입력으로 InputStreamReader의 객체가 필요하다.

이제 BufferedReader의 readLine 메서드를 사용하면 입력한 문자열 전부 읽을 수 있게 된다.

 

요약 :

InputStream : byte를 읽는다.

InputStreamReader : character(문자)를 읽는다.

BufferedReader : String(문자열)을 읽는다.

 

  • Scanner

J2SE 5.0부터 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());
    }
}

먼저 java.util.Scanner 클래스를 import 해야한다.

생성자의 입력으로 System.in 객체가 필요한데 이는 콘솔입력인 InputStream이 필요하다는 의미이다.

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

Scanner 클래스에는 토큰 뿐만 아니라 숫자, 문자열 등을 읽어들일 수 있는 여러 메서드들이 있다.

 

Scanner 클래스에 있는 메서드

next: 토큰을 읽어 들일 수 있다.

nextLine: 라인을 읽어 들일 수 있다.

nextInt: 정수를 읽어 들일 수 있다.

 

  • 콘솔 출력

System.out은 PrintStream 클래스의 객체이다.

PrintStream은 콘솔 값을 출력할 때 사용되는 클래스이다.

보통 System.out.println은 콘솔에 문자열을 출력할 때나 디버깅할 때 많이 사용한다.

System.err도 있는데 System.out과 동일한 역할을 한다.

다만 오류메세지를 출력할 때 사용한다.

public class Sample {
    public static void main(String[] args) {
        System.out.println("일반 출력");
        System.err.println("에러 출력");
    }
}