Developer

【はじめてのJava】キーボード入力【いろいろなクラス編】
2021.09.30
Lv1

【はじめてのJava】キーボード入力【いろいろなクラス編】

はじめてのJava

このシリーズでは、初めてJavaやプログラミングを勉強する方向けに、Javaによるプログラミングの基礎を説明していきます。
目標レベルは、Javaの資格試験の一つである「Oracle Certified Java Programmer, Silver」(通称Java Silver)に合格できる程度の知識の習得です。
はじめてJavaやプログラムに触れる方にもできるだけわかりやすい解説を心がけていきます。


目次


Scannerクラス

今記事では、Scannerクラスについて解説していきます。
Scannerクラスを使用することで、プログラム実行時に利用者に対してキーボード入力を要求し、入力された内容を用いてその後の処理を実行するという処理が可能になります。
Scannerクラスを利用する際はjava.util.Scannerをインポートしてソースコードを記述してください。
Scannerクラスをインスタンス化する際は以下のように記述します。

Scanner sc = new Scanner("取り込み元のデータ");

例えば、キーボードからの入力を取り込む場合はSystem.inを指定します。

Scanner sc = new Scanner(System.in);

このようにしてインスタンス化した後にScannerクラスのメソッドを使用してプログラムの処理に利用者からの入力を組み込むことが可能となります。


nextXXX()メソッド

Scannerクラスのメソッドでよく使うものとして、nextXXX()メソッドのようなメソッドが存在します。XXXの部分は基本データ型などが入ります。入力された値をXXXの部分に記述されたデータ型の値として返すメソッドです。
主なものを以下の表にまとめておきます。(詳しくは公式リファレンスを確認してください。)

メソッドの定義 説明
String next() 次のデータをString型として取得します。空白文字が来たらそこで取り込みが終わります。
キーボードの場合は次の入力値をString型として取得します。
byte nextByte() 次のデータをbyte型として取り込みます。
short nextShort() 次のデータをshort型として取り込みます。
int nextInt() 次のデータをint型として取り込みます。
long nextLong() 次のデータをlong型として取り込みます。
float nextFloat() 次のデータをfloat型として取り込みます。
double nextDouble() 次のデータをdouble型として取り込みます。
boolean nextBoolean() 次のデータをboolean型として取り込みます。
String nextLine() 次のデータをString型として取得します。改行文字が来たらそこで取り込みが終わります。next()と違って空白文字については取り込みます。

以下のnextInt()メソッドを使用したサンプルコードについて見てみましょう。

import java.util.Scanner;

public class Sample {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		System.out.println("整数を入力してください。");
		int i = sc.nextInt();

		System.out.println("整数をもう一つ入力してください。");
		int j = sc.nextInt();

		sc.close();

		System.out.println(i + "と" + j + "の和は" + (i + j) + "です。");
	}
}

実行画面①

実行画面②

プログラムを実行すると、nextInt()メソッドを呼び出し時に入力待機状態になります。ここで整数を入力すると、入力した値をその後の処理に組み込んで処理を継続します。
また、ソースコード内で「sc.close()」という記述でclose()メソッドを呼び出しています。このメソッドは、名前の通りScannerを閉じるためのメソッドです。Scannerクラスによる入力処理が終了した時点で、close()メソッドを呼び出してScannerを閉じるようにしましょう。

ただし、System.inを利用したScannerの場合は、 キーボード入力が必要なくなるまではclose()メソッドは使ってはいけません 
System.inとは標準入力(一般的にはキーボード)のことで、System.inに対するScannerをclose()してしまうとプログラムが終了するまで二度とキーボード入力ができなくなります

nextXXX()メソッドを使う時の注意点として、区切り文字というものが存在します。
先程のサンプルコードを実行した際に「111 222」のように半角スペースで区切って整数を入力してみましょう。
すると、実行結果は以下のようになります。

複数の整数を半角スペースで区切って入力すると、図のように本来要求されるはずの2回目の入力が要求されずに、「111と222の和は333です。」という文字列が出力されてしまいます。
nextXXX()メソッドを呼び出して入力を行う場合、半角スペースを区切り文字として入力された値が分割されます。そして、nextXXX()メソッドは複数に分割した値の先頭の値を戻り値として返し、残りの値は保持します。保持された値は次回nextXXX()メソッドが呼び出された際に順次返されます。この保持されている値が、各メソッドの定義に記述されているトークンに当たります。
そして、nextXXX()メソッドは保持されている値が存在しない場合に入力を要求するのです。

また、nextLine()メソッドはこの区切り文字を無視して入力された1行全てを1つの文字列として返します。


hasNextXXX()メソッド

他にも、hasNextXXX()メソッドもよく使われます。こちらもXXXにはデータ型などが入ります。入力された値が、XXX部分のデータ型として扱うことが出来る場合はtrue、それ以外の場合にfalseを返すメソッドです。
主なものを以下にまとめておきます。(詳しくは公式リファレンスを確認してください。)

メソッドの定義 説明
boolean hasNextByte() 次のデータをbyte型として読み込めるかどうか確認します。読み込めるときはtrue、読み込めないときはfalseとなります。(以下の各メソッドも同様)
boolean hasNextShort() 次のデータをshort型として読み込めるかどうか確認します。
boolean hasNextInt() 次のデータをint型として読み込めるかどうか確認します。
boolean hasNextLong() 次のデータをlong型として読み込めるかどうか確認します。
boolean hasNextFloat() 次のデータをfloat型として読み込めるかどうか確認します。
boolean hasNextDouble() 次のデータをdouble型として読み込めるかどうか確認します。
boolean hasNextBoolean() 次のデータをboolean型として読み込めるかどうか確認します。

これらのメソッドは、入力された値の形式をチェックするのに利用できます。
hasNextXXX()メソッドを使って本来入力されるべきデータ型で入力されているかをチェックすることが出来ます。
これらのメソッドを条件分岐に利用して、falseが返ってきた場合は再度正しいデータ型での入力を要求するといった使い方が可能です。
hasNextXXX()メソッドもまた、区切り文字によって複数の値を保持します。
メソッドが呼び出された際、保持されている値が存在する場合はその値をチェックしtrueかfalseを返します。そして、保持されている値が存在しない場合は入力を要求し、入力された値をチェックしてtrueかfalseを返します。


ポイント

Scannerクラスを使用することで、プログラム実行時に値を入力し、入力された値に応じた実行結果を得ることが可能となる。


はじめてのJavaシリーズの目次はこちら