Java入門|標準入力と標準出力

入力と出力の流れがわかると、Javaプログラムはもっと実践的で身近になる

ここまでの学習では、画面に文字や数値を表示したり、キーボードから文字列を入力したりする方法を見てきました。こうした処理は、ひとつひとつ別の操作のように見えるかもしれませんが、実はコンピュータの中では「入力」と「出力」というまとまりで考えられています。そして、その基本になるのが、標準入力と標準出力という考え方です。

標準出力は、ふつうは画面への出力を表します。これまで何度も使ってきた System.out.println は、まさにその代表的な例です。一方、標準入力は、ふつうはキーボードからの入力を表します。前に学んだ System.in は、この標準入力と結びついています。つまり、画面に表示することも、キーボードから受け取ることも、Javaでは「標準」という仕組みを通して扱っているのです。

この考え方がわかると、これまで別々に見えていた入出力のコードが、ひとつの流れとしてつながって見えてきます。また、キーボードから入力した値は、たとえ数字を打ち込んだとしても、最初は文字列として読み込まれるという点も、とても大切なポイントです。数値として使いたいときには、文字列を数値へ変換する必要があります。

ここでは、標準入力と標準出力とは何か、文字列入力と数値入力の違いは何か、そして入力を扱うときに気をつけたいことは何かを、順番にやさしく整理していきましょう。

標準出力とは何か

標準出力とは、プログラムがデータを外へ出すための基本的な出力先のことです。学習の初期段階では、ふつう画面を意味すると考えて大丈夫です。

これまで使ってきた System.out.println は、文字や数値を画面に表示するための命令でした。この System.out の out は、標準出力と結びついています。つまり、System.out.println を使うと、標準出力に対して内容を送り、それが画面に表示されるのです。

ここで大切なのは、画面に表示しているということを、Javaの仕組みとして見ると「標準出力に出している」と考えられることです。この見方ができるようになると、出力のしくみが少し深く理解できるようになります。

標準入力とは何か

標準入力とは、プログラムがデータを受け取るための基本的な入力元のことです。学習の初期段階では、ふつうキーボードを意味すると考えて大丈夫です。

キーボードからの入力を受けつけるコードでは、System.in という言葉が出てきました。この in が、標準入力と結びついています。つまり、System.in を使うことで、標準入力からデータを受け取る準備をしているわけです。

ここでのポイントは、キーボードから入力しているという操作を、Javaでは標準入力から読み込むという形で扱っていることです。
画面への表示が標準出力、キーボードからの受け取りが標準入力です。この2つを対にして理解しておくと、入出力の全体像がつかみやすくなります。

標準入力と標準出力の関係

標準入力と標準出力は、それぞれ反対向きの役割を持っています。
ひとことでいうと、標準入力は受け取る側、標準出力は送り出す側です。

用語役割ふつう意味するもの
標準入力プログラムが受け取るキーボード
標準出力プログラムが出力する画面

この表のように見ると、プログラムは標準入力からデータを受け取り、標準出力へ結果を出していると考えられます。
たとえば、キーボードで文字を入力し、その内容を画面に表示するプログラムは、まさに標準入力から受け取り、標準出力へ出している例です。

キーボードから入力した内容は最初は文字列として扱われる

ここでとても大切なのが、キーボードから入力した内容は、最初から数値として読まれるわけではないという点です。

たとえば、ユーザーがキーボードで 5 と入力したとします。見た目には数値に見えますが、入力の段階では、これはまず文字列として読み込まれます。つまり、5 という数字そのものではなく、「5」という文字の並びとして受け取られているのです。

この考え方は、これから数値入力を扱うときにとても重要です。
プログラムの中で本当に数値として使いたいなら、受け取った文字列を整数や小数に変換する必要があります。

数値を入力するときに変換が必要な理由

キーボードから入力された内容が最初は文字列として扱われる以上、そのままでは int型や double型の変数に入れられません。

たとえば、int型の変数は整数を入れるための変数です。
けれども、readLine で受け取った内容は String 型の文字列です。
このままでは、型が一致しないため、そのまま int型の変数に入れることはできません。

そのため、文字列を整数に変換する処理が必要になります。
この変換を行うことで、はじめて「文字としての 5」から「数値としての 5」へ変わり、int型の変数に格納できるようになります。

整数を入力するための基本の流れ

整数を入力するプログラムでは、流れとしては次のようになります。

  1. 画面に入力をうながすメッセージを表示する
  2. キーボードから1行の文字列を読み込む
  3. その文字列を整数に変換する
  4. 変換した整数を変数に入れて使う

この流れを押さえておくと、数値入力のコードはかなり理解しやすくなります。
大事なのは、いきなり整数が入るのではなく、いったん文字列として受け取り、そのあとで整数へ変換しているという順番です。

サンプルプログラムで整数入力を見る

ファイル名:Sample5.java

import java.io.*;

class Sample5
{
    public static void main(String[] args) throws IOException
    {
        System.out.println("年齢を整数で入力してください。");  // 入力をうながすメッセージを表示します

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

        String str = br.readLine();  // 入力された文字列をstrに読み込みます

        int age = Integer.parseInt(str);  // 文字列を整数に変換してageに代入します

        System.out.println("入力された年齢は " + age + " 歳です。");  // 変換した整数を表示します
    }
}

実行結果

年齢を整数で入力してください。
20
入力された年齢は 20 歳です。

このプログラムでは、まずキーボードから 20 のような入力を受け取っています。
ただし、その直後はまだ文字列です。
そこで Integer.parseInt(str) を使って、文字列を整数に変換しています。
その結果を int型の変数 age に入れて、最後に表示しています。

Integer.parseInt の役割

数値入力で特に大切なのが、次の文です。

int age = Integer.parseInt(str);

この文は、str に入っている文字列を整数に変換し、その結果を int型の変数 age に代入するという意味です。

ここでの parseInt は、文字列を整数として読み取りなおすためのしくみです。
たとえば str の中に 20 という文字列が入っていれば、それを整数の 20 に変換してくれます。

この文を分解して見ると、次のようになります。

部分役割
str入力された文字列
Integer.parseInt(str)文字列を整数に変換する
int age = ...変換した整数を age に入れる

このように見ると、入力された文字列をそのまま使っているのではなく、整数として使える形に変えてから利用していることがわかります。

double型に変換したいとき

整数ではなく、小数を含む数値として扱いたいときは、double型へ変換する方法を使います。
その場合は、次のように書きます。

double num = Double.parseDouble(str);

この文は、str に入っている文字列を double型の数値に変換して、num に代入するという意味です。

つまり、整数なら Integer.parseInt、double型なら Double.parseDouble を使う、という形です。
今の段階では、この対応関係を手順として押さえておけば十分です。

変換後の型書き方
intInteger.parseInt(str)
doubleDouble.parseDouble(str)

図でイメージする整数への変換

この図では、キーボードから入力した 5 が、そのまま整数として入るのではなく、いったん変換の処理を通ってから int型の変数に入ることを表しています。

ここで見ておきたいのは、見た目が数字でも、入力直後は文字列であり、数値として使うには変換が必要だということです。この考え方を押さえておくと、数値入力のコードがぐっと理解しやすくなります。

入力をまちがえるとどうなるか

数値を入力するプログラムでは、ユーザーが正しい形式で入力してくれるとは限りません。
ここが実際のプログラム作りでとても大事な視点です。

たとえば、整数を入力してほしい場面で、小数や文字を入力してしまうことがあります。
その場合、プログラムは期待どおりに動かず、正しい表示ができなかったり、エラーになったりすることがあります。

これは、Integer.parseInt が整数として読める文字列を前提にしているからです。
整数として解釈できない内容が入ってくると、うまく変換できません。

ユーザーの入力ミスを考えることが大切

学習のはじめのうちは、まず基本の流れを理解することが大切なので、入力された内容が正しい前提で考えても大丈夫です。
けれども、実際のプログラムでは、ユーザーがいつも正しく入力してくれるとは限りません。

そのため、本格的なプログラムでは、まちがった入力があったときにどう対応するかを考える必要があります。
たとえば、もう一度入力をうながす、エラーメッセージを出す、処理を中止するなど、さまざまな工夫が必要になります。

今の段階では、入力ミスが起こる可能性を意識しておくことが大切です。
エラー処理の詳しい方法はあとで学ぶとしても、入力にはまちがいが起こりうるという視点は、早いうちから持っておくととても役立ちます。

標準入力と標準出力で見える入出力の流れ

ここまでの内容を、標準入力と標準出力の視点で整理すると、プログラムの流れがとてもきれいに見えてきます。

流れ内容
標準出力画面にメッセージを表示する
標準入力キーボードから文字列を受け取る
変換必要に応じて文字列を数値に変える
標準出力結果を画面に表示する

このように、プログラムは入力を受け取り、それを必要に応じて加工し、最後に出力するという流れで動いています。
標準入力と標準出力は、その入口と出口を表すと考えるとわかりやすいです。

これまで学んだ内容とのつながり

標準入力と標準出力は、新しい言葉に見えるかもしれませんが、これまで学んできた変数や出力の内容としっかりつながっています。

画面に表示するのは標準出力。
キーボードから受け取るのは標準入力。
受け取った内容は変数に入れる。
必要なら型に合わせて変換する。
そして、その値をまた出力に使う。

この流れが見えるようになると、Javaの基本がばらばらの知識ではなく、ひとつのまとまりとして理解できるようになります。
プログラムは、入力を受け取り、処理し、結果を出すものです。標準入力と標準出力は、その基本の形を支えている大切な考え方だといえます。