Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaのユーザー入力をマスターしよう!Scannerクラス徹底解説ガイド

Javaでユーザー入力を読み取る際に活躍するのがScannerクラスです。Scannerはjava.utilパッケージに標準で組み込まれているため、外部ライブラリを追加でダウンロードする必要はありません。Scannerは標準入力からテキストを読み込み、その内容をプログラムへ返すことで、値の保存や加工を可能にします。

Javaでユーザー入力を取得する方法を理解することは、開発者にとって不可欠なスキルです。例えば、サインインフォームを備えたアプリを開発する場合、ユーザーのログイン情報を受け取るために、入力値を適切に処理しなければなりません。

本記事では、具体的なコード例を交えながら、JavaのScannerクラスを使ってユーザー入力を受け取る方法を詳しく解説します。

Scannerクラスの概要とインポート方法

JavaのScannerクラスは、ユーザー入力を収集するために用意されたクラスです。Scannerはjava.utilパッケージの一部であるため、外部ライブラリを導入することなくすぐに利用できます。Scannerは標準入力からテキストを読み取り、それをプログラムに渡します。

Scannerクラスを使うには、まずコードにインポートする必要があります。インポートの方法は主に2つあります。

  1. Scannerクラスだけが必要な場合:java.util.Scannerを直接インポートします。
  2. java.utilの他のモジュールも併用する場合:ライブラリ全体を一括でインポートすると便利です。
import java.util.Scanner;
import java.util.*;

1行目はScannerクラスのみをインポートする記述です。2行目は、Scannerを含むjava.utilライブラリ内のすべてのパッケージをまとめてインポートします。

なお、Javaでユーザー入力を受け取る方法はScanner以外にもあります。BufferedReaderInputStreamReaderDataInputStreamConsoleクラスなども選択肢の一つです。ただし、最も広く使われているのがScannerクラスのため、本記事ではScannerを中心に解説を進めます。

Javaユーザー入力の基本構文

Scannerクラスは、ユーザーがコンソールに入力したテキストを読み取り、その値をプログラムへ返します。Javaでユーザー入力を収集する際の標準的な手法です。

Scannerクラスをインポートしたら、次のように記述して使い始められます。

Scanner input = new Scanner(System.in);
int number = input.nextInt();

この例では、まずinputという変数を作成し、標準入力(System.in)に接続したScannerオブジェクトを初期化しています。続くnumber変数には、nextInt()メソッド経由でユーザーがコンソールに入力した整数値が格納されます。

実践例:在庫管理プログラムを作ってみよう

ここからは、実際の開発シーンを想定した例を見ていきましょう。ある地域のコンピュータショップ向けに、在庫を管理するアプリケーションを開発しているとします。

店主から「商品を在庫リストに登録できる簡単なプログラムが欲しい」という依頼を受けました。要件は、商品名数量の2つの値を入力できることです。

このプログラムは以下のコードで実装できます。

import java.util.Scanner;

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

    System.out.print("Product name: ");
    String product_name = input.next();
    System.out.print("Value entered: " + product_name);

    System.out.print("Quantity: ");
    int quantity = input.nextInt();
    System.out.print("Value entered: " + quantity);
  }
}

最初に入力を受け付けるのは商品名です。商品名はテキストであり多様な文字が含まれるため、文字列型(String)として定義します(String product_name)。

次の入力は商品の数量です。こちらは数値なので、整数を意味するint型で定義しています(int quantity)。

コードを実行してサンプル値を入力すると、プログラムは次のような出力を返します。

Product name: 15-inch MacBook Pro 2019
Value entered: 15-inch MacBook Pro 2019
Quantity: 7
Value entered: 7

このように、プログラムはユーザーの入力を正しく収集し、コンソールへ入力値を返しています。これにより、プログラムが意図どおりに動作していることを確認できます。

プログラムの処理フローを分解してみる

コードの流れをステップごとに整理すると、以下のようになります。

  1. ユーザー入力を受け取れるよう、Scannerライブラリをインポートします。
  2. プログラム本体を格納するMainクラスを宣言します。
  3. Scanner input = new Scanner(System.in);でScannerを初期化し、input変数に格納します。
  4. 「Product name: 」をコンソールに出力し、input.next()で商品名の入力を促します。
  5. ユーザーが入力した商品名をコンソールに表示します。
  6. 「Quantity: 」を出力し、input.nextInt()で在庫数量の入力を促します。
  7. quantity変数の値をコンソールに表示します。

ポイントは、数値と文字列で異なるメソッドを使っている点です。商品名の取得にはinput.next()を、数量の取得にはinput.nextInt()を使用しています。

Scannerクラスで使える入力メソッド一覧

先ほどの例では、文字列と整数という2種類のデータを収集しました。Scannerクラスでは、データ型ごとに専用のメソッドが用意されています。つまり、boolean型を取得する場合とfloat型を取得する場合では、呼び出すメソッドが異なります。

下の表は、Scannerクラスでユーザー入力を収集するために使える全メソッドの一覧です。

メソッド取得できるデータ型
nextBoolean()boolean
nextByte()byte
nextDouble()double
nextFloat()float
nextInt()int
nextLine()String(1行分)
nextLong()long
nextShort()short

なお、指定したメソッドと異なる型の値を入力すると、プログラムはInputMismatchException(入力不一致例外)を発生させます。例えば、boolean型を受け付けるフィールドにdouble値を入力しようとすると例外がスローされるため、入力値の型には注意が必要です。

boolean値を収集する方法

再びコンピュータショップの例に戻りましょう。最初のプログラムを拡張して、商品が店頭に展示されているか、それとも倉庫に保管されているかを店主が入力できるようにしたいとします。

そこで、on_displayという新しい値を収集することにしました。この値は「true / false」の2択しかないため、boolean型として保存するのが適切です。

コードは以下のようになります。

import java.util.Scanner;

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

    System.out.print("Product name: ");
    String product_name = input.next();
    System.out.print("Value entered: " + product_name);

    System.out.print("Quantity: ");
    int quantity = input.nextInt();
    System.out.print("Value entered: " + quantity);

    System.out.print("On display: ");
    boolean on_display = input.nextBoolean();
    System.out.print("Value entered: " + on_display);
  }
}

コードを実行してサンプル値を入力すると、次のような結果が得られます。

Product name: 15-inch MacBook Pro 2019
Value entered: 15-inch MacBook Pro 2019
Quantity: 7
Value entered: 7
On display: true
Value entered: true

プログラムの基本構造は先ほどの例と同じですが、今回は「入力した商品が店頭に展示されているかどうか」という追加の値を収集している点が異なります。この値の取得にはnextBoolean()メソッドを使用し、取得後にコンソールへ出力しています。

まとめ

JavaのScannerクラスを使えば、ユーザーからの入力を簡単に収集できます。short値、文字列、boolean値など、さまざまなデータ型に対応しているのも大きな魅力です。

本記事では、具体例を通してScannerクラスによるユーザー入力の取得方法を学びました。あわせて、目的に応じた各種メソッド(nextInt、nextLine、nextBooleanなど)の使い分けについても確認しました。ぜひ実際にコードを書きながら、それぞれの挙動を試してみてください。

  1. 【JavaFX入門】2D形状のsmoothプロパティで図形の輪郭を滑らかに描画する方法

    JavaFXのsmoothプロパティは、2D形状を描画する際にアンチエイリアス処理(平滑化ヒント)を使用するかどうかを指定するためのプロパティです。この値を設定するには、javafx.scene.shape.Shapeクラスが提供するsetSmooth()メソッドを使用します。このメソッドはboolean型の値を受け取ります。trueを渡すと図形の輪郭は滑らかに描画され、falseを渡すと輪郭にギザギザ感(ジャギー)が残ります。特に線幅の太いストロークや鋭い角度を持つ図形では、その違いがはっきりと現れます。サンプルコード以下の例では、同じ三角形ポリゴンを2つ作成し、一方にはsetSmooth(

  2. JavaでOpenCVのハフ線変換を実装する方法を徹底解説

    画像から直線を検出したい場合に活躍するのが、OpenCVが提供するハフ線変換(Hough Line Transform)です。ハフ線変換には主に2種類あり、それぞれ用途に応じて使い分けられます。 標準ハフ線変換(Standard Hough Line Transform) 確率的ハフ線変換(Probabilistic Hough Line Transform) 標準ハフ線変換(HoughLinesメソッド) 標準ハフ線変換は、ImgprocクラスのHoughLines()メソッドを使用して適用できます。このメソッドは以下の引数を受け取ります。 元画像と、検出された直線のパラメータ(r、