Java初心者向け解説:なぜScanner scanner
を2回書くの?
Javaでプログラムを書いていると、次のようなメソッド宣言を見たことがあるかもしれません。
private static void addTask(List<String> tasks, Scanner scanner)
「なぜ Scanner scanner
を2回も書かなきゃいけないの?」と思ったことはありませんか?
この記事では、この疑問を初心者の方向けに分かりやすく解説します!
メソッドの基本構造を理解しよう
Javaのメソッドは、大きく分けて次の2つの部分から成り立っています。
- メソッド宣言(ヘッダー): メソッドの名前や引数を定義する部分。
- メソッドの処理(ボディ): メソッドが実際に行う処理。
例えば、以下のコードを見てみましょう:
private static void addTask(List<String> tasks, Scanner scanner) {
String task = scanner.nextLine();
tasks.add(task);
System.out.println("タスクを追加しました: " + task);
}
-
メソッド宣言(ヘッダー):
private static void addTask(List<String> tasks, Scanner scanner)
- この部分では、メソッド名を
addTask
とし、引数として必要なデータを2つ(tasks
とscanner
)受け取ることを指定しています。
- この部分では、メソッド名を
-
メソッドの処理(ボディ):
String task = scanner.nextLine(); tasks.add(task);
- 実際に引数から渡されたデータを使って処理を行っています。
なぜList<String> tasks
とScanner scanner
が必要なの?
このメソッドでは、2つの引数を使っています。それぞれの役割は次の通りです。
1. List<String> tasks
タスクリストを管理するための引数です。
-
tasks
は「今のタスクリスト」を指しています。 - このメソッド内でタスクを追加すると、リスト自体が更新されます。
2. Scanner scanner
ユーザーの入力を受け取るための引数です。
- ユーザーが入力した内容(新しいタスク)を取得するために使います。
- 例えば、
scanner.nextLine()
を使って、キーボードからの入力を読み取ります。
なぜ引数を渡す必要があるの?
メソッドは、外部からデータを受け取ることで柔軟に動作します。
もし引数を渡さない場合、メソッド内でデータを使うことができません。
引数なしだとどうなる?
例えば、以下のように引数を使わないコードを書いた場合、tasks
やscanner
が見つからずエラーになります。
private static void addTask() {
String task = scanner.nextLine(); // エラー: scannerが定義されていません
tasks.add(task); // エラー: tasksが定義されていません
}
引数を渡す場合
引数を渡せば、外部で作成したリストやScanner
をメソッド内で利用できます。
List<String> tasks = new ArrayList<>();
Scanner scanner = new Scanner(System.in);
addTask(tasks, scanner); // 引数として渡す
具体的な動き:どこでscanner
を作成している?
次のコードを見てみましょう:
public static void main(String[] args) {
List<String> tasks = new ArrayList<>(); // タスクリストを作成
Scanner scanner = new Scanner(System.in); // Scannerを作成
addTask(tasks, scanner); // リストとScannerを引数として渡す
}
-
main
メソッドで、1つのScanner
オブジェクトを作成しています。 - この
Scanner
をaddTask
メソッドに渡すことで、同じScanner
を共有して使えるようにしています。
効率的な設計をする理由
1. 引数として渡す設計のメリット
- 同じ
Scanner
オブジェクトを他のメソッドでも使い回せるため、メモリ効率が良い。 - 1つのリストや
Scanner
を複数のメソッドで共有できる。
2. 毎回作成する非効率な例
もし毎回Scanner
を作成する設計にした場合、プログラムの効率が下がります。
private static void addTask(List<String> tasks) {
Scanner scanner = new Scanner(System.in); // 毎回新しいScannerを作成
String task = scanner.nextLine();
tasks.add(task);
}
- 毎回
Scanner
を新しく作ると無駄が多く、他のメソッドで共有もできません。
まとめ
private static void addTask(List<String> tasks, Scanner scanner)
のように引数を2つ指定する理由は、必要なデータ(tasks
)とツール(scanner
)をメソッドに渡すためです。
ポイント
-
List<String> tasks
:- タスクを管理するリストを渡すことで、外部のリストを直接操作できる。
-
Scanner scanner
:- 1つの
Scanner
を共有することで、効率的にユーザー入力を処理できる。
- 1つの
これを理解すれば、Javaのメソッド設計がもっと身近に感じられるはずです!
疑問があれば、ぜひコメントで教えてください😊
💡 もっとJavaの基本を知りたい方は、この記事をストックしていただけると嬉しいです!