[자바/기본] 콘솔 입출력

콘솔(Console)이란?

- 사용자의 입력을 받거나 사용자에게 문자열을 출력해 주는 역활을 하는 것을 말한다.

콘솔 입력

System.in

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

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

        int a;
        a = in.read();
        System.out.println("a = " + a);
        
        // 입력한 바이트의 출력한 바이트보다 큰 경우, InputStream을 비우기 위한 방법
        System.in.read(new byte[System.in.available()]);
    }
}

- InputStram은 자바의 내장 클래스이며, java.lang 패키지에 속해 있지 않은 자바 내장 클래스의 경우, 필요할 때마다 import해서 사용한다.

- System 이나 String 등의 클래스는 자바 프로그래밍에 필요한 가장 기본적인 클래스가 모여있는 패키지인 java.lang 패키에 속해 있는 클래스로써 별도의 import 과정이 필요 없다.

- System.in은 InputStream의 객체이며, InnputStream의 read 메소드는 1byte 크기의 사용자의 입력을 받아들인다.
  다만, read 메소드로 읽은 1byte의 데이터는 int 자료형으로 저장되며, 0 ~ 255 사이의 정수값으로 아스키코드 값이 저장된다.

- InputStram의 read 메소드가 호출되면 사용자의 입력을 받을 때까지 프로그램은 대기하고 있는다.

- throws IOException는 InputStream으로부터 값을 읽어 들일 때는 IOException라는 예외가 발생할 수 있기 때문에 이를 처리를 해야 하는데 throws로 예외 처리를 뒤로 미루게 하는 것이다.

InputStream

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

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

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

- 길이가 3byte인 배열을 만든 후 read 메서드의 입력값으로 전달하면 콘솔 입력이 해당 배열에 저장된다.

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 = " + a);
        
        // 입력한 바이트의 출력한 바이트보다 큰 경우, InputStream을 비우기 위한 방법
        System.in.read(new byte[System.in.available()]);
    }
}

- InputStream이 byte 단위로 하나의 문자만 입력 스트립에서 읽는 것과 달리 InputStreamReader를 사용하면 문자열로 입력 받을 수 있다.

- InputStreamReader를 사용하기 위해 import 문이 하나 더 추가하여야 하고, InputStreamReader는 객체를 생성할 때 생성자의 입력으로 InputStream 객체가 필요하다.

- InputStreamReader를 이용하면 byte 배열이 아닌 char 배열을 사용하여 입력 값을 담을 수 있다.

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 = " + a);
        
        // 입력한 바이트의 출력한 바이트보다 큰 경우, InputStream을 비우기 위한 방법
        System.in.read(new byte[System.in.available()]);
    }
}

- 사용자가 입력한 값을 길이에 상관없이 모두 받아들이고자 할 때 사용한다.

- BufferedReader를 이용하기 위해 import 문이 하나 더 추가하여야 하고, BufferedReader는 객체를 생성할 때 생성자의 입력으로 InputStreamReader의 객체가 필요하다.

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

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 클래스를 이용하면 콘솔 입력을 보다 쉽게 처리할 수 있다.

- Scanner를 사용하기 위해서는 먼저 java.util.Scanner 클래스를 import 해야 한다.
- Scanner 클래스는 생성자의 입력으로 System.in 객체가 필요한 데, 이는 InputStream이 필요하다는 의미이다.

  아래의 도표는 Scanner 클래스에서 토큰 뿐만 아니라 숫자, 문자열 등을 읽어 들일 때 사용되는 주요 메소드 들이다.

메소드 설명
next()   문자를 입력할 때 사용하며 공백은 입력이 불가능하다.
nextLine()   문자와 공백을 포함한 라인을 입력할 때 사용한다.
nextInt()   정수를 입력할 때 사용하며 공백은 입력이 불가능하다.

콘솔 출력

System.out

- PrintStream 클래스의 객체이며, PrintStream은 콘솔에 값을 출력하는 데 사용되는 클래스이다.

- System.out.println()은 콘솔에 문자열을 출력할 때나 디버깅할 때 많이 사용된다.

  아래의 도표는 System.out의 주요 메소드이다.

메소드 설명
println("문자열")   문자열을 출력한 후 다음 출력은 다른 줄에 한다. 문자열이 없는 경우, 다음 줄로 개행을 한다.
print("문자열")   문자열을 출력한 후 다음 출력은 같은 줄에 한다.
printf(...)   문자열을 원하는 형식으로 출력한다.

System.out.printf

printf() 메소드의 출력 형식

System.out.printf('%' + 옵션 + '서식지정자', 값1, ...);

- 옵션 : 출력 값의 필드 폭과 소수점 이하 자릿수 지정

- 서식지정자 : 출력될 데이터 타입 지정

- 서식지정자의 종류

서식 지정자 출력 형태
%d   10진수 정수로 출력
%o   8진수 정수로 출력
%x   16진수 정수로 출력
%f   10진수 실수로 출력
%e   지수  형식으로 실수 출력
%c   문자로 출력
%s   문자열로 출력

예제

import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
    	System.out.println("== 출력 ==");
        System.out.println("Hello");
        System.out.println("World!");
        
        System.out.print("Hello ");
        System.out.print("World!");
        System.out.println();
        
        System.out.printf("Hello ");
        System.out.printf("World!");
        System.out.println();
        
        String str = "자바";
        int grade = 3;
        
        System.out.println(str + "는 언어 선호도 " + grade + "위 입니다.");
        System.out.printf("%s는 언어 선호도 %d위 입니다.\n", str, grade);
        
        System.out.printf("%d\n", 10);
        System.out.printf("%o\n", 10);
        System.out.printf("%x\n", 10);
        
        System.out.printf("%f\n", 5.2f);
        
        System.out.printf("%c\n", 'A');
        System.out.printf("%s\n", "안녕하세요.");
        
        System.out.printf("%-5d\n", 123);
        System.out.printf("%5d\n", 1234);
        System.out.printf("%5d\n", 12345);
        
        System.out.printf("%.2f\n", 1.12645123f);
    }
}

/*
    <<< 출력 예시 >>>
    == 출력 ==
    Hello
    World!
    Hello World!
    Hello World!
    자바는 언어 선호도 3위 입니다.
    자바는 언어 선호도 3위 입니다.
    10
    12
    a
    5.200000
    A
    안녕하세요.
    123  
     1234
    12345
    1.13
*/

⊙ 참고 문헌

  1. 마종현, 「제로베이스 백엔드 취업 파트타임 스쿨 5기:Part 01. Java 기초-Chapter 01. Java 프로그래밍-13-1.입출력_1」, 제로베이스, 2024, https://zero-base.co.kr/
  2. 박응용, 「점프 투 자바:06장 자바의 입출력:06-01 콘솔 입출력」, 위키독스, 2024.07.11, https://wikidocs.net/226
  3. 이병승, 「초보 개발자를 위한 자바:한 권으로 배우는 자바 마스터 가이드 북」, 영진닷컴, 2024, p112 - 117