Java | 1 日 90 分 × 7 日アプリ学習 初級編:List を使うアプリ

Web APP Java
スポンサーリンク

3日目のゴール

3日目のテーマは
「ArrayList に“ただの文字列”ではなく、“1件分の情報を持ったオブジェクト”を入れて扱えるようになること」 です。

1日目で「配列 vs ArrayList」、
2日目で「ArrayList をクラスの中に閉じ込める」まで来ました。

3日目では一歩進んで、

  • 1件分の情報をクラスで表現する
  • そのクラスのインスタンスを ArrayList に入れる
  • 「可変長データ=オブジェクトの集まり」として扱う

この感覚を、小さな「タスク管理ミニアプリ」を題材にして固めていきます。


1件分の情報を“クラス”にする感覚

文字列だけでは足りなくなる瞬間

2日目までは、こんな感じで文字列のリストを扱っていました。

ArrayList<String> todos = new ArrayList<>();
todos.add("Java の勉強");
todos.add("洗濯");
todos.add("買い物");
Java

これは「やることのタイトル」だけを管理しています。
でも、現実のタスクにはもっと情報があります。

例えばタスクなら、

  • タイトル
  • 期限(締め切り)
  • 優先度

こういう情報をまとめて扱いたくなった瞬間、
「String だけでは足りないな」という感覚が出てきます。

そこで登場するのが、

「1件分をクラスで表現し、そのクラスのインスタンスを ArrayList に入れる」
というパターンです。


Task クラスで「1つのタスク」を表現する

Task クラスの定義

まずは「1つのタスク」を表すクラスを作ります。

public class Task {
    String title;
    String deadline;
    int priority;

    Task(String title, String deadline, int priority) {
        if (title == null || title.isEmpty()) {
            throw new IllegalArgumentException("タイトルは必須です。");
        }
        if (deadline == null || deadline.isEmpty()) {
            throw new IllegalArgumentException("期限は必須です。");
        }
        if (priority < 1 || priority > 3) {
            System.out.println("優先度が範囲外なので 3(低) にします。");
            this.priority = 3;
        } else {
            this.priority = priority;
        }
        this.title = title;
        this.deadline = deadline;
    }

    void show() {
        System.out.println("タイトル: " + title + " / 期限: " + deadline + " / 優先度: " + priority);
    }
}
Java

ここでやっていることを、丁寧に言葉にしてみます。

タイトル・期限・優先度という「1件分の情報」を1つのまとまりとして持っている
コンストラクタで「必須情報」を受け取り、変な値をチェックしている
show メソッドで「1件分の自己紹介」ができるようにしている

この時点では、まだ ArrayList は出てきていません。
でも、「1つのタスクをちゃんと表現できる型」 ができました。


Task を ArrayList に詰めていく

ArrayList<Task> の基本形

次に、Task を入れる ArrayList を作ります。

import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        ArrayList<Task> tasks = new ArrayList<>();

        tasks.add(new Task("Java の勉強", "2026-05-30", 1));
        tasks.add(new Task("買い物に行く", "2026-05-25", 2));
        tasks.add(new Task("ランニング", "2026-05-24", 3));

        System.out.println("タスク数: " + tasks.size());

        Task first = tasks.get(0);
        first.show();
    }
}
Java

ここでのポイントをかみ砕きます。

ArrayList<Task>
これは「Task 型のオブジェクトを入れるリスト」という意味です。
1日目の ArrayList<String> と同じで、
<Task> は「このリストの中身の型」を表しています。

tasks.add(new Task(...))
new Task(...) で「1件分のタスク」を作り、
それを add でリストに追加しています。

Task first = tasks.get(0);
get(0) で「0番目のタスク」を取り出し、
それを変数 first に入れています。

ここで大事なのは、

「ArrayList の中身は、ただの文字列ではなく“Task オブジェクト”になっている」
ということです。


タスクのリストを“クラスの中に閉じ込める”

TaskList クラスのイメージ

2日目でやったように、
ArrayList をむき出しで main に置くのではなく、
「タスクのリストを管理するクラス」を作ってみます。

やりたいことを日本語で整理すると、

タスクを追加する
タスクを一覧表示する
期限や優先度で絞り込む(今日は簡単なものだけ)

これをクラスにします。

TaskList クラスの定義

import java.util.ArrayList;

public class TaskList {
    ArrayList<Task> tasks;

    TaskList() {
        tasks = new ArrayList<>();
    }

    void add(Task task) {
        if (task == null) {
            System.out.println("null のタスクは追加できません。");
            return;
        }
        tasks.add(task);
    }

    void showAll() {
        System.out.println("=== タスク一覧 ===");
        if (tasks.isEmpty()) {
            System.out.println("タスクはまだありません。");
            return;
        }
        for (int i = 0; i < tasks.size(); i++) {
            System.out.print((i + 1) + "件目: ");
            tasks.get(i).show();
        }
    }

    void showHighPriority() {
        System.out.println("=== 優先度1(高)のタスク ===");
        boolean found = false;
        for (Task t : tasks) {
            if (t.priority == 1) {
                t.show();
                found = true;
            }
        }
        if (!found) {
            System.out.println("該当するタスクはありません。");
        }
    }
}
Java

ここで新しく出てきたポイントを深掘りします。

ArrayList<Task> をフィールドに持つ

ArrayList<Task> tasks;
Java

TaskList は、「タスクのリスト」を自分の中に持っています。
中身は Task オブジェクトです。

コンストラクタで「空のリスト」を用意する

TaskList() {
    tasks = new ArrayList<>();
}
Java

TaskList を new した瞬間に、
「タスクはまだないけれど、登録する準備はできている」状態になります。

メソッドで“意味のある操作”を提供する

add(Task task)
「タスクを1件追加する」という操作
null を防いでから tasks.add(task) している

showAll()
「全タスクを表示する」という操作
0件なら「まだありません」と表示する

showHighPriority()
「優先度1のタスクだけを表示する」という操作
ここで初めて、“条件で絞り込む”という要素が入ってきます

ここで感じてほしいのは、

「ArrayList を直接触るのではなく、“タスクリストとしての操作”をメソッドで表現している」
ということです。


Main から見たときの“アプリっぽさ”

TaskList を使う側のコード

さっきの Task と TaskList を、Main から使ってみます。

public class Main {
    public static void main(String[] args) {
        TaskList list = new TaskList();

        list.add(new Task("Java の勉強", "2026-05-30", 1));
        list.add(new Task("買い物に行く", "2026-05-25", 2));
        list.add(new Task("ランニング", "2026-05-24", 3));

        list.showAll();

        System.out.println("-----");
        list.showHighPriority();
    }
}
Java

このコードを眺めてみてください。

new TaskList() で「タスクリスト」が1つできる
add(new Task(...)) で「タスクを登録する」
showAll() で「全部のタスクを見る」
showHighPriority() で「優先度の高いタスクだけを見る」

Main からは、
「ArrayList」という言葉は一切見えません。

見えているのは、

タスク
タスクリスト
登録する
一覧表示する
条件付きで表示する

という“アプリとしての操作”だけです。

これが、3日目で一番大事な感覚です。


拡張 for 文で「中身をなめる」書き方

for (Task t : tasks) の意味

さっきの showHighPriority では、こんな書き方をしました。

for (Task t : tasks) {
    if (t.priority == 1) {
        t.show();
    }
}
Java

これは「拡張 for 文(for-each)」と呼ばれる書き方で、

「tasks の中身を、先頭から順番に t に取り出していく」

という意味です。

普通の for 文で書くとこうなります。

for (int i = 0; i < tasks.size(); i++) {
    Task t = tasks.get(i);
    if (t.priority == 1) {
        t.show();
    }
}
Java

どちらでも同じ動きですが、
「リストの中身を順番に全部見る」 という目的なら、
拡張 for 文のほうが読みやすいことが多いです。

今日の段階では、

「ArrayList の中身を全部見るときは、for (Task t : tasks) みたいに書ける」

と知っておけば十分です。


3日目のミニアプリ完成形

Task クラス

public class Task {
    String title;
    String deadline;
    int priority;

    Task(String title, String deadline, int priority) {
        if (title == null || title.isEmpty()) {
            throw new IllegalArgumentException("タイトルは必須です。");
        }
        if (deadline == null || deadline.isEmpty()) {
            throw new IllegalArgumentException("期限は必須です。");
        }
        if (priority < 1 || priority > 3) {
            System.out.println("優先度が範囲外なので 3(低) にします。");
            this.priority = 3;
        } else {
            this.priority = priority;
        }
        this.title = title;
        this.deadline = deadline;
    }

    void show() {
        System.out.println("タイトル: " + title + " / 期限: " + deadline + " / 優先度: " + priority);
    }
}
Java

TaskList クラス

import java.util.ArrayList;

public class TaskList {
    ArrayList<Task> tasks;

    TaskList() {
        tasks = new ArrayList<>();
    }

    void add(Task task) {
        if (task == null) {
            System.out.println("null のタスクは追加できません。");
            return;
        }
        tasks.add(task);
    }

    void showAll() {
        System.out.println("=== タスク一覧 ===");
        if (tasks.isEmpty()) {
            System.out.println("タスクはまだありません。");
            return;
        }
        for (int i = 0; i < tasks.size(); i++) {
            System.out.print((i + 1) + "件目: ");
            tasks.get(i).show();
        }
    }

    void showHighPriority() {
        System.out.println("=== 優先度1(高)のタスク ===");
        boolean found = false;
        for (Task t : tasks) {
            if (t.priority == 1) {
                t.show();
                found = true;
            }
        }
        if (!found) {
            System.out.println("該当するタスクはありません。");
        }
    }
}
Java

Main クラス

public class Main {
    public static void main(String[] args) {
        TaskList list = new TaskList();

        list.add(new Task("Java の勉強", "2026-05-30", 1));
        list.add(new Task("買い物に行く", "2026-05-25", 2));
        list.add(new Task("ランニング", "2026-05-24", 3));

        list.showAll();

        System.out.println("-----");
        list.showHighPriority();
    }
}
Java

この全体を見て、

「ArrayList はどこにあって、何を入れているか?」
「Main は何を知っていて、何を知らなくていいか?」

を自分の言葉で説明できたら、3日目はかなりいい仕上がりです。


3日目で絶対に押さえてほしい本質

今日いちばん大事なのは、
「ArrayList は“オブジェクトの集まり”を扱うための道具だ」と腹で理解できたかどうか です。

1件分の情報(タスク・生徒・本・商品…)をクラスで表現する
そのクラスのインスタンスを ArrayList に詰めていく
ArrayList 自体はクラスの中に隠し、
外からは「意味のある操作(追加・表示・条件付き表示)」だけをメソッドとして公開する

この感覚が入っていれば、
4日目以降にやる「検索」「更新」「削除」「ソート」なども、
自然に理解できるようになっていきます。

タイトルとURLをコピーしました