1. コンソールからの読み取り, System.in
前回までの講義では、画面への出力コマンドを学びました。そのために System.out オブジェクトとそのメソッド print() と println() を使いました。シンプルで便利ですね。
しかしご想像のとおり、出力だけでは不十分です。ほとんどのプログラムの目的はユーザーの役に立つことです。そのため、多くの場合、ユーザーがキーボードからデータを入力できるようにする必要があります。
出力と同様に、入力にも専用のオブジェクト — System.in — があります。ただし残念ながら、期待するほどは便利ではありません。これはキーボードからのデータを読み取れますが、1 文字ずつしか読み取れません。
そこで、System.in と組み合わせて必要な機能を提供してくれる別のクラスを使います。Java には用途ごとに便利なクラスがそろっています。これからそのうちのひとつを見ていきましょう。
2. クラス Scanner
クラス Scanner(完全修飾名 java.util.Scanner)は、コンソール、ファイル、インターネットなど様々なソースからデータを読み取れます。キーボードから読み取りたい場合は、データのソースとして System.in オブジェクトを引数に渡します。あとは Scanner オブジェクトがよしなに処理してくれます。
Scanner を使ってキーボードから読み取るコードはおおよそ次のようになります:
| コード | 説明 |
|---|---|
|
クラス Scanner のオブジェクトを生成する。キーボードから文字列を読み取る。キーボードから数値を読み取る。 |
一見簡単そうですが、本当にそんなに単純でしょうか。
きっと多くの疑問が出てきたはずです。今からそれらに答えていきます。
その前に、クラス Scanner を使った完全なプログラム例を示します:
void main()
{
Scanner console = new Scanner(System.in);
String name = console.nextLine();
int age = console.nextInt();
System.out.println("Name: " + name);
System.out.println("Age: " + age);
}
3. オブジェクト Scanner の作成
最初の疑問は、この行 Scanner console = new Scanner(System.in); は何をしているのか、です。
このような行は戸惑うかもしれませんが、今後もたびたび目にします。ですから、ここで何が書かれているのか説明しておきましょう。
まず、文字列変数を通常どのように作るかを思い出しましょう:
String str = "テキスト";
最初に変数の型(String)、次にその名前(str)、最後に等号の右側に値を書きます。
先ほどの「奇妙な」行も、実はまったく同じです:
Scanner console = new Scanner(System.in);
等号の左側は、Scanner 型の変数 console の宣言です。例えば s や scanner、あるいは keyboard と名付けることもできます。その場合、コードは次のようになります:
Scanner s = new Scanner(System.in);
String name = s.nextLine();
int age = s.nextInt();
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
int age = scanner.nextInt();
Scanner keyboard = new Scanner(System.in);
String name = keyboard.nextLine();
int age = keyboard.nextInt();
これでだいぶ分かりやすくなったと思います。
一方、等号の右側のコードは少し複雑です。つまり new Scanner(System.in); の部分です。しかし、ここにも難しいことはありません。
このコードでは、Java マシンに対して、new というキーワードで Scanner 型の新しいオブジェクトを作成し、そのコンストラクタに、データを取得する元として System.in オブジェクトを渡す、と指示しています。
この行の実行後、Scanner 型の変数 console が用意され、これを使ってプログラムはキーボードからデータを読み取れるようになります。
4. メソッドの呼び出し
上の例では、console という Scanner 型の変数は、Scanner 型のオブジェクトへの参照を内部に保持していました。
変数が参照しているオブジェクトのメソッドを呼び出すには、変数名の後にドットを書き、続けてメソッド名と引数を記述します。一般形は次のとおりです:
peremennaya.metod(parametry);
例:
System.out.println("こんにちは");
System.out.println(1);
引数を渡さない場合は、空のかっこだけを書きます:
peremennaya.metod();
例:
System.out.println();
5. コンソールからのデータ入力
Scanner 型のオブジェクトがあれば、キーボードからの入力はとても簡単です。
キーボードから文字列を読み取るには、次のコマンドを使います:
String str = console.nextLine();
プログラムがこの行に到達すると、一時停止して、ユーザーが入力して Enter キーを押すのを待ちます。その後、ユーザーが入力した内容が変数 str に保存されます。
キーボードから整数を読み取るには、次のコマンドを使います:
int number = console.nextInt();
動作は前のコマンドと同様です。プログラムがこの行に到達すると一時停止し、ユーザーが入力して Enter キーを押すのを待ちます。その後、入力内容が数値に変換され、変数 number に保存されます。
入力が整数に変換できない場合は、エラーが発生してプログラムは終了します。
キーボードから小数(浮動小数点数)を読み取るには、次のコマンドを使います:
double number = console.nextDouble();
このコマンドは nextInt() と全く同じ要領ですが、入力が double に変換可能かどうかを検証します。
キーボードから 2 つの数値を読み取り、その合計を出力するプログラム例:
void main()
{
Scanner console = new Scanner(System.in);
int a = console.nextInt();
int b = console.nextInt();
System.out.println(a + b);
}
注意
ユーザーは 1 行に複数の数値をスペースで区切って入力できます。この状況はクラス Scanner のメソッドで正しく処理されます。ただし、実際にプログラムが値を読み取るのは、ユーザーが Enter を押した後です。
GO TO FULL VERSION