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

Web APP Java
スポンサーリンク

2日目のゴール

2日目のテーマは
「ArrayList を“ただの便利な箱”から、“クラスの中で管理する可変長データ”に格上げすること」 です。

1日目であなたはすでに、

配列は長さ固定
ArrayList は伸び縮みする
addremovegetsize の基本的な動き

ここまではつかめています。

2日目ではここから一歩進んで、

ArrayList をクラスのフィールドとして持つ
コンストラクタで「空のリスト」を初期化する
メソッドを通して追加・削除・表示を行う

という、「アプリの中での使い方」に踏み込みます。
題材は、小さな「やることリスト(ToDo)アプリ」です。


可変長データを“クラスの中に閉じ込める”という発想

1日目のコードの“もったいなさ”

1日目は、こんな感じで ArrayList を直接 main に書いていました。

import java.util.ArrayList;

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

        todos.add("Java の勉強");
        todos.add("洗濯");
        todos.add("買い物");

        System.out.println("件数: " + todos.size());
        for (int i = 0; i < todos.size(); i++) {
            System.out.println((i + 1) + " : " + todos.get(i));
        }
    }
}
Java

これはこれで動きますが、
ArrayList が「アプリの外側にむき出し」になっています。

本当は、

「やることリスト」という“機能”の中に
「中身(可変長データ)」が隠れていてほしい

このほうが、アプリとして自然です。

そこで出てくるのが、

「ArrayList をクラスのフィールドとして持たせる」

という設計です。


ToDoList クラスを作って、ArrayList を“中にしまう”

クラスのイメージを先に言葉で決める

ToDoList クラスにやってほしいことを、先に日本語で整理します。

やることを追加する
やることを削除する
全部のやることを表示する

この3つをメソッドとして持つクラスを作ります。

フィールドとコンストラクタ

import java.util.ArrayList;

public class ToDoList {
    ArrayList<String> items;

    ToDoList() {
        items = new ArrayList<>();
    }
}
Java

ここで大事なのは2つです。

ArrayList<String> items;
ToDoList は「やることのリスト」を自分の中に持っています。
これが“可変長データをクラスの中に閉じ込める”という形です。

コンストラクタで items = new ArrayList<>();
ToDoList を new した瞬間に、
「中身は空だけど、追加する準備ができた状態」になります。

ArrayList の初期化も、
「コンストラクタでやる」
という感覚をここでしっかり持っておいてください。


メソッドで ArrayList を“安全に操作する”

追加メソッド addItem

void addItem(String text) {
    if (text == null || text.isEmpty()) {
        System.out.println("空のやることは追加しません。");
        return;
    }
    items.add(text);
}
Java

ここでやっていることは、

null や空文字は拒否する
それ以外は items.add(text) で末尾に追加する

つまり、

「ArrayList に何でも入れていいわけではなく、ルールを通してから入れる」

という設計です。

削除メソッド removeItem

void removeItem(int index) {
    if (index < 0 || index >= items.size()) {
        System.out.println("その番号のやることはありません。");
        return;
    }
    items.remove(index);
}
Java

ここでは、

インデックスが 0 未満、または size() 以上なら「範囲外」と判断
その場合はメッセージを出して return
正しい範囲なら items.remove(index) で削除

ArrayList 自体は、範囲外インデックスで例外を投げますが、
メソッド側でチェックしておけば、

「間違った番号を指定しても、アプリが落ちずにメッセージで教えてくれる」

という優しい動きになります。

表示メソッド showAll

void showAll() {
    System.out.println("=== やること一覧 ===");
    if (items.isEmpty()) {
        System.out.println("やることはまだありません。");
        return;
    }
    for (int i = 0; i < items.size(); i++) {
        System.out.println((i + 1) + " : " + items.get(i));
    }
}
Java

ここでは、

isEmpty() で「0件かどうか」をチェック
0件なら「まだありません」と表示して終わり
1件以上あるなら、for で全部表示

size()isEmpty() はセットで覚えておくと便利です。
「今何個あるか」「そもそも0個かどうか」 を簡単に知ることができます。


Main から見たときの“気持ちよさ”を確認する

ToDoList を使う側のコード

さっきの ToDoList を、Main から使ってみます。

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

        list.addItem("Java の勉強をする");
        list.addItem("洗濯をする");
        list.addItem("");

        list.showAll();

        System.out.println("2番目のやることを削除します。");
        list.removeItem(1);

        list.showAll();

        System.out.println("存在しない番号を削除してみる。");
        list.removeItem(10);
    }
}
Java

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

new ToDoList() で「やることリスト」が1つできる
addItem("…") で「やることを追加する」という“意味のある操作”をしている
showAll() で「リストの中身を全部見る」
removeItem(1) で「2番目のやることを消す」

ここには、
「ArrayList」という言葉が一切出てきません。

Main から見えるのは、

やることリスト
やることを追加する
やることを削除する
やることを表示する

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

これが、2日目で一番感じてほしいところです。


可変長データを“外に漏らさない”という設計

ArrayList をむき出しにすると何が起きるか

もし ToDoList をこう書いてしまうとします。

public class ToDoList {
    public ArrayList<String> items = new ArrayList<>();
}
Java

すると、Main からこう書けてしまいます。

ToDoList list = new ToDoList();
list.items.add("やること1");
list.items.add(null);
list.items.clear();
Java

これだと、

null を入れられてしまう
全部消されてしまう
範囲外アクセスで例外を起こされる

など、「やることリストとしてのルール」が守られません。

だからこそ、

ArrayList はクラスの中に隠す(本当は private にするのが理想)
外からはメソッド経由でしか触れないようにする

という設計が大事になります。

今日の段階では、

「ArrayList は“むき出しで触らせる”より、“クラスの中にしまってメソッドで操作させる”ほうが安全」

という感覚を持てていれば十分です。


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

ToDoList クラス全体

import java.util.ArrayList;

public class ToDoList {
    ArrayList<String> items;

    ToDoList() {
        items = new ArrayList<>();
    }

    void addItem(String text) {
        if (text == null || text.isEmpty()) {
            System.out.println("空のやることは追加しません。");
            return;
        }
        items.add(text);
    }

    void removeItem(int index) {
        if (index < 0 || index >= items.size()) {
            System.out.println("その番号のやることはありません。");
            return;
        }
        items.remove(index);
    }

    void showAll() {
        System.out.println("=== やること一覧 ===");
        if (items.isEmpty()) {
            System.out.println("やることはまだありません。");
            return;
        }
        for (int i = 0; i < items.size(); i++) {
            System.out.println((i + 1) + " : " + items.get(i));
        }
    }
}
Java

Main クラス

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

        list.addItem("Java の勉強をする");
        list.addItem("洗濯をする");
        list.addItem("");

        list.showAll();

        System.out.println("2番目のやることを削除します。");
        list.removeItem(1);

        list.showAll();

        System.out.println("存在しない番号を削除してみる。");
        list.removeItem(10);
    }
}
Java

この全体を見て、

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

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


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

今日いちばん大事なのは、
「ArrayList を“クラスの中で管理する可変長データ”として扱う」
という感覚を持てたかどうかです。

ArrayList をクラスのフィールドとして持つ
コンストラクタで「空のリスト」を用意する
メソッドを通して追加・削除・表示を行う
外からは ArrayList を直接触らせない

そしてもう一つ。

「可変長データは、クラスの中に閉じ込めて、ルール付きで扱う」

この感覚が入っていれば、
3日目以降にやる「オブジェクトのリスト」「検索」「条件付き表示」なども、
スッと頭に入ってくるようになります。

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