【Java初心者向け】基本文法のみでタスク管理プログラムを作ってみよう!
こんにちは。開発二部第二課の荒木です。
私は元々プログラミング未経験で入社し、初めはどんな処理があってどんなふうに書くのか知らない状態から学習を始めていました。
プログラミング初学者にはあるある(だと思っている)のですが、学習を進めていると、「一つ一つの処理はわかるし書けるけど、実際どうやってプログラムやシステムの形になるの?」という疑問が出てくるかと思います。
これを解消するには、身の回りにあるようなシステムがどんな処理で成り立っているかを考えてみて、自分で実際に書いて再現してみると少しイメージがつきやすくなります。
今回はJavaを学習し始めた方を対象に、基本的な文法を使って、タスク管理ができるプログラムを組んでみましょう!
完成イメージ
プログラムを実行すると、以下のようにタスクを管理できます。

番号を入力すると……

使用する技術
今回使用するのはJavaの基礎機能だけです。
- クラス
- コンストラクタ
- メソッド
- ArrayList
- while文
- switch文
※フレームワークは使用していないため、興味のある人は調べたり今回のプログラムを改良してみてください!
Taskクラスを作成する
まずはタスクを管理するクラスを作ります。
public class Task {
private String title;
public Task(String title) {
this.title = title;
}
public String getTitle() {
return title;
}
}
タスクは
- タスク名
だけを持つシンプルな設計にしています。
例えば、
Task task = new Task("Javaを勉強する");
のようにタスクを生成できます!
メイン処理を作成する
次にメイン処理を作ります。
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class TodoApp {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
List<Task> tasks = new ArrayList<>();
while (true) {
System.out.println("\n=== タスク管理 ===");
System.out.println("1. タスク追加");
System.out.println("2. タスク一覧表示");
System.out.println("3. 終了");
System.out.print("選択してください:");
int choice = scanner.nextInt();
scanner.nextLine();
switch (choice) {
case 1:
System.out.print("タスク名を入力してください:");
String title = scanner.nextLine();
tasks.add(new Task(title));
System.out.println("追加しました!");
break;
case 2:
System.out.println("\n【タスク一覧】");
if (tasks.isEmpty()) {
System.out.println("タスクはありません");
} else {
for (int i = 0; i < tasks.size(); i++) {
System.out.println(
(i + 1) + ". "
+ tasks.get(i).getTitle()
);
}
}
break;
case 3:
System.out.println("終了します");
scanner.close();
return;
default:
System.out.println("正しい番号を入力してください");
}
}
}
}
プログラム実行 → ユーザーが番号を入力 → 番号によってそれぞれの処理をするという流れです。
「Scanner」はキーボードの入力やファイルのデータ読み込みを簡単に行うためのクラスです。便利!
今回はキーボード入力を使うため import しています。
Scannerでは読み取るデータの種類によっていろいろなメソッドが用意されています。
nextLine():1行まるごと読み取りnextInt():整数の読み取り
※
nextInt()で数字を入力した後の Enter キーの入力が残ってしまうため、そのままnextLine()を呼ぶと空文字が読み込まれてしまいます。そのため、今回は
nextInt()の後にnextLine()を1回実行して改行を消しています。
他にもScannerのメソッドがあるので気になる方は調べてみてください!
配列とArrayList
今回のプログラムではタスクの数を決めていません。
最初からタスクが何件まで増えるかはわからないですよね?
配列の場合は最初にサイズを決める必要があります。
Task[] tasks = new Task[10];
※この場合は10個の要素を入れますよという宣言
一方ArrayListは、要素が入るたびに自動的にサイズが拡張されていくイメージです。
そのため、タスク管理のような用途ではArrayListが便利です。
コードでは List<Task> として宣言していますが、実際に使用しているのはArrayListです。
Listは「リストとして扱う」というルールを表し、ArrayListはそのルールを実装したもの……のようなイメージです。
while文とfor文
Javaのテキストなどを学習していると、序盤の方に必ず繰り返し処理のことが書いてあるかと思います。
今回はwhile文とfor文を使っています。
まず、プログラムのタイトルである「タスク管理」や、タスク追加などの処理の種類を表示するところですが、これは明確に何回繰り返すかわからない処理です。
今回はタスク追加やタスクの一覧を表示させた後、また最初の表示に戻ってくるようにしています。
何回タスクが追加されるか・タスク一覧を出すかはわからないですが、while(true) を使うことで、「終了」を選択するまでメニューを表示し続けるようになります。
(return は main メソッド自体を終了させます。そのため、結果的に while 文も終了します。)
while文の中にswitch文があり、そこでそれぞれの処理へと分岐していきますが、case2のところにfor文が入っています。
case2はタスクの一覧表示です。
「今まで追加されたタスクを全て表示する」処理ということですね。
つまり、tasksリストの要素数分、入っている値を表示していけばいいわけです!
これは繰り返しの回数 = リストの要素数と決まっているのでfor文を使っています。
ちなみにこのfor文はif文の中に入っていますが、これはtasksリストにまだ何も追加されていない場合はタスクなしの表示、何か要素が入っている場合はfor文に進むようになっています。
なぜTaskクラスを別で作るの?
……と思った人がいるかもしれません。
特に文法の学習をし始めた段階だと、別ファイルで作る必要性を感じにくいのではないかと思います。
今回のような小規模のプログラムであれば、1つのファイルにまとめてズラッと全ての処理を書いても問題なく動くかと思います。
しかし、プログラムの規模が大きくなると、役割ごとにクラスを分割した方が管理しやすくなります。
今回の場合、
- Taskクラス:タスクの情報を管理する
- TodoAppクラス:アプリの処理を管理する
というように、それぞれの役割を分けています。
例えば今後、
- 完了状態
- 優先度
- 登録日時
といった要素を追加したくなった場合は、Taskクラスを主に修正すれば対応できるようになるのです。
今回はタスク名しか持っていませんが、今後上記のような機能を追加するとタスクに関する情報が増えていきます。そのため、Taskというクラスにまとめて管理しています。
1ファイルに全部の処理を書いてしまうと、どこかに変更を入れるたびに他の部分と整合性がとれているか確認する必要があります。大規模なプロジェクトだとできそうにありません……。
おそらくミスも出るでしょうし、エラーのもとにもなります。
このように関連するデータや処理をクラスごとにまとめると、コードの見通しが良くなり、機能の追加や削除も簡単になります。
この考え方は「オブジェクト指向」というものに基づくのですが、弊社ブログでもその内容に触れている記事があるのでぜひ見てみてください!
身近にあるプログラムを考えてみる
ここまで作りましたが、今回のプログラムはタスク管理のプログラムとしては問題だらけです。
タスク追加のみで削除ができなかったり、そもそも画面がなくて使いづらかったり、数字を入力するところで文字列を入力するとエラーが出て止まってしまったり……。
また、プログラムを実行するたびに追加した内容が消えてしまいます。
今回は出てきていない他のメソッドを使ったり、Spring Bootやデータベースを使ったりすれば、削除機能や入力画面・一覧画面、追加したデータを保持する仕組みなどを作れるようになります!
まずは、本やネットで見た文法をどうやって組み合わせて形にするのかを今回見てもらいましたが、学習したことが増えれば増えるほど、どんどんできる範囲が広がっていくことが感じられるかと思います。
それこそがプログラミングを学ぶ楽しさに直結しているかと思うので、興味が出た方は先ほど書いた処理のやり方を考えてみてください!
身近にあるプログラムの中身を考えてみることも、プログラミング言語を学ぶことと同じくらい大切ではないかと思っています!