Java入門|キーボードからの入力

自分で入力した言葉が動き出すと、Javaのプログラムはもっと楽しくなる

これまでの学習では、コードの中にあらかじめ書いておいた文字や数値を画面に表示したり、変数に入れた値を使ったりしてきました。この段階でも、プログラムの基本的な流れは十分に学べますが、さらに一歩進むと、ユーザーがその場で入力した内容を使って処理できるようになります。それが、キーボードからの入力です。

キーボードからの入力ができるようになると、プログラムはただ決まった動きをするだけではなく、使う人の入力に応じて結果が変わるようになります。たとえば、名前を入力して表示したり、好きな言葉を入力して画面に出したりできるようになります。こうなると、プログラムがぐっと身近で実用的なものに感じられてきます。

ただし、キーボードからの入力を受け取るコードは、これまで見てきた出力のコードに比べると少し長めです。そのため、最初は形ごと覚えるような感覚でも大丈夫です。大切なのは、どの部分が入力を受け取っていて、入力された文字列がどの変数に入るのかをつかむことです。

ここでは、キーボードからの入力を受けつけるコードの基本的な形、入力された文字列を変数で受け取る流れ、そしてその値を画面に表示するしくみを、順番にやさしく見ていきましょう。

キーボードからの入力とは何か

キーボードからの入力とは、プログラムを実行しているときに、ユーザーがその場で文字を入力し、その内容をプログラムの中で受け取ることです。

これまでのプログラムでは、表示する文字や数値はコードの中に最初から書かれていました。そのため、実行しても出力内容は基本的に決まっていました。けれども、キーボードからの入力を使うと、プログラムを実行するたびに違う内容を受け取れるようになります。

たとえば、あるときは こんにちは、別のときは おはよう、さらに別のときは Java と入力できます。すると、プログラムはその入力された内容に応じて違う結果を表示できるようになります。

このように、入力機能はプログラムの柔軟さを大きく広げてくれます。プログラムが、書かれた通りに動くだけでなく、使う人とやり取りできるようになるからです。

入力を受け取るコードの基本の形

キーボードから入力を受け取るには、ある程度決まった形のコードを書きます。最初は少し長く感じるかもしれませんが、今の段階では、このような形で書くのだと理解しておけば十分です。

構文 キーボードからの入力

import java.io.*;

class クラス名
{
    public static void main(String[] args) throws IOException
    {
        ...
        BufferedReader br =
        new BufferedReader(new InputStreamReader(System.in));

        String str = br.readLine();
        // 入力された文字列をあらわすstrを利用する
        ...
    }
}

この中で特に大切なのは、次の部分です。

String str = br.readLine();

この1文が実行されると、プログラムはユーザーの入力を待つ状態になります。そこでキーボードから文字を入力して Enter キーを押すと、その1行分の文字列が読み込まれ、str に入ります。

つまり、この文のあとでは、str という変数が、ユーザーが入力した文字列を表すようになります。

import java.io.*; は何をしているのか

コードの先頭には、次のような1文があります。

import java.io.*;

これは、キーボードからの入力に必要な機能を使えるようにするための準備です。

今の段階では、細かい意味を深く追いかけなくても大丈夫です。入力のための仕組みを使うには、この行が必要になる、と覚えておくと十分です。実際、キーボード入力を扱うコードでは、このような準備を書いてから本体の処理を書いていきます。

大切なのは、この行もプログラムの一部であり、入力機能を使うための土台になっているということです。

mainメソッドの後ろの throws IOException について

キーボード入力のコードでは、mainメソッドの部分が少し長くなります。

public static void main(String[] args) throws IOException

ここにある throws IOException も、入力を扱うために必要な記述です。

これも今の段階では、入力処理を行うときに必要なものとして受け止めておけば大丈夫です。入力に関するしくみは後の学習でより詳しく理解できるようになります。ここでは、キーボードから入力を受け取るコードを書くときには、この形になることがある、とつかんでおくのがポイントです。

BufferedReader と InputStreamReader の役割

入力の準備として、次のようなコードが出てきます。

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

この部分は少し長くて難しそうに見えますが、役割としては、キーボードから入力された文字を読み取れるようにする準備をしていると考えるとわかりやすいです。

ここで作られている br は、あとで入力を読み込むために使うものです。
そして、その br を使って、次の readLine で1行分の文字列を受け取ります。

最初はこの1文全体をひとまとまりの形として覚えてしまって構いません。今の段階で大切なのは、ここが入力を受け取る準備の部分だとつかむことです。

入力された文字列を変数に入れる

入力を受け取る流れの中心になるのが、次の文です。

String str = br.readLine();

この文が実行されると、プログラムは入力待ちになります。ユーザーがキーボードから文字を入力して Enter キーを押すと、その内容が1行分の文字列として読み込まれます。

そして、その読み込まれた文字列が str という変数に入ります。
つまり、str は入力された文字列を保存するための変数です。

ここでの str は識別子なので、別の名前をつけてもかまいません。けれども、この例では入力された文字列を表す変数として str を使っています。

このように考えると、キーボード入力も、これまで学んできた変数のしくみとつながっています。違うのは、コードの中に最初から値を書いているのではなく、ユーザーが入力した値が変数に入るという点です。

サンプルプログラムで流れを確認する

ここでは、元の内容をもとにしながら、別のシンプルなプログラム例に置き換えて見ていきます。ファイル名は指定どおり Sample4.java を使います。

ファイル名:Sample4.java

import java.io.*;

class Sample4
{
    public static void main(String[] args) throws IOException
    {
        System.out.println("好きな言葉を入力してください。");  // 入力をうながすメッセージを表示します

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

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

        System.out.println("入力された言葉は " + word + " です。");  // 入力された内容を表示します
    }
}

実行結果

好きな言葉を入力してください。
さくら
入力された言葉は さくら です。

このプログラムでは、まず画面に 好きな言葉を入力してください。 と表示しています。
そのあと、ユーザーの入力を待ちます。
ここで さくら と入力して Enter キーを押すと、その文字列が word に入ります。
最後に、word の値を使って 入力された言葉は さくら です。 と表示しています。

サンプルプログラムの流れを整理する

このプログラムの流れを整理すると、次のようになります。

順番処理の内容役割
1メッセージを表示するユーザーに入力をうながす
2入力の準備をするキーボードから文字を読み込めるようにする
3readLine で入力を受け取る入力された1行の文字列を変数に入れる
4入力された文字列を表示する変数に入った内容を使って出力する

この表を見ると、入力処理は突然難しいことをしているわけではなく、入力を待つ、変数に入れる、表示する、という流れで成り立っていることがわかります。

Enterキーを押すと1行分が読み込まれる

readLine という名前からも少し想像できますが、この処理では1行分の文字列を読み込みます。

つまり、ユーザーがキーボードで文字を入力し、Enter キーを押したところまでがひとまとまりとして扱われます。その内容が1行の文字列として変数に入ります。

ここで大事なのは、Enter キーを押したタイミングで入力が確定することです。入力途中ではまだ変数には入りません。Enter キーが押されてはじめて、その1行が読み込まれる、という流れです。

この動きがわかると、実行中にプログラムが止まっているように見える場面も理解しやすくなります。それは、入力を待っている状態なのです。

入力された値は String 型で受け取る

この入力の例では、受け取った内容を String 型の変数に入れています。

String word = br.readLine();

これは、キーボードから入力された内容が文字列として扱われるからです。
たとえ数字を入力したとしても、この段階では文字列として読み込まれます。

つまり、readLine で受け取った値は、まずは文字の並びとして変数に入ると考えるとわかりやすいです。ここでは、入力された内容をそのまま表示することが目的なので、String 型で受け取る形が自然です。

入力した文字列を出力できる理由

最後の出力部分では、次のように書いています。

System.out.println("入力された言葉は " + word + " です。");

ここでは、文字列である 入力された言葉は と です。 の間に、変数 word を入れています。
すると、word に入っている実際の文字列がそこに組み込まれて表示されます。

このしくみは、これまで学んできた変数の出力と同じです。変数名そのものが表示されるのではなく、その変数に入っている値が表示されます。
そのため、word の中に さくら が入っていれば、画面には さくら が表示されます。

図でイメージするキーボードからの入力

この図では、キーボードから入力した文字列が、変数 word に入れられ、その後で画面に表示される流れを表しています。

ここで見ておきたいのは、入力された内容がそのまま変数に保存され、その変数の値を使って出力しているということです。
キーボード入力も、結局は変数を使って値を受け取り、その値を利用する流れのひとつだとわかります。

キーボード入力でプログラムの自由度が上がる

キーボードからの入力ができるようになると、プログラムの自由度はぐっと高まります。

これまでのように、コードの中に決まった文字列だけを書いて表示する場合は、実行結果も基本的に固定されます。けれども、入力機能があると、ユーザーが何を入力するかによって結果が変わります。
そのため、同じプログラムでも、使うたびに違った動きを見せられるようになります。

これは、プログラムがより実用的になるということでもあります。使う人に応じて結果が変わる仕組みは、多くの実際のソフトウェアにもつながる大切な考え方です。

今の段階では「形と流れ」をつかむことが大切

キーボード入力のコードは、これまでの内容と比べると少し長く、見慣れない部分も多いです。そのため、最初から細かい意味をすべて理解しようとすると、かえって混乱してしまうことがあります。

今の段階では、まず次の3つを押さえておくのが大切です。

押さえたい点内容
入力の準備を書く入力を受け取るための決まった形がある
readLine で読むEnter キーが押されると1行分が読み込まれる
変数に入れて使う入力された文字列を変数で受け取り、出力などに使える

この流れがわかれば、キーボード入力の基本は十分につかめています。
細かな仕組みは、あとから少しずつ理解していけば大丈夫です。

入力も変数の学習の延長線上にある

ここまで学んできた変数の宣言、代入、出力、値の変更と、今回のキーボード入力は別の話のように見えるかもしれません。けれども、実はとても自然につながっています。

入力された文字列は、最終的には変数に入ります。
そして、その変数を使って出力したり、別の処理に利用したりします。
つまり、キーボード入力も、変数を使って値を扱う学習の延長線上にある内容です。

このつながりが見えてくると、Javaの基本が少しずつ一本の流れとして理解しやすくなります。固定の値を扱うところから始まり、変数に入れて使い、さらに外部から入力された値まで扱えるようになる。ここまで来ると、プログラムがただの例文ではなく、実際に動く仕組みとして見えてくるようになります。