Java道|Javaの入出力の基本

標準入力はJavaへの入口、標準出力は画面への出口。入出力の流れがわかると、プログラムは使う人とやり取りできるようになる

ここまでのJava学習では、画面に文字や数値を表示する方法、キーボードから文字列を受け取る方法を学んできました。最初はそれぞれ別々の処理に見えるかもしれませんが、Javaの中では大きく入力と出力という流れで考えられます。

出力とは、プログラムから外へ情報を出すことです。学習のはじめでは、画面に文字を表示することだと考えるとわかりやすいです。これまで何度も使ってきた System.out.println は、標準出力へ文字や値を送り、画面に表示するための代表的な書き方です。

一方、入力とは、外からプログラムへ情報を受け取ることです。キーボードから入力された文字列をJavaの中に取り込む処理がこれにあたります。System.in は、標準入力と結びついた入り口として考えられます。

鬼殺隊風にたとえるなら、標準入力は隊士から届く伝令を受け取る入口、標準出力は任務結果を本部の掲示板に出す出口です。隊士がキーボードから合図や数値を伝え、Javaがそれを受け取り、必要なら変換し、最後に画面へ結果を出す。この一連の流れが見えてくると、Javaプログラムはぐっと実践的に感じられます。

ここでは、標準入力と標準出力とは何か、キーボードから入力した内容が最初は文字列として扱われる理由、数値として使うための変換、そして入力ミスに気をつける考え方を、鬼滅の刃風の修行イメージに置き換えながら、やさしく整理していきます。

標準出力とは何か

標準出力とは、プログラムがデータを外へ出すための基本的な出力先のことです。

学習の初期段階では、標準出力は画面のことだと考えるとわかりやすいです。Javaで文字や数値を画面に表示するときに使ってきた System.out.println は、この標準出力へ内容を送っています。

System.out.println("修行を開始します。");

このように書くと、文字列が標準出力へ送られ、画面に表示されます。

鬼殺隊風にたとえるなら、標準出力は本部の掲示板のようなものです。プログラムが伝えたい内容を掲示板に出すことで、使う人がその結果を見られるようになります。

用語役割学習初期のイメージ
標準出力プログラムが情報を外へ出す場所画面
System.out標準出力と結びついたもの掲示板へ送る通路
println内容を表示して改行する処理掲示板に1行出す

ここで大切なのは、画面に表示するという操作を、Javaのしくみとして見ると「標準出力に送っている」と考えられることです。

この見方ができるようになると、System.out.println がただの暗記ではなく、Javaが外へ情報を出すための出口として理解しやすくなります。

標準入力とは何か

標準入力とは、プログラムが外からデータを受け取るための基本的な入力元のことです。

学習の初期段階では、標準入力はキーボードのことだと考えるとわかりやすいです。キーボードから入力された文字列をJavaで受け取るときに出てきた System.in は、この標準入力と結びついています。

new InputStreamReader(System.in)

この中にある System.in は、キーボードから入ってくる情報の入口として使われます。

鬼殺隊風にたとえるなら、標準入力は伝令が入ってくる門です。隊士がキーボードから合言葉や数値を伝えると、その情報が標準入力を通ってプログラムの中へ入ってきます。

用語役割学習初期のイメージ
標準入力プログラムが情報を受け取る場所キーボード
System.in標準入力と結びついたもの伝令が入ってくる門
readLine入力された1行を読み取る処理伝令の言葉を1行分受け取る

標準出力が「外へ出す出口」なら、標準入力は「中へ入れる入口」です。

この2つを対にして考えると、Javaの入出力の全体像がつかみやすくなります。

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

標準入力と標準出力は、プログラムから見た情報の流れを表します。

標準入力は、外からプログラムへデータを入れる入口です。
標準出力は、プログラムから外へデータを出す出口です。

用語役割ふつう意味するもの鬼殺隊風のイメージ
標準入力プログラムが受け取るキーボード伝令が入る門
標準出力プログラムが出力する画面結果を出す掲示板

たとえば、キーボードで数値を入力し、その数値を画面に表示するプログラムは、次のような流れで動いています。

流れ内容
1標準出力で入力をうながす
2標準入力からキーボード入力を受け取る
3入力された値を変数に入れる
4必要に応じて変換する
5標準出力で結果を表示する

鬼殺隊の任務に置き換えると、まず本部が「年齢を報告せよ」と掲示します。次に隊士がキーボードで年齢を伝えます。その内容をJavaが受け取り、必要なら数値に変換し、最後に「入力された年齢は20歳です」と掲示するイメージです。

入力と出力をこのようにひとつの流れで見ると、Javaプログラムが「受け取る」「処理する」「出す」という形で動いていることがわかります。

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

キーボードから入力した内容は、最初から数値として扱われるわけではありません。

ここはとても大切です。

たとえば、キーボードで 5 と入力したとします。見た目には数値に見えます。しかし、readLine で読み込んだ直後は、これは数値の5ではなく、文字列としての5です。

つまり、Javaはまず「キーボードから入力された文字の並び」として受け取ります。

入力した内容入力直後の扱い
5文字列としての5
20文字列としての20
3.14文字列としての3.14
水の型文字列としての水の型

鬼殺隊風にたとえるなら、隊士が「20」と伝令で送ってきても、最初は巻物に 20 という文字として書かれている状態です。そのままでは、年齢や数値として計算に使えるわけではありません。

Javaで本当に数値として使いたい場合は、この文字列を数値へ変換する必要があります。

数値入力では変換が必要になる

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

int型は整数を入れるための型です。
double型は小数を入れるための型です。
しかし、readLine で受け取った値は String型です。

そのため、型が合いません。

受け取った値そのまま数値変数に入れられるか
readLine で受け取った 20Stringそのままでは不可
整数に変換した 20intint型に入れられる
小数に変換した 3.14doubledouble型に入れられる

鬼殺隊の任務で考えると、伝令の巻物に書かれた 20 という文字を、任務記録の数値欄にそのまま貼り付けることはできません。まず「これは整数の20です」と読み替える必要があります。

Javaでは、この読み替えにあたる処理が変換です。

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

整数を入力して使う場合は、いきなり int型の変数に入るわけではありません。

次のような順番で処理します。

順番処理役割
1入力をうながすメッセージを表示する使う人に何を入力するか知らせる
2キーボードから1行の文字列を読み込む入力内容をString型で受け取る
3文字列を整数に変換するint型として扱える形にする
4変換した整数を変数に入れる数値として利用できるようにする
5結果を表示する標準出力へ出す

この流れで大切なのは、入力された内容をいったん文字列として受け取り、そのあとで整数へ変換しているという順番です。

鬼殺隊風に言えば、まず隊士の伝令を巻物に書き取り、その後で「これは年齢の数値だ」と判断し、年齢記録の札へ写すような流れです。

整数入力の流れを確認する

ファイル名: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();

        int age = Integer.parseInt(str);

        System.out.println("入力された隊士の年齢は " + age + " 歳です。");
    }
}

実行結果

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

このプログラムでは、まず画面に入力をうながすメッセージを表示しています。

System.out.println("隊士の年齢を整数で入力してください。");

これは標準出力を使って、使う人に「整数を入力してください」と伝える処理です。

次に、キーボードから入力を受け取る準備をしています。

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

この部分で、標準入力であるキーボードから文字列を読み取れるようにしています。

そのあと、次の文で入力された1行を受け取ります。

String str = br.readLine();

ここで入力された 20 は、まず String型の文字列として str に入ります。

そして、次の文で文字列を整数に変換します。

int age = Integer.parseInt(str);

str に入っている文字列を整数へ変換し、その結果を int型の変数 age に入れています。

最後に、変換後の age を使って画面に表示しています。

System.out.println("入力された隊士の年齢は " + age + " 歳です。");

この流れを表にすると、次のようになります。

順番処理変数の状態
1入力をうながすまだ入力はない
2br.readLine で入力を受け取るstr に文字列として 20 が入る
3Integer.parseInt で変換するage に整数として 20 が入る
4age を表示する20 が数値として使われる

ここで特に大切なのは、str と age の役割が違うことです。

変数役割
strString入力された内容を文字列として受け取る
ageint変換後の整数を入れる

str は入力された文字列を受け取る変数です。age は、整数に変換したあとの値を入れる変数です。この2段階を意識すると、数値入力の流れがとてもわかりやすくなります。

Integer.parseIntの役割

数値入力で重要になるのが、Integer.parseInt です。

int age = Integer.parseInt(str);

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

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

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

たとえば、str に 20 という文字列が入っている場合、Integer.parseInt(str) によって整数の 20 に変換されます。

鬼殺隊風にたとえるなら、str は伝令の巻物、Integer.parseInt は「この巻物の文字を整数として読み直す係」、age は整数として記録する札です。

変換前変換処理変換後
文字列としての20Integer.parseInt(str)整数としての20

ここでのポイントは、入力された文字列をそのまま使っているのではなく、整数として使える形に変えてから利用していることです。

double型に変換したいとき

整数ではなく、小数を含む数値として扱いたい場合は、double型へ変換します。

そのときは、Double.parseDouble を使います。

double num = Double.parseDouble(str);

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

変換したい型書き方用途
intInteger.parseInt(str)整数として使いたい
doubleDouble.parseDouble(str)小数として使いたい

たとえば、3.14 のような小数を入力して計算に使いたい場合は、String型のままではなく、double型へ変換する必要があります。

鬼殺隊風に考えると、整数の任務番号として読むなら Integer.parseInt、小数を含む距離や割合として読むなら Double.parseDouble を使うイメージです。

今の段階では、次の対応を押さえておくと十分です。

入力内容をどう使いたいか使う変換
整数として使いたいInteger.parseInt
小数として使いたいDouble.parseDouble
文字としてそのまま表示したい変換せずString型のまま使う

図:入力された文字列を整数へ変換する流れ

↓クリックすると拡大表示されます。

この図が示していること

この図は、キーボードから入力された 20 が、最初は String型の文字列として受け取られ、そのあと Integer.parseInt によって int型の整数へ変換される流れを示しています。

入力された内容は、見た目が数字でも、readLine で受け取った直後は文字列です。数値として扱うには、変換処理を通す必要があります。

この図から分かること

標準入力から入ってきた値は、そのまま数値変数に入るわけではありません。

String型で受け取る段階と、int型へ変換する段階を分けて考えることが大切です。この違いがわかると、数値入力のコードが読みやすくなります。

図:標準入力と標準出力の全体像

↓クリックすると拡大表示されます。

この図が示していること

この図は、標準入力から値を受け取り、Javaプログラムの中で変数に入れ、必要に応じて変換し、標準出力へ結果を表示する流れを示しています。

キーボードは標準入力、画面は標準出力として考えられます。

この図から分かること

Javaの入出力は、入口と出口の流れで考えると理解しやすくなります。

標準入力から受け取った値は、変数に入り、必要なら型に合わせて変換されます。その後、System.out.println などを使って標準出力へ送られ、画面に表示されます。

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

数値入力では、使う人が必ず正しい形式で入力してくれるとは限りません。

整数を入力してほしい場面で、小数や文字を入力してしまうことがあります。

たとえば、整数として変換したい場面で、次のような入力があると問題になります。

入力内容Integer.parseIntでの扱い
20整数として変換できる
003整数として変換できる
3.14整数としては変換できない
abc整数としては変換できない
二十整数としては変換できない

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

鬼殺隊風にたとえるなら、年齢を数字で報告してほしい場面で、隊士が「若いです」と伝えてきたようなものです。意味はわかりそうでも、Javaが整数として扱うには形式が合っていません。

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

学習のはじめでは、まず正しい入力がされる前提で、基本の流れを理解すれば大丈夫です。

ただし、実際のプログラムでは、使う人がいつも正しく入力してくれるとは限りません。

整数を求めているのに文字を入力する。
小数を求めているのに記号を入力する。
何も入力せずに Enter キーを押す。

こうしたことは、実際のプログラムではよく起こります。

入力ミスの例起こりうる問題
文字を入力する数値へ変換できない
小数を入力する整数変換では扱えない
空欄のままEnterを押す期待した値が得られない
余計な記号を入れる変換できない

本格的なプログラムでは、入力ミスがあったときにどう対応するかを考える必要があります。

たとえば、もう一度入力をうながす、エラーメッセージを表示する、処理を中止するなどの工夫があります。

今の段階では、入力にはまちがいが起こる可能性がある、と意識しておくことが大切です。この視点を早いうちから持っておくと、後で例外処理や入力チェックを学ぶときに理解しやすくなります。

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

標準入力と標準出力の視点で整理すると、Javaプログラムの流れがかなり見えやすくなります。

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

Sample5.javaの流れも、この形にきれいに当てはまります。

処理入出力の見方
入力をうながす文を表示する標準出力
キーボードから入力する標準入力
str に文字列を入れる変数に保存
age に整数を入れる変換後の値を保存
結果を表示する標準出力

鬼殺隊の任務でいえば、掲示板に指示を出し、隊士から報告を受け取り、報告内容を必要な形式に整え、最後に結果を掲示する流れです。

このように考えると、入力と出力は別々の知識ではなく、プログラム全体を動かす一連の流れとして理解できます。

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

標準入力と標準出力は、新しい言葉に見えるかもしれません。

けれども、これまで学んできた内容としっかりつながっています。

これまで学んだ内容入出力とのつながり
画面表示標準出力として考えられる
キーボード入力標準入力として考えられる
変数入力された値や変換後の値を保存する
String型入力直後の文字列を受け取る
int型変換後の整数を保存する
代入読み込んだ値や変換した値を変数に入れる

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

この流れが見えるようになると、Javaの基本がばらばらの知識ではなく、ひとつのまとまりとして理解できるようになります。

Javaプログラムは、入力を受け取り、処理し、結果を出すものです。標準入力と標準出力は、その基本の形を支えている大切な考え方です。