2日目のゴール
2日目のテーマは
「ArrayList を“ただの便利な箱”から、“クラスの中で管理する可変長データ”に格上げすること」 です。
1日目であなたはすでに、
配列は長さ固定
ArrayList は伸び縮みするadd・remove・get・size の基本的な動き
ここまではつかめています。
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));
}
}
}
JavaMain クラス
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日目以降にやる「オブジェクトのリスト」「検索」「条件付き表示」なども、
スッと頭に入ってくるようになります。

